这个问题可以帮助我解决我发布的另一个尚未解决的问题。基本上我需要调整Stata中的数据集,我想一个程序需要首先在一个矩阵中存储变量的某些值,然后使用另一个变量的值与存储在矩阵中的值进行比较。一个简单的例子如下:
obs id act1 act2 year act1year
1 1 0 1 2000 0
2 1 1 0 2001 2001
3 1 0 1 2004 0
4 2 1 0 2001 2001
5 2 1 0 2002 2002
6 2 0 1 2004 0
代码应该能够通过(id)将act1year
的值与{1}}(在这种情况下为2001)不同于组1保存在矩阵中,然后检查该值是否为观察值其中0
为1,包含在act2
i = 1,3 [年(i):年(i)-2]的范围内,在这种情况下,范围不包含存储的值在矩阵中;因此观察将被取消。对于组obs
2,代码应存储[2001,2002],然后检查范围[year(6):year(6)-2]是否包含存储在矩阵中的任何值。
我希望我的问题足够清楚!抱歉没有发布任何尝试,但这是我真的不知道该怎么做。
答案 0 :(得分:1)
这个问题和前面的讨论对我来说都很难理解,所以让我建议以下作为一个解决方案的起点,该解决方案可以确定(a)act1发生或(b)act2发生的观察结果不超过最近的一次事件发生后2年。
clear
input id act1 act2 year
1 0 1 2000
1 1 0 2001
1 0 1 2004
2 1 0 2001
2 1 0 2002
2 0 1 2004
end
generate a1yr = 0
replace a1yr = year if act1==1
generate act1r = -act1
bysort id (year act1r): replace a1yr=a1yr[_n-1] if a1yr==0 & _n>1
generate tokeep = 0
replace tokeep = 1 if act1==1
replace tokeep = 1 if act2==1 & year-a1yr<=2
list, clean noobs
查看之前的讨论,现在的建议,建议将以下数据替换为上面的代码,然后查看代码是否满足讨论的需要。
input obsno id act1 act2 year
1 1 1 0 2000
2 1 0 1 2001
3 1 0 1 2002
4 1 0 1 2002
5 1 0 1 2003
6 2 1 0 2000
7 2 1 0 2001
8 2 0 1 2002
9 2 0 1 2002
10 2 0 1 2003
end