我有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在正确使用此代码方面遇到了一些困难,因为当我运行此代码时,它会开始进行大量的更改'因此它仍在计算某些东西(我不知道是什么),但它不再做出改变,
. 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)
这就是继续前进。我究竟做错了什么?我应该使用什么代码来获得相同的结果(因为当我在运行时打破代码时,在我的数据集中正确调整了代码)但没有Stata无休止地计算无意义事物的麻烦。
答案 0 :(得分:1)
您在示例中使用的变量名称对我来说太长而且含糊不清,因为您想要在代码中查看详细信息。我根据您的问题的措辞提供示例代码。请注意,不需要循环!
我假设你有一些变量,你的面板被排序,很可能是一个日期变量。我将在我的示例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
。