【问题标题】:Moving average using forvalues - Stata使用 forvalues 移动平均线 - Stata
【发布时间】:2017-03-09 11:40:22
【问题描述】:

我在 Cameron 和 Trivedi 的“使用 Stata 的微观计量经济学”中遇到一个问题。该问题涉及具有两个关键变量的横截面数据集,即年收入对数 (learns) 和年工作时间 (小时)。

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

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

  1. 按小时对数据进行排序。
  2. 在第 i 个观测值 yma_i = 1/25(从 j=-12 到 j=12 的 y_i+j 的总和)创建一个居中的 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. }

【问题讨论】:

  • 需要的是数据集或可下载数据集的位置指示。另外,你尝试了什么代码。
  • 嗨尼克,我已经使用可下载的数据集和我的尝试编辑了我的原始帖子。
  • 只是为了向其他人标记您所知道的:您的代码行编号为 2 与法律相去甚远。由于您已经获得了可行的建议,因此我不会对其进行剖析。

标签: stata moving-average


【解决方案1】:

还有其他方法可以做到这一点,但我为每个滞后和领先创建了一个变量,然后将所有这些变量的总和与原始变量相加,然后除以 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,因为您有许多缺失的观察值。

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

【讨论】:

  • 感谢您的宝贵时间!这是一种非常优雅和清晰的方式。
  • 查看tsegen (SSC) 作为避免此处循环的一种方式。在sort hours gen id = _n tsset id 之后,代码本质上是tsegen movave = rowmean(L(-12/12).lnearns)
【解决方案2】:

其实这个数据集可以被读入合适的目录

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 会更好。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2013-12-22
    • 2021-07-11
    • 2022-01-26
    • 1970-01-01
    • 2011-06-29
    • 2019-04-24
    • 2012-05-24
    • 2021-01-18
    相关资源
    最近更新 更多