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
我正在尝试计算过去 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