存储变量的值并重用它们
Store values from a variable and reuse them
这个问题可以帮助我解决我发布的另一个尚未解决的问题。基本上我需要在 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)在矩阵中保存第 1 组的 act1year
不同于 0
(在本例中为 2001)的值,然后检查该值是否,对于 act2
为 1 的观测值,包含在 obs
i=1,3 [year(i) : year(i)-2] 的范围内,在这种情况下,范围不包含存储在矩阵中的值;因此,该意见将被取消。对于组 id
2,代码应存储 [2001, 2002],然后检查范围 [year(6):year(6)-2] 是否包含存储在矩阵中的任何值。
希望我的问题够清楚!抱歉没有发布任何尝试,但这是我真的不知道该怎么做的事情。
这个问题和之前的讨论对我来说都很难理解,所以让我建议将以下内容作为解决方案的起点,该解决方案可以识别 (a) act1 发生或 (b) act2 不发生的观察结果在最近的 act1 发生后超过 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
这个问题可以帮助我解决我发布的另一个尚未解决的问题。基本上我需要在 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)在矩阵中保存第 1 组的 act1year
不同于 0
(在本例中为 2001)的值,然后检查该值是否,对于 act2
为 1 的观测值,包含在 obs
i=1,3 [year(i) : year(i)-2] 的范围内,在这种情况下,范围不包含存储在矩阵中的值;因此,该意见将被取消。对于组 id
2,代码应存储 [2001, 2002],然后检查范围 [year(6):year(6)-2] 是否包含存储在矩阵中的任何值。
希望我的问题够清楚!抱歉没有发布任何尝试,但这是我真的不知道该怎么做的事情。
这个问题和之前的讨论对我来说都很难理解,所以让我建议将以下内容作为解决方案的起点,该解决方案可以识别 (a) act1 发生或 (b) act2 不发生的观察结果在最近的 act1 发生后超过 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