2014-05-04 62 views
0

我有这样塔塔EGEN结合,如果

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

数据我想创建一个基于XY变量变量Z,有条件的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,塔塔将报告z已创建。有什么方法可以实现这个目标吗?

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

+1

“已建立”错误是不是你唯一的问题。您错误地使用了编程** ifcmd **,而不是** if **限定符(如果**,则为**帮助)。请参阅http://www.stata.com/support/faqs/programming/if-command-versus-if-qualifier/只有符合条件** if if可用于对观测子集进行操作。 –

+0

我们再来一次。你想要什么? 是否如下: 1. 2002年之前有两条规则,一条适用于之后。 2. Z是x或y的每月函数的年总和,取决于年份。 这是正确的吗? – D3L

+0

z是每个月和每年的月度总和。 z的公式因年份而异。 –

回答

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 
+0

你的方法可行。到目前为止我所做的是创建两个不同的变量z和z_2002。然后,如果year在2002年之前,我用z_2002替换z. –

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) 
+0

您可以将'cond()'调用放在'total()'中,作为'total()'喂给表达式,并且不坚持它的参数是变量名。 –

+0

谢谢@Nick。当然是的。尽管有时我宁愿写一行或两行以增加可读性。在这种情况下,我只是试图强调解决方案的两步序列。 –

+0

罗伯托,很好的答案。 –