我有一个面板数据集,我想计算多年的移动平均数。
每年都是一个变量,每个州都有一个观察点,我想为每三年的平均值创建一个新变量。 例如:
P1947=rmean(v1943 v1944 v1945), P1947=rmean(v1944 v1945 v1946)
我想我应该在foreach
命令中使用egen
循环,但我不确定如何引用循环中的不同变量。
我很感激任何指导!
答案 0 :(得分:1)
这种数据结构非常不合适。假设标识符id
需要reshape
,例如
reshape long v, i(id) j(year)
tsset id year
然后移动平均线很容易。使用tssmooth
或generate
,例如
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