Stata:使用第二个变量打破变量等级的联系

时间:2014-09-26 02:40:07

标签: stata

我想按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的任何建议?

2 个答案:

答案 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.

@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 

如果我们想使用ifin仅对某些观察进行排名,则此解决方案会变得更加混乱;或者如果缺少值;或者如果有更多的分数要使用。在所有这些情况下,基于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文学。几年过去了,我注意到的唯一另一个术语是“校长排名”,但由于几个完全不同的原因,这似乎不是一个更好的术语。