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

は、一部の人々は、1日に複数の測定値を持っている、例えば、私は一日あたり最低の読書を選択する3月31日、1999年にスーを参照してください。

ここで私はいくつかの方法を私のコードです。それは不器用で不器用で、私はもっと簡単なやり方でやりたいことをするための助けを求めています。

*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を参照して、そこで最も低い値を選択して、複数の読み取り値がある場合に1人あたり1行を選ぶのに役立ちます。このコードは以下にありますが、これを行うための簡単な方法が必要ですか?

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

大丈夫です、私はより多くのサスクイントを作るように編集します。待って。 – 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:は観測のグループを定義し、2つの以上の変数のためにそれを行うことができますだけということではなく、一つだけ - とソート順も制御します。そのような考え方に基づいて、egenの約半分が構築されていますが、それを直接使用するのが最も簡単で最善の方法です。

+0

私は完全に山腹を作りました。 egenコマンドを説明してくれてありがとう。 – user2363642

+0

心配する必要はありません.20時間ではなく20分でソリューションを表示するには20年かかります。 http:// www。stata-journal.com/sjpdf.html?articlenum=pr0004 –

+0

非常に記事へのリンクに感謝します。 #romewasn'tbuiltinaday :) – user2363642

2

私は理解している場合:

は最低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* 

に基づく最初の発生を検索し、同じIDと同じ日付

egen temp_group = group(id eventdate) 

の識別子を作成します。コメントで示唆しているように1行に:

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

私と同じ基本的な考え方(upvote!)がありますが、 'group()'によって作成された変数は余計です。 2番目のコマンドを 'bysort id eventdate(sys dia)'と書き換えると、同じ解決策があります。ここでも、 'temp_first'変数は余分です。' by: 'の枠組みの中で最初の観測を'保つ 'ことができます。 –

+0

お手伝いいただきありがとうございます! – user2363642

関連する問題