在Stata中跨变量移动平均线

时间:2013-11-25 17:30:36

标签: foreach stata moving-average

我有一个面板数据集,我想计算多年的移动平均数。

每年都是一个变量,每个州都有一个观察点,我想为每三年的平均值创建一个新变量。 例如:

P1947=rmean(v1943 v1944 v1945), P1947=rmean(v1944 v1945 v1946)

我想我应该在foreach命令中使用egen循环,但我不确定如何引用循环中的不同变量。

我很感激任何指导!

2 个答案:

答案 0 :(得分:1)

这种数据结构非常不合适。假设标识符id需要reshape,例如

 reshape long v, i(id) j(year) 
 tsset id year 

然后移动平均线很容易。使用tssmoothgenerate,例如

 gen mave = (L.v + v + F.v)/3 

或(更好)

 gen mave = 0.25 * L.v + 0.5 * v + 0.25 * F.v 

更多关于为什么你的数据结构非常不合适:不仅计算移动平均值需要一个循环(不一定涉及egen),而是你要创建几个新的额外变量。在任何后续分析中使用那些将介于尴尬和不可能之间。

编辑我会给出一个示例循环,而不是从我的立场转移它是不好的技术。我没有看到你的命名惯例背后的原因P1947是1943-1945的意思;我认为这只是一个错字。我们假设我们有1913-2012的数据。对于3年的手段,我们每端都会失去一年。

forval j = 1914/2011 { 
    local i = `j' - 1 
    local k = `j' + 1       
    gen P`j' = (v`i' + v`j' + v`k') / 3 
} 

这可以更简洁地编写,代价是宏中的一系列宏。如上所述,使用不等重量很容易。使用egen的唯一原因是,如果有错误,它就不会放弃,而上述情况就是这样。

进一步编辑

为了完整起见,请注意,在不诉诸egen的情况下很容易处理错失。

分子

    (v`i' + v`j' + v`k')

概括

    (cond(missing(v`i'), 0, v`i') + cond(missing(v`j'), 0, v`j') + cond(missing(v`k'), 0, v`k') 

和分母

    3 

概括

    !missing(v`i') + !missing(v`j') + !missing(v`k')

如果缺少所有值,则会减少到0/0或丢失。否则,如果缺少任何值,我们将0加到分子,0加到分母,这与忽略它相同。当然,如上所述,代码可以容忍3年的平均值,但无论是对于那种情况还是平均多年,我们都会用循环替换上面的行,这就是egen所做的。

答案 1 :(得分:0)

有一个用户编写的程序可以很容易地为您完成。它被称为mvsumm,可以通过findit mvsumm

找到
xtset id time 
mvsumm observations, stat(mean) win(t) gen(new_variable) end