调整过去变量值的Stata数据集

时间:2015-07-15 17:09:45

标签: stata

我在调整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包含先前存储的变量中的至少一个值。

我知道可能我的建议不是最简单的方法,但我仍然无法实现它,遗憾的是我无法找到帮助我这样做的代码。希望您能够帮助我。感谢

弗朗西斯

1 个答案:

答案 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 tsvarlisthelp xtset)并真正尊重时间变量。在这里,我使用前两个观察。这可能与前两个时间点一致,也可能不一致。

我认为你的两个行为是相互排斥的,但你并不明确。