2011-05-18 159 views
3

我在Stata一些数据看起来像的前两列:我如何将Stata中的观察内容排名?

group_id var_to_rank desired_rank 
____________________________________ 

1   10   1 
1   20   2 
1   30   3 
1   40   4 
2   10   1 
2   20   2 
2   20   2 
2   30   3 

我想根据一个变量(var_to_rank)来创建的组(GROUP_ID)内的每个观察的秩。通常情况下,为了这个目的我用:

gen id = _n 

但是我的一些意见(GROUP_ID = 2在我的小例子)有排名变量的值相同而这种做法是行不通的。

我也尝试使用:使用不同的选项

egen rank 

命令,但不能让我的等级变量做出样子desired_rank。

你能指点我解决这个问题吗?

回答

2

我想说这个问题是造成的为了最好的理解错误的方式。目的是对观察进行分组,其中最低值的分配全部被分配1级,下一个最低分配全部分配2个等等。这并不是我所见过的大多数意义上的排名,但Stata的egen, rank()确实能让你成为其中的一部分。

但是这是在Statalist线程提到上面提到的直接方式,就是在精神上比引述任何解决方案更简单:

bysort group_id (var_to_rank): gen desired_rank = sum(var_to_rank != var_to_rank[_n-1]) 

一旦数据被上var_to_rank排序,然后当值从先前的值不同每个不同值的块的开始值为1是var_to_rank != var_to_rank[_n-1]的结果;否则结果是0。累计这些1和0可得到所需的变量。前缀命令bysort进行所需的排序,并确保这些都是在由group_id定义的组内单独完成的。根本不需要egen(许多只使用Stata的人经常会发现奇怪的命令)。

感兴趣的声明:所引用的Statalist线程表明,当被问到类似的问题时,我也没有把这个解决方案看成一个。

+0

非常感谢。优秀的打字员。我也不确定这个问题的确切标题,但是因为这个命令在这里很重要,所以决定与'组'排在一起。如果您有更好的建议,请随意修改问题和/或标题。 – radek

7

对我来说,以下工作:

bysort group_id: egen desired_rank=rank(var_to_rank) 

enter image description here

+0

由于叶绿素。我也尝试过。然而,有可能获得1,2,3等级而不是1,2,5,4? – radek

+2

@radek当然:'bysort group_id:egen desired_rank = rank(var_to_rank),唯一'会为组2赋予'1 2 3 4',并且用'track'代替'unique'会给你'1 2 2 4'。 – chl

+0

正如你所说的'独特'选项给我'1,2,3,4',我的目标是'1,2,2,3'。 – radek

5

Statalist偶然发现了这样的解决方案:

bysort group_id (var_to_rank) : gen rank = var_to_rank != var_to_rank[_n-1] 
by group_id : replace rank = sum(rank) 

似乎来解决这个问题。

3

@radek:你一定有它在此期间整理出...但是这将是一个简单的(虽然不是很优雅)的解决方案:

bysort group_id: egen desired_rank_HELP =rank(var_to_rank), field 
egen desired_rank  =group(grup_id desired_rank_HELP) 
drop desired_rank_HELP 
+0

谢谢。没有想过如何使用'egen group'。 – radek

0

太多的工作。简单而优雅。试试这个。

根desired_rank = INT(var_to_rank/10)

+2

当然,这适用于给出的简单数值例子,但它显然不是一般的解决方案,所以这忽略了这一点。 –

+1

(实际上,对于给出的例子,int()是多余的)。 –

0

试试这个命令,它为我工作这么好:egen newid=group(oldid)

+1

当然,这适用于给出的简单数值例子,但它通常不是一个解决方案,所以这忽略了一点。例如,将第一个值更改为5,然后第二个组的第一个排名将不再为1.问题是_within_ groups排名。 –