塔塔:在使用第二可变

问题描述:

我想通过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,并且不会纠正关系。

+0

谢谢!这像一个魅力。我很惊讶没有必要在'egen group'之前'排序'或'gsort'。这是因为'egen group'还会对它喂食的变量进行排序? – snadhelta 2014-09-26 16:07:19

+0

正确的精神。这里提到的'egen'函数至少会暂时使用它们需要的排序顺序,但否则它们会在数据集找到它时排列数据集的排序顺序。 – 2014-09-26 16:18:47

让我们在这里指出,这个问题要求对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 

该解决方案获得混乱,如果我们要排名只有一些意见使用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。人们经常会错过egenrank()函数可以提供一个表达式,这个表达式可能比单个变量名更简单。个人注意事项:在1999年为Stata编写一些排名代码时,我惊讶地发现在统计或计算文献中没有提及不同类别的名字的提示,所以我在Stata文献中引入了条款fieldtrack 。几年来,我注意到的唯一的其他术语是“校长级别”,但这似乎不是一个更好的术语,因为几个不同的原因。

+0

非常有价值的提示和重要的说明;谢谢。此外,“track”和“field”命名约定清晰简洁。好的发明! – snadhelta 2014-09-26 16:13:31