我想按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
的任何建议?
答案 0 :(得分:3)
一种方法可能是:
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,不会纠正关系。
答案 1 :(得分:2)
让我们在这里标记这个问题要求对Stata的默认排名约定进行扭曲。默认情况下,Stata将最低值排名为1,这是统计学中更常见的做法,但此处的问题是要求相反的约定,Stata称之为field
等级。该术语旨在唤起田径运动中的田径事件,例如投掷和跳跃,其中最高或最长的分数排名为1.
以下是一些代码:
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。人们经常会错过rank()
的{{1}}函数可以用表达式来表达,这可能比单个表达式更复杂变量名。
个人注意事项:在1999年为Stata编写一些排名代码时,我很惊讶地发现不同级别的名称的统计或计算文献中没有提示,所以我引入了术语egen
和{{ 1}}到Stata文学。几年过去了,我注意到的唯一另一个术语是“校长排名”,但由于几个完全不同的原因,这似乎不是一个更好的术语。