【问题标题】:How can I rank observations within groups in Stata?如何在 Stata 中对组内的观察结果进行排名?
【发布时间】:2011-05-18 10:42:55
【问题描述】:

我在 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。

你能告诉我解决这个问题的方法吗?

【问题讨论】:

    标签: stata


    【解决方案1】:

    以下对我有用:

    bysort group_id: egen desired_rank=rank(var_to_rank)
    

    【讨论】:

    • 谢谢 chl。我也试过了。但是,是否有可能获得 1、2、3 排名而不是 1、2.5、4?
    • @radek 当然:bysort group_id: egen desired_rank=rank(var_to_rank), unique 将为第 2 组提供1 2 3 4,将unique 替换为track 将为您提供1 2 2 4
    • 正如你所说,“唯一”选项给了我“1,2,3,4”,而我的目标是拥有“1,2,2,3”。
    • @radek egen desired_rank=group(var_to_rank) 会产生您想要的东西吗? (但我不会称这个排名。)
    • 确实如此。但是,它仅适用于整个数据集,因为我不能将它与 bysort 一起使用:/
    【解决方案2】:

    为了更好地理解,我想说这个问题的提出方式是错误的。目的是对观察结果进行分组,那些具有最低值的都被分配为 1 级,次低的被分配到 2 级,依此类推。在我所看到的讨论中,这并不是大多数意义上的排名,但 Stata 的egen, rank() 确实让您参与其中。

    但是,在此线程 (start here) 的其他地方引用的 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线程表明,当被问到类似问题时,我也没有想到这个解决方案。

    【讨论】:

    • 非常感谢。优秀的oneliner。我也不确定问题的确切标题,但由于顺序在这里很重要,因此决定使用“排名”来对抗“组”。如果您有更好的建议,请随时调整问题和/或标题。
    【解决方案3】:

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

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

    似乎解决了这个问题。

    【讨论】:

      【解决方案4】:

      @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
      

      【讨论】:

      • 谢谢。没想到这样用egen group
      【解决方案5】:

      工作量太大了。轻松优雅。试试这个。

      gen desired_rank=int(var_to_rank/10)

      【讨论】:

      • 当然,这适用于给出的简单数值示例,但它显然不是一般的解决方案,所以这没有抓住重点。
      • (事实上,对于给出的示例,int() 是多余的。)
      【解决方案6】:

      试试这个命令,它非常适合我:egen newid=group(oldid)

      【讨论】:

      • 当然,这适用于给出的简单数值示例,但它不是一般的解决方案,所以这没有抓住重点。例如,将第一个值更改为 5,然后第二组的第一个排名将不再是 1。问题是在 个组内排名。
      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多