2017-02-28 63 views
1

我想标记新的出现agent_type。我用下面的代码来做到这一点:egen标记跳过

clear 
input long patid float(how_many_drugs agent_type eventdate) byte tag4 
01 3 4 14962 1 
01 3 5 14962 1 
01 3 4 14997 0 
01 3 9 14997 0 
01 3 5 15025 0 
01 3 9 15040 1 
01 3 4 15040 0 
01 3 5 15082 0 
end 
format %td eventdate 
label values agent_type drugstypes1 
label def drugstypes1 4 "alpha blocker", modify 
label def drugstypes1 5 "ace_inhib", modify 
label def drugstypes1 9 "loop", modify 
label def drugstypes1 13 "CCB", modify 

egen tag4=tag (patid agent_type_new how_many_drugs) 

的代码工作正常,直到我们到达那里不会产生标签“循环”中第一次出现。而是在第二次出现“循环”时生成标签。

为什么会发生这种情况,我怎样才能使它在第一次出现时生成标签?

在运行标签代码之前,我已确保数据按patid event_date排序。

回答

1

由于这egen功能tag()的原作者,我可以在其原意评论。

这样做的目的不是标记第一次出现。其意图是只标记用户所关注的几个事件中的一个是等价的。

碰巧,只有两种系统的方法来标记等价事件,以标记第一个或最后一个。由于团体可以像一个观察那样小,所以任何规则都必须适用于小团体。对于一个组,选择第一个与选择最后一个相同,但其他情况并非如此。我选择在原始代码中标记第一个字符(早已通过官方Stata),但这是任意的。

那么为什么发生在你身上呢?该功能感觉完全免费重新排序数据暂时,因为看代码会告诉你:

viewsource _gtag.ado 

这是什么是咬。

您想为每个患者标记每种药物类型的每个不同值的首次出现。这是一条底线。我不明白为什么how_many_drugs在您的代码中使用。

clear 
input long patid float(how_many_drugs agent_type eventdate) byte tag4 
01 3 4 14962 1 
01 3 5 14962 1 
01 3 4 14997 0 
01 3 9 14997 0 
01 3 5 15025 0 
01 3 9 15040 1 
01 3 4 15040 0 
01 3 5 15082 0 
end 
format %td eventdate 
label values agent_type drugstypes1 
label def drugstypes1 4 "alpha blocker", modify 
label def drugstypes1 5 "ace_inhib", modify 
label def drugstypes1 9 "loop", modify 
label def drugstypes1 13 "CCB", modify 

bysort patid agent_type (eventdate) : gen first = _n == 1 
+0

谢谢@NickCox。你是对的,“how_many_drugs”是多余的。感谢您解释egen标签背后的工作 – user2363642

+0

请注意,对于'egen'的帮助和手动输入甚至没有提到第一次出现!也许你从经验上观察到,第一次出现的实际情况通常是那些被标记的。从1999年开始的http://www.stata.com/products/stb/journals/stb50.pdf(见第16页)的原始讨论讨论了代码逻辑,如上所述。本文在手册条目中引用,但对理解'egen'不重要。 –

+0

是的,我确实注意到,在大多数情况下,第一次出现被标记 - 然后当我尝试以几种不同的方式运行时,我不能在不同的时间出现不同的标签。第一次出现我的错误。再次感谢您指出我的错误。希望别人也从中学习。 – user2363642

0

我一直在玩这个一会儿,最后放弃了egen tag()。我不明白为什么它不会拿起每AGENT_TYPE所以不是我选择了这个第一次出现:

bys patid agent_type (eventdate): gen n=_n 
sort patid eventdate 
replace n=0 if n!=1 
+0

这相当于我的(较短的)解决方案。 –