创建一个包含纵向面板数据中滞后值的变量
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
。
我有 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
。