2016-11-23 20 views
0

這個問題是關係到Identify unique levels of categorical variable重複的值出現創造標誌

之前,我有一個數據集如下:

clear 
input int(id date) str8 druggroup 
1001 18401 "loop"  
1001 18414 "loop"  
1001 18428 "loop"  
1001 18462 "loop"  
1001 18428 "CCB"  
1001 18462 "arb"  
1002 18401 "arb"  
1002 18473 "arb"  
1002 18414 "thiazide" 
1002 18428 "thiazide" 
1002 18428 "CCB"  
1002 18466 "CCB"  
end 
format %td date 

我想創建一個包含了我有最早日期的新變量每個id使用三個獨立的藥物組的證據。

定義「三證」的規則是我想要再次出現藥物組1的重複證據,並且還要出現藥物組2和3的出現。換句話說,藥物組1顯然會出現一次,在第一行,但我希望它再次發生。藥物組2和3不需要重複發生,但它們都必須發生。

我到目前爲止寫的代碼沒有考慮到第一次出現的藥物在第一次出現後需要再次出現纔算作重複使用的證據。

這裏是我的代碼至今:

bysort id druggroup (date) : gen firstdate = date[1] 
format firstdate %td 
list 
egen group = group(id firstdate druggroup) 
bysort id (group date druggroup): gen count_1 = sum(group != group[_n-1]) 
replace firstdate=date[2] if count_1==1 
list 
by id: gen start_date=firstdate if count_1==3 
format start_date %td 
by id : egen start_d=max(start_date) 
format start_d %td 
list 

這是我真正想要的:

clear 
input int(id date) str8 druggroup float(firstdate group count_1 start_date start_d) 
1001 18401 "loop"  18414 1 1  . 18462 
1001 18414 "loop"  18414 1 1  . 18462 
1001 18428 "CCB"  18428 2 2  . 18462 
1001 18428 "loop"  18414 1 1  . 18462 
1001 18462 "loop"  18414 1 1  . 18462 
1001 18462 "arb"  18462 3 3 18462 18462 
1002 18401 "arb"  18414 4 1  . 18473 
1002 18414 "thiazide" 18414 5 2  . 18473 
1002 18428 "CCB"  18428 6 3  . 18473 
1002 18428 "thiazide" 18414 5 2  . 18473 
1002 18466 "CCB"  18428 6 3  . 18473 
1002 18473 "arb"  18414 4 1 18473 18473 
end 
format %td date 
format %td firstdate 
format %td start_date 
format %td start_d 

回答

0

這裏的解決方案,我覺得很好,因爲它基於素數。但它只適用於每個ID有3種藥物的情況。

bysort id druggroup (date) : gen firstdate = date[1] 
egen group = group(id firstdate druggroup) 
bysort id (group date druggroup): gen count = sum(group != group[_n-1]) 
sort id date 

replace count = 5 if count == 3 
replace count = 3 if count == 2 
replace count = 2 if count == 1 

我們將計算每個日期的累計產品(但第一次約會,因爲你不想算第一次藥物發生)。一旦該產品是2 * 3 * 5,即15的倍數,這意味着已經採取了三種藥物(加上第一個)

bysort id (date) : gen temp_prod = sum(ln(count)) if _n !=1 
by id (date) : replace temp_prod = int(exp(temp_prod)) 
gen temp_mod = mod(temp_prod, 15) 
bysort id (temp_mod) : gen start_date = date if _n == 1 
sort id date 
drop temp* first count 
format %td start_date 
0

我們必須找到每種藥物和每名患者在第一次約會,然後是第一種使用的藥物的第二次日期。如果在第一天分發兩種或更多種藥物,可能會有問題。暗示似乎是,這不會發生。

我不得不說,我通常需要多次嘗試才能完全正確地解決這類問題。

一些這裏使用egen技術中的在http://www.stata-journal.com/sjpdf.html?articlenum=dm0055

clear 
input int(id date) str8 druggroup 
1001 18401 "loop"  
1001 18414 "loop"  
1001 18428 "loop"  
1001 18462 "loop"  
1001 18428 "CCB"  
1001 18462 "arb"  
1002 18401 "arb"  
1002 18473 "arb"  
1002 18414 "thiazide" 
1002 18428 "thiazide" 
1002 18428 "CCB"  
1002 18466 "CCB"  
end 
format %td date 

local d druggroup 
bysort id `d' (date): gen first = date[1] if _n == 1 
bysort id (date `d') : gen counter = sum(first < .) 
bysort id `d' (date) : replace first = first[1] 
bysort id (first date druggroup) : gen date1 = date[2] if `d'[2] == `d'[1] 
by id: egen date2 = min(date/(counter == 2)) 
by id: egen date3 = min(date/(counter == 3)) 
gen when = max(date1, date2, date3) if !missing(date1, date2, date3) 

sort id date 
format first date? when %td 
l id date `d' first when, sepby(id) 

    +-----------------------------------------------------+ 
    | id  date druggr~p  first  when | 
    |-----------------------------------------------------| 
    1. | 1001 19may2010  loop 19may2010 19jul2010 | 
    2. | 1001 01jun2010  loop 19may2010 19jul2010 | 
    3. | 1001 15jun2010  loop 19may2010 19jul2010 | 
    4. | 1001 15jun2010  CCB 15jun2010 19jul2010 | 
    5. | 1001 19jul2010  arb 19jul2010 19jul2010 | 
    6. | 1001 19jul2010  loop 19may2010 19jul2010 | 
    |-----------------------------------------------------| 
    7. | 1002 19may2010  arb 19may2010 30jul2010 | 
    8. | 1002 01jun2010 thiazide 01jun2010 30jul2010 | 
    9. | 1002 15jun2010 thiazide 01jun2010 30jul2010 | 
10. | 1002 15jun2010  CCB 15jun2010 30jul2010 | 
11. | 1002 23jul2010  CCB 15jun2010 30jul2010 | 
12. | 1002 30jul2010  arb 19may2010 30jul2010 | 
    +-----------------------------------------------------+ 

第10節進行說明。

+0

不幸的是有些druggroups做同一天發生。看到我的問題在下面。 – user2363642

+0

答案可以在線程中隨機更改位置並響應投票,因此對「上方」和「下方」的引用的用途有限。在寫這篇文章的時候,我想你是指在你的**答案**的評論中提到一個查詢,當前在這個答案之上。 –

0

我想我已經想出了一個稍微直截了當的方式(總是非常樂意被糾正!)。但是我的方法有一個小故障,我會很樂意幫助。

bysort id druggroup (date) : gen firstdate = date[1] 
format firstdate %td 

egen group2 = group(id firstdate druggroup) 
bysort id (group2 druggroup date): gen count_1 = sum(group2 != group2[_n-1]) 

by id: replace firstdate=date[2] if count_1==1 //be careful of ordering here 

by id : egen s_d=max(firstdate) 
format s_d %td 

問題是GROUP代碼。如果我在同一天有兩個藥物組,那麼組的順序就會越來越糟,因爲stata是按字母順序排列的。我不想要字母順序 - 我希望stata保存我爲排序而安排數據的順序。當我在同一天有兩個藥物組時,是否有辦法告訴組自動停止按字母順序排列?

編輯

我沒有設法弄清楚如何打破平局這裏呢。這是我的解決方法,並不完美,但是處理'egen(group)'自動將它自己的字母順序排列在同一天發生的藥物組上的問題。

在我的解決方法中,我採取了同一日期發生的第二種藥物,並將其日期更改爲日期+1。這使我能夠保持順序,並且似乎仍然達到了正確的結果。

這裏的目標是創建一個新的日期變量;該日期應該是在第一次藥物發生後有3種藥物的證據的最早日期(因此需要第一次發生後再次發生第一次藥物,但是需要發生第二次藥物發生)。

下面的代碼和新的示例數據。

clear 
input int(id date) str8 druggroup byte tag 
1001 18401 "loop"  1 
1001 18414 "loop"  2 
1001 18428 "loop"  2 
1001 18428 "CCB"  2 
1001 18462 "loop"  2 
1001 18462 "arb"  2 
2002 18401 "thiazide" 1 
2002 18401 "arb"  2 
2002 18428 "CCB"  2 
2002 18428 "thiazide" 2 
2002 18466 "CCB"  2 
2002 18473 "arb"  2 
3003 18401 "BB"  1 
3003 18401 "arb"  2 
3003 18428 "BB"  2 
3003 18428 "CCB"  2 
3003 18466 "CCB"  2 
3003 18473 "arb"  2 
end 
format %td date 

*使date_copy變種

gen date_copy= date 
replace date_copy=date+1 if date==date[_n-1] & tag[_n-1]==1 
format date_copy %td 
bysort id druggroup (date_copy) : gen firstdate = date_copy[1] 
format firstdate %td 
list 
sort id date tag 
list 

*獲得團體和新的計數

egen group = group(id firstdate druggroup) 
bysort id (group date druggroup): gen count_1 = sum(group != group[_n-1]) 
list 

by id : replace firstdate=date[2] if count_1==1 
list 

by id : egen s_d=max(firstdate) 
format s_d %td 
list 
+0

你需要定義一個觀測值變量,比如'gen long obsno = _n',並用它來控制關係如何被破壞。 –

+0

在這裏解釋? http://www.stata.com/support/faqs/data-management/groups-by-first-occurrence/ – user2363642

+0

在數百個地方解釋!在這種情況下,您不需要上下文,只需要「生成」該變量並使用它。 –