我有一个长形式的数据集,按月列出观察结果。我想确定变量的连续行是否可以取消(换句话说,具有相同的绝对值)。如果是这样,我想将两个观察值都改为零。另外,我想要一个额外的虚拟变量来告诉我,我是否更改了该行的任何内容。我该如何构建代码?
例如,
Date Var1 Var 2
Jan2010 5 6
Feb2010 6 0
Mar2010 -6 1
在上面的例子中,我想将数据集放在下面
Date Var1 Var 2 Dummy
Jan2010 5 6 0
Feb2010 0 0 1
Mar2010 0 0 1
答案 0 :(得分:0)
这(似乎)符合所描述的标准,但如果还有其他因素未明确提及(例如,您是否需要考虑Var2
是否取消? out“?如果Apr2010
是6
?等),该怎么办。
clear
input str7 Date Var1 Var2
"Jan2010" 5 6
"Feb2010" 6 0
"Mar2010" -6 1
end
gen Dummy = Var1 == Var1[_n+1] * -1 | Var1 == Var1[_n-1] * -1
replace Var1 = 0 if Dummy
replace Var2 = 0 if Dummy
li , noobs
产生
+-------------------------------+
| Date Var1 Var2 Dummy |
|-------------------------------|
| Jan2010 5 6 0 |
| Feb2010 0 0 1 |
| Mar2010 0 0 1 |
+-------------------------------+
或者更准确地说,Dummy
应该根据实际月份而不是观察结果生成:
gen Month = monthly(Date, "MY")
format Month %tm
tsset Month , monthly
gen Dummy = Var1 == Var1[_n+1] * -1 | Var1 == Var1[_n-1] * -1
修改:正如Roberto正确指出的那样,之前的代码(使用abs()
)是根据发布的示例编写的,但乘以-1
更加健壮且收益率更高相同的结果(对于发布的样本数据)。保留原始变量的建议当然是一个好主意。