Stata 中超过 3 个观测值的滚动标准差

Rolling standard deviation with more than 3 observations in Stata

我正在尝试计算过去 10 年某些经济变量(我们称之为 X)的滚动标准差。我使用面板数据集,其中包含 500 家公司 (id1-id500) 和 20 年 (1995-2015)。我必须计算从 2006 年开始的每年和每家公司的标准偏差(滚动 window 超过 10 年)。我已使用以下代码完成此操作:

tsset id year
rolling sd_X=r(sd), window(10) keep(year) saving(sd_X, replace): sum X
merge 1:1 id year using "sd_X.dta"

这段代码工作正常,但我有一个小问题:X 变量包含很多缺失值,我需要对 X 变量进行 3 个以上的观察来计算标准差。我的解决方案是使用 -rolling- 计算标准偏差(如我之前所示),而不是用缺失值替换所有标准偏差,如果使用少于 3 个观察值计算的话。

我试着写了一个循环,它使用滚动 window 计算每个公司和年份前 10 年期间的所有非缺失值,但不幸的是它没有很好地工作:

   gen count1 = 0
   forvalues i = 1995/2015 {
   forvalue z = 1/500 {
   count if year == `i' & id == `z' & X != . 
   replace count1 = count1[_n-1] + r(N)
    }
    }

因此,我只有 count1 的缺失值。 我想要得到的结果必须如下所示:

 firm   year     X      count1
  z      i

 id1   1995    m.v.       0
 ........................
 id1   2011    m.v.       0
 id1   2012     1         0
 id1   2013     1         1
 id1   2014     21        2
 id1   2015     4         3
 ........................
 id2   1995     m.v.      0
 ........................
 id2   2011     m.v.      0
 id2   2012     m.v.      0
 id2   2013     m.v.      0
 id2   2014      42       1
 id2   2015      46       2
 and so on...

有人知道这样做的好方法吗?

看看 tsegen(来自 SSC)。要安装它,请输入 Stata 的命令 window

ssc install tsegen

这是一个 11 年 window 滚动 sd 的快速示例,其中包括当前的观察结果。至少需要 3 个非缺失观察值。

* ------------- data setup -------------
set seed 1234
clear

* create firms and initial earnings
set obs 500
gen id = _n
gen x = runiform()

* for each firm, create 20 years of x
expand 20
bysort id: gen year = 1985 + _n
replace x = x + runiform()

* create some missing  values
replace x = . if runiform() < .1

* can also have some missing obs
drop if runiform() < .1

* Declare data to be panel data
tsset id year

* ------------- end of data setup -------------

tsegen sd_x = rowsd(L(0/10).x, 3)

* spot check
sum x if id == 1 & inrange(year,1993,2003)
list if id == 1 & year == 2003