如何在Stata中对组内的观察进行排名?

rad*_*dek 4 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
Run Code Online (Sandbox Code Playgroud)

我想根据一个变量(var_to_rank)在组(group_id)中创建每个观察的等级.通常,为此我用过:

gen id = _n
Run Code Online (Sandbox Code Playgroud)

但是我的一些观察结果(在我的小例子中group_id = 2)具有相同的排名变量值,这种方法不起作用.

我也试过用:

egen rank
Run Code Online (Sandbox Code Playgroud)

具有不同选项的命令,但不能使我的等级变量看起来像desired_rank.

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

chl*_*chl 7

以下适用于我:

bysort group_id: egen desired_rank=rank(var_to_rank)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @radek当然:`bysort group_id:egen desired_rank = rank(var_to_rank),unique`将为组2提供`1 2 3 4`,用`track`替换`unique`将给你'1 2 2 4`. (2认同)

rad*_*dek 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)
Run Code Online (Sandbox Code Playgroud)

似乎解决了这个问题.


Nic*_*Cox 5

我想说这个问题是为了最好的理解而提出的错误方式。目的是对观察进行分组,具有最低值的那些都被指定为 1,次低的被全部指定为 2,依此类推。这并不是我所讨论过的大多数意义上的排名,但 Stataegen, rank()确实让您参与其中。

但是,在此线程中引用的 Statalist 线程(从此处开始)中提到的直接方式在精神上比引用的任何解决方案更简单:

bysort group_id (var_to_rank): gen desired_rank = sum(var_to_rank != var_to_rank[_n-1]) 
Run Code Online (Sandbox Code Playgroud)

一旦对数据进行排序,var_to_rank那么当值与每个不同值块开头的先前值不同时,值 1 是var_to_rank != var_to_rank[_n-1]; 否则 0 是结果。将这些 1 和 0 相加得到所需的变量。prefix 命令bysort执行所需的排序,并确保这一切都在由 定义的组内单独完成group_id。完全不需要egen(许多只使用 Stata 的人偶尔会觉得奇怪的命令)。

利益声明:引用的 Statalist 线程表明,当被问到类似的问题时,我也没有想到这个解决方案。