本文介绍了根据变量的过去值对统计数据集进行条件调整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在对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。请注意,这两个操作并不是相互排斥的,它们可以在同一年内多次执行,因此查看过去的两个观察结果并不一定意味着查看过去的两年。

我不能通过代码实现的解决方案是:第1代操作1年=操作1*年然后通过(Id)存储Act1Year的值,当它们在某个地方不同于0时(我无法实现这一点)如果Action1=1或Action2[_n]=1并且范围Year[_n]到Year[_n]-2包含先前存储的变量中的至少一个值,则按(Id)Keep。

我知道我的建议可能不是最简单的方法,但我仍然无法实现它,不幸的是,我无法找到帮助我做到这一点的代码。希望你能帮我。谢谢

Francesco

推荐答案

以下假设某些事情。

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),并且真正尊重时间变量。在这里,我将使用前两个观察结果。这可能与前两个时间点重合,也可能不重合。

我认为您的两个操作是相互排斥的,但您没有明确表示。

这篇关于根据变量的过去值对统计数据集进行条件调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 18:08