创建一个包含纵向面板数据中滞后值的变量

Creating a variable that incorporates for lagged values in longitudinal panel data

我有 1000 多户家庭的数据。每个家庭有 31 个数据点。除其他外,该数据包含一个变量,该变量指示家庭是否在某个商店进行了购买。我想创建一个虚拟变量,每当一个家庭进行购买时它给出 1,并在剩余时间段内为该特定家庭保持 1。

例如,

Household ID - Purchase - New variable
1 - 0 - 0
1 - 0 - 0
1 - 0 - 0
1 - 1 - 1
1 - 0 - 1

2 - 0 - 0
2 - 1 - 1
2 - 0 - 1
2 - 1 - 1
2 - 1 - 1

现在我尝试使用以下代码,

//electronics purchase dummy durin the full time series
gen betaal_winkel_ykw_dummy=0
replace betaal_winkel_ykw_dummy=1 if Betaal_winkel_ykw>0 & !missing(Betaal_winkel_ykw)

levelsof HHID, local(levels)
foreach l of local levels {
   replace betaal_winkel_ykw_dummy=1 if L.betaal_winkel_ykw_dummy==1
}

然而,Stata 在正确处理这段代码时遇到了一些困难,因为当我 运行 这段代码时,它开始时做了很多 'changes',因此它仍然在计算一些东西(我这样做不知道是什么)但它不再进行更改,

 . foreach l of local levels {
  2.    replace betaal_winkel_ykw_dummy=1 if L.betaal_winkel_ykw_dummy==1
  3. }
(71048 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)

而且这种情况还在继续。我究竟做错了什么?我应该使用什么代码来获得相同的结果(因为当我打破代码时 运行ning 它在我的数据集中得到了适当的调整)但没有 Stata 无休止地计算无意义的东西的麻烦。

您在示例中使用的变量名称太长且含糊不清,我不想详细查看您的代码。我根据您的问题的措辞提供了示例代码。请注意,不需要循环!

我假设您有一些用于对面板进行排序的变量,很可能是日期变量。我将在我的示例中调用它 order.

然后您需要做的就是检查每个面板的 运行 总和的值,并相应地创建新变量。如果 运行 总和 > 0,则表示已购买。

clear
set more off

*----- example data -----

input ///
id purch newvar
1  0  0
1  0  0
1  0  0
1  1  1
1  0  1
2  0  0
2  1  1
2  0  1
2  1  1
2  1  1
end

*----- what you want -----

gen order = _n
bysort id (order) : gen newvar2 = sum(purch) > 0

list, sepby(id)

如果您不熟悉这个基本结构,请参阅 help by