Stata egen与if结合使用

时间:2014-05-04 17:49:27

标签: stata

我有这样的数据

year month X    Y    weight  
2013    1   1    0    1000
2001    12  0     1    2000

我想基于ZX变量创建变量Y,条件为year。我在2002年之前和之后有两个year公式。如果我将egenif一起使用,

if year > 2002 {
   bysort year month  :egen Z= total( x*weight)
}
else {
bysort year month : egen Z= total(y*weight*0.5)
}

此代码不起作用,因为如果year <2002,Stata会报告已创建z。有没有办法实现这个目标?

我用一种非常粗暴和暴力的方法来解决这个问题。我为z创建了两个变量,即z和z_2002。如果年份小于2002年,我用z_2002替换z。

2 个答案:

答案 0 :(得分:0)

clear
input year month x    y    weight
2013    1   1    0    1000
2001    12  0     1    2000
end

preserve
keep if year>2002
bysort year month  :egen z= total(x*weight)
tempfile t1
save `t1'
restore
keep if year<=2002
bysort year month : egen z= total(y*weight*0.5)
append using `t1'
list

答案 1 :(得分:0)

如果我理解正确,这应该有效。

在第一步(以年为条件)和第二步中的总和计算产品。

正如其他答案已经注意到的那样,if限定符和if编程命令之间存在差异。有一个简短的常见问题解答:http://www.stata.com/support/faqs/programming/if-command-versus-if-qualifier/

(我在另一个答案的评论中使用@NickCox提供的代码。)

clear all
set more off

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

input year month x    y    weight
2013    1   1    0    1000
2013    1   1    0    800
2013    2   0    1    1200
2013    2   1    0    1400
2001    12  1     0    1500
2001    12  0     1    2000
2001    11  1     1    4000
end

sort year month
list, sepby(year month)

*----- computations -----

gen Z = cond(year > 2002, x * weight, y * weight * 0.5)
bysort year month: egen totZ = total(Z) // already sorted so -by- should be enough

list, sepby(year month)