2016-11-22 134 views
2

此问题与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 

有些人在一天多的读数,如见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 !=. 

****本在哪里,我想帮助**问题

上述方法的问题是,对苏,她的两个重复读数具有相同VAL 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 !=. 
+0

好吧,我会进行编辑,以使更多succint。不挂断。 – user2363642

回答

2

在特定日期患者的最低收缩压很容易定义:您只需对各个观测块进行排序并查找最低值即可。

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

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的大约一半是基于这样的想法,但它可以是最简单和最好直接使用它们。

+0

我完全从那里的一座小山上制造了一座山。感谢此并耐心解释egen命令。 – user2363642

+0

不要担心:有时需要20年的时间才能在20分钟内看到解决方案,而不是20小时。 HTTP:// WWW。stata-journal.com/sjpdf.html?articlenum=pr0004 –

+0

非常感谢链接到文章。 #romewasn'tbuiltinaday :) – user2363642

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 
+2

和我一样的基本概念(upvote!),但由group()创建的变量是多余的。如果您将第二个命令重写为'bysort id eventdate(sys dia)',那么我们有相同的解决方案。同样,'temp_first'变量也是多余的:您可以在''by:'框架内保留第一个观察值。 –

+0

谢谢你在这里帮忙! – user2363642