Stata:用可以抵消的数字识别连续的行

Stata: identify consecutive rows with numbers that can cancel out

我有一个按月列出观察结果的长格式数据集。我想确定变量的连续行是否可以抵消(换句话说,具有相同的绝对值)。如果是这样,我想将两个观察值都更改为零。此外,我想要一个额外的虚拟变量来告诉我是否对该行进行了任何更改。如何构建代码?

例如,

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

这(表面上)符合描述的标准,但如果有其他未明确提及的因素(例如,您是否需要考虑是否Var2"cancels out"?如果Apr20106呢?等等).

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

Edit:正如 Roberto 正确指出的那样,之前的代码(使用 abs())是根据发布的示例编写的,但乘以 -1更稳健并产生相同的结果(对于发布的样本数据)。保留原始变量的建议当然是一个好主意。