我在调整Stata上的数据集方面存在问题。基本上我想调整数据集中的存在 - 在某一组中 - 对另一个变量的过去值执行特定动作(如变量所示)的观察。所以我想假设我有以下
obs | id | action1 | action2 | 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
对于由'id'标识的每个组,我想仅在执行动作1时执行观察,或者在动作2执行前2年内执行动作1。在这个简化的例子中,只应删除观察4。请注意,这两项行动不是相互排斥的,并且可以在同一年内执行多次,因此查看过去的2次观察并不一定意味着要考虑过去2年。
我无法通过代码实现的解决方案是: gen act1year = action1 * year 然后通过(id)存储act1year的值,当它们与某个地方的0不同时(我无法实现) 然后通过(id)保持if action1 = 1或者action2 [_n] = 1并且范围year [_n]到year [_n] -2包含先前存储的变量中的至少一个值。
我知道可能我的建议不是最简单的方法,但我仍然无法实现它,遗憾的是我无法找到帮助我这样做的代码。希望您能够帮助我。感谢
弗朗西斯
答案 0 :(得分:0)
以下假设某些事情。
clear
set more off
input ///
obs id action1 action2 year
1 1 1 0 2000
2 1 0 1 2001
3 1 0 1 2002
4 1 0 1 2003
5 2 1 0 2000
6 2 0 1 2001
7 2 1 0 2002
8 2 0 1 2003
end
list, sepby(id)
*-----
bysort id (year) : keep if action1 | (action1[_n-1] + action1[_n-2] > 0)
list, sepby(id)
括号之间的内容分别根据不等式是真还是假来评估为1或0。该片段表示在前两次观察中是否采取了行动1。
您需要决定如何处理前两个观察结果,因为它们无法与前两个观察结果进行比较(它们不存在)。在下面的示例中,它们始终保持不变,因为在这种情况下与不存在的观察进行比较意味着添加缺失值,这会导致丢失。在Stata中,失踪被认为是一个非常大的数字。
您还可以使用时间序列运算符(help tsvarlist
,help xtset
)并真正尊重时间变量。在这里,我使用前两个观察。这可能与前两个时间点一致,也可能不一致。
我认为你的两个行为是相互排斥的,但你并不明确。