塔塔:在使用第二可变
我想通过score1
排名在Stata观察,变量的秩打破僵局,而使用score2
打破关系,如下图所示:塔塔:在使用第二可变
score1 score2 desired_rank
____________________________
99 5 1
99 4 2
89 8 3
80 9 4
80 9 4
78 6 6
我使用egen rank
尝试,但找不到一个选项来为tiebreaking指定另一个变量。
我也读过this post,但我一直无法很好地适应我的问题。如何创建desired_rank
?
的一种方法是:
clear
set more off
*----- example data -----
input ///
score1 score2 desired_rank
99 4 2
99 5 1
89 8 3
80 9 4
78 6 6
80 9 4
end
list, sep(0)
*----- what you want -----
egen scoreg = group(score1 score2)
egen myrank = rank(scoreg), field
// check
assert desired_rank == myrank
sort myrank
list, sep(0)
这里的关键是,egen, group()
将根据varlist中的排序顺序分配组数字:score1 score2
。然后使用egen, rank()
,但使用field
选项,该选项将最高值设为1,并且不会纠正关系。
让我们在这里指出,这个问题要求对Stata的默认排名约定进行转换。默认情况下,Stata将最低值设为1,这是统计中比较常见的做法,但这里的问题要求相反的约定,Stata称之为field
等级。该术语旨在唤起田径项目中的场上事件,如投掷和跳跃,其中最高或最长的分数排在第一位。
@Roberto Ferrer的解决方案很好,但让我们从第一原则开始工作。如果我们将观察结果转换为期望的排序顺序,那么所需的排名就是观测值,除非如果一个观察值与先前观察值相同,则使用该排名,这是我们在级联中应用的一个例外。
下面是一些代码:
clear
input score1 score2 desired_rank
99 5 1
99 4 2
89 8 3
80 9 4
80 9 4
78 6 6
end
gsort -score1 -score2
gen Desired_Rank = _n
replace Desired_Rank = Desired_Rank[_n-1] if score1 == score1[_n-1] & score2 == score2[_n-1]
assert desired_rank == Desired_Rank
如果我们想要最低值排名1,排序命令将一直
sort score1 score2
该解决方案获得混乱,如果我们要排名只有一些意见使用if
或in
;或者是否有缺失的值;或者如果有更多的分数被使用。在所有这些情况下,基于egen
的解决方案更清洁。
这是一个很好的一点是要强调一招明显时,它的解释:
egen rank1 = rank(mpg)
egen rank2 = rank(-mpg)
否定一个变量翻转排名顺序轮。 2.71828,3.14159和42的行列是1,2,3; -2.71828,-3.14159,-42的行列是3,2,1。人们经常会错过egen
的rank()
函数可以提供一个表达式,这个表达式可能比单个变量名更简单。个人注意事项:在1999年为Stata编写一些排名代码时,我惊讶地发现在统计或计算文献中没有提及不同类别的名字的提示,所以我在Stata文献中引入了条款field
和track
。几年来,我注意到的唯一的其他术语是“校长级别”,但这似乎不是一个更好的术语,因为几个不同的原因。
非常有价值的提示和重要的说明;谢谢。此外,“track”和“field”命名约定清晰简洁。好的发明! – snadhelta 2014-09-26 16:13:31
谢谢!这像一个魅力。我很惊讶没有必要在'egen group'之前'排序'或'gsort'。这是因为'egen group'还会对它喂食的变量进行排序? – snadhelta 2014-09-26 16:07:19
正确的精神。这里提到的'egen'函数至少会暂时使用它们需要的排序顺序,但否则它们会在数据集找到它时排列数据集的排序顺序。 – 2014-09-26 16:18:47