2016-11-23 61 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

在数百个地方解释!在这种情况下,您不需要上下文,只需要“生成”该变量并使用它。 –