使用 forvalues 的移动平均线 - Stata

Moving average using forvalues - Stata

我正在努力解决 Cameron 和 Trivedi 的 "Microeconometrics using Stata" 中的一个问题。该问题涉及具有两个关键变量的横截面数据集,即年收入对数 (lnearns) 和年工作时数 (hours)。

我正在努力解决问题的第 2 部分,但我会根据上下文输入整个内容。

数据按 x 排序后的 y 移动平均值是 y 在 x 上的非参数回归的简单情况。

  1. 按小时对数据进行排序。
  2. 用第 i 个观测值 yma_i = 1/25(从 y_i+j 的 j=-12 到 j=12 求和)创建 lnearns 的中心 15 周期移动平均值。使用命令 forvalues 最简单。
  3. 使用 twoway connected graph 命令绘制此移动平均线与小时数的关系图。

我不确定使用什么命令来计算横截面数据的移动平均值。我也不太明白一个周期数据的移动平均线显示的是什么。

任何帮助都将非常有用,如果需要更多信息,请说明。 谢谢!

编辑 1:

应该可以从这里下载数据集 https://www.dropbox.com/s/5d8qg5i8xdozv3j/mus02psid92m.dta?dl=0。它是教科书中使用的收入动态面板研究中 1992 年个人水平数据的一小段摘录。

仍在习惯语法,但这是我的尝试

sort hours
gen yma=0 
1. forvalues i = 1/4290 {
2. quietly replace yma = yma + (1/25)(lnearns[`i'-12] to lnearns[`i'+12]) 
3. }

还有其他方法可以做到这一点,但我为每个滞后和超前创建了一个变量,然后将所有这些变量与原始变量相加,然后除以 25,如您提供的方程式所示:

sort hours

// generate variables for the 12 leads and lags
forvalues i = 1/12 {
    gen lnearns_plus`i'  = lnearns[_n+`i']
    gen lnearns_minus`i' = lnearns[_n-`i']
}

// get the sum of the lnearns variables
egen yma = rowtotal(lnearns_* lnearns)

// get the number of nonmissing lnearns variables
egen count = rownonmiss(lnearns_* lnearns)

// get the average
replace yma = yma/count

// clean up
drop lnearns_* count

这为您提供了您正在寻找的变量(移动平均线),而且不会简单地除以 25,因为您有很多缺失的观测值。

关于您提出的这个显示的问题,我的解释是它将显示每个小时变量的本地平均值。如果你在 y 上绘制 lnearn,在 x 上绘制小时,你会得到一些看起来很疯狂的东西,因为有很多变化,但如果你绘制移动平均线,趋势是什么就更清楚了。

实际上这个数据集可以通过

读入合适的目录
net from http://www.stata-press.com/data/musr
net install musr
net get musr
u mus02psid92m, clear

这种平滑方法存在问题,因为 sort hours 在被平滑的响应值方面没有唯一的结果。但是 rangestat (SSC) 可以实现具有类似精神的实现。

sort hours
gen counter = _n
rangestat (mean) mean=lnearns (count) n=lnearns, interval(counter -12 12)

还有很多其他的平滑方法。一个是

gen binhours = round(hours, 50)
egen binmean = mean(lnearns), by(binhours)
scatter lnearns hours, ms(Oh) mc(gs8) || scatter binmean binhours , ms(+) mc(red)

更好的方法是使用 lpoly