【问题标题】:Select lowest value per group选择每组的最低值
【发布时间】:2016-11-22 14:10:50
【问题描述】:

此问题与Stata: select the minimum of each observation 有关。

我的数据如下:

clear
input str4 id int eventdate byte dia_bp_copy int sys_bp_copy
"pat"  15698 100 140
"pat"  16183  80 120
"pat"  19226  98 155
"pat"  19375  80 130
"sue"  14296  80 120
"sue"  14334  88 127
"sue"  14334  96 158
"sue"  14334  84 136
"sue"  14403  86 124
"sue"  14403  88 134
"sue"  14403  90 156
"sue"  14403  86 134
"sue"  14403  90 124
"sue"  14431  80 120
"sue"  14431  80 140
"sue"  14431  80 130
"sue"  15456  80 130
"sue"  15501  80 120
"sue"  15596  80 120
"mary" 14998  90 154
"mary" 15165  91 179
"mary" 15280  91 156
"mary" 15386  81 154
"mary" 15952  77 133
"mary" 15952  80 144
"mary" 16390  91 159
end

有些人一天有多个读数,例如,见 Sue 于 1999 年 3 月 31 日。我想选择每天最低的读数。

这是我的代码,它可以帮助我。它笨重且笨拙,我正在寻求帮助以更直接的方式完成我想做的事情。

*make flag for repeat observations on same day

sort id eventdate  
by id: gen flag =1 if eventdate==eventdate[_n-1]
by id: gen flag2=1 if eventdate==eventdate[_n+1]
by id: gen flag3 =1 if flag==1 | flag2==1
drop flag flag2

* group repeat observations together

egen group = group(id flag3 eventdate)

* find lowest `sys_bp_copy` value per group

bys group (eventdate flag3): egen low_sys=min(sys_bp_copy)

*remove the observations where the lowest value of `sys_bp`_copy doesn't exist

bys group: gen remove =1 if low_sys!=sys_bp_copy
drop if remove==1 & group !=.

****与此有关的问题以及我需要帮助的地方** **

上述方法的问题在于,对于 Sue,她的两次重复读数具有相同的 sys_bp_copy。所以我上面的方法给她留下了多种解读。

在这种情况下,我想参考dia_sys_copy 并选择那里的最低值,以帮助我在多个读数到位时每人挑选一行。代码如下 - 但必须有更简单的方法来做到这一点?

drop flag3 remove group

sort id eventdate
by id: gen flag =1 if eventdate==eventdate[_n-1]
by id: gen flag2=1 if eventdate==eventdate[_n+1]
by id: gen flag3 =1 if flag==1 | flag2==1

egen group = group(id flag3 eventdate)
bys group (eventdate flag3): egen low_dia=min(dia_bp_copy)

bys group: gen remove =1 if low_dia!=dia_bp_copy
drop if remove==1 & group !=.

【问题讨论】:

  • 好的,我将进行编辑以使其更简洁。等等。

标签: grouping panel stata min


【解决方案1】:

患者在特定日期的最低收缩压很容易定义:您只需排序并查找每个观察块中的最低值。

我们可以通过舒张压的值打破收缩压的联系来完善定义。那是另一种。在这个例子中,这没有什么区别。

clear
input str4 id int eventdate byte dia_bp_copy int sys_bp_copy
"pat"  15698 100 140
"pat"  16183  80 120
"pat"  19226  98 155
"pat"  19375  80 130
"sue"  14296  80 120
"sue"  14334  88 127
"sue"  14334  96 158
"sue"  14334  84 136
"sue"  14403  86 124
"sue"  14403  88 134
"sue"  14403  90 156
"sue"  14403  86 134
"sue"  14403  90 124
"sue"  14431  80 120
"sue"  14431  80 140
"sue"  14431  80 130
"sue"  15456  80 130
"sue"  15501  80 120
"sue"  15596  80 120
"mary" 14998  90 154
"mary" 15165  91 179
"mary" 15280  91 156
"mary" 15386  81 154
"mary" 15952  77 133
"mary" 15952  80 144
"mary" 16390  91 159
end

bysort id eventdate (sys) : gen lowest = sys[1] 

bysort id eventdate (sys dia) : gen lowest_2 = sys[1] 

egen tag = tag(id eventdate) 

count if lowest != lowest_2 

list id event dia sys lowest* if tag, sepby(id) 

     +-----------------------------------------------------------+
     |   id   eventd~e   dia_bp~y   sys_bp~y   lowest   lowest_2 |
     |-----------------------------------------------------------|
  1. | mary      14998         90        154      154        154 |
  2. | mary      15165         91        179      179        179 |
  3. | mary      15280         91        156      156        156 |
  4. | mary      15386         81        154      154        154 |
  5. | mary      15952         77        133      133        133 |
  7. | mary      16390         91        159      159        159 |
     |-----------------------------------------------------------|
  8. |  pat      15698        100        140      140        140 |
  9. |  pat      16183         80        120      120        120 |
 10. |  pat      19226         98        155      155        155 |
 11. |  pat      19375         80        130      130        130 |
     |-----------------------------------------------------------|
 12. |  sue      14296         80        120      120        120 |
 13. |  sue      14334         88        127      127        127 |
 16. |  sue      14403         86        124      124        124 |
 21. |  sue      14431         80        120      120        120 |
 24. |  sue      15456         80        130      130        130 |
 25. |  sue      15501         80        120      120        120 |
 26. |  sue      15596         80        120      120        120 |
     +-----------------------------------------------------------+

egen 非常有用(披露了那里的各种兴趣),但这里的主要思想是 by: 定义了一组观察结果,您可以对两个或多个变量执行此操作,而不仅仅是一个 - 和也控制排序顺序。事实上,大约一半的egen 是基于这样的想法,但直接使用它们可能是最简单和最好的。

【讨论】:

  • 我完全是从那里的鼹鼠丘中造出了一座山。感谢您耐心地解释 egen 命令。
  • 别担心:有时需要 20 年才能在 20 分钟而不是 20 小时内看到解决方案...参见例如stata-journal.com/sjpdf.html?articlenum=pr0004
  • 非常感谢您提供文章链接。 #romewasn'tbuiltinaday :)
【解决方案2】:

如果我明白:

为相同的 id 和相同的日期创建一个标识符

egen temp_group = group(id eventdate)

根据最低的sys_bp_copy 查找第一个匹配项,然后找到最低的dia_bp_copy

bys temp_group (sys_bp_copy dia_bp_copy): gen temp_first = _n
keep if temp_first == 1
drop temp*

或在评论中建议的 1 行:

bys id eventdate (sys_bp_copy dia_bp_copy): keep if _n==1

【讨论】:

  • 与我的基本想法相同(赞成!),但group() 创建的变量是多余的。如果您将第二个命令重写为bysort id eventdate (sys dia),那么我们有相同的解决方案。同样,temp_first 变量是多余的:您可以在by: 的框架内对keep 进行第一次观察。
猜你喜欢
  • 1970-01-01
  • 2019-10-03
  • 2011-05-29
  • 2014-11-13
  • 2021-12-21
  • 2021-10-11
  • 2014-08-24
  • 1970-01-01
  • 2022-11-13
相关资源
最近更新 更多