2016-11-22 178 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