jungsee的个人博客分享 http://blog.sciencenet.cn/u/jungsee

博文

如何用stata做分年、分行业的回归

已有 71172 次阅读 2015-3-26 01:19 |个人分类:STATA|系统分类:教学心得


有偿数据分析兼职群公众号.pdf


 


百度:在STATA使用statsby命令做分组回归


如何用stata做分年、分行业的回归?
比如截面的jones模型,要求分行业分年份进行回归,如果每年每行业做一次回归,10年的数据10多个行业,需要做100多次回归。做很多个模型就需要做几千次的回归。
有没有什么办法能够让stata快速进行分行业和分年份的回归,,生成残差,,并将残差保存在excel里?


*仅显示各回归的结果
bys year industry: reg y x*

*生成各回归的预测值yp与残差e:
reg y (industry#year)##c.x*
predict yp
predict e,r

*生成各回归的系数及其标准差、t值、p值,拟合优度r2:
statsby _b _se r2=e(r2) n=e(df_r),clear by(industry year): reg y x*
foreach v of var _b*{
loc
s=substr("`v'",4,.)
g
_t_`s'=`v'/_se_`s'
g _p_`s'=ttail(_eq2_n, abs(_t_`s'))*2
}


statsby r2=e(r2), clear by(industry year): reg y x*


stata分组回归的残差

现在我有多只股票10年的周交易数据,想用 每只股票(每年)的周数据对对应的市场收益率数据做回归。我用过by(varname): reg y X1 X2 X3。如果加上命令predict e if e(sample)也只是显示最后一次回归的残差。请问要怎么才能保存每个回归的残差的标准差呢?

我试过,statsby这个命令只是保存回归模型的回归系数和系数的标准差;forvalue 命令每次又对所有的股票都做了回归;estadd/estout 好像也不行...

请问还有其他方法吗,还是我做的方法不对?急盼高手指点


既然可以用by,就可以用foreach 或者forvalues。每次回归之后就把收集起来的数据存放在新建的变量里就好了。比如
gen resid_stddev = .
forvalues year in 1980/2010 {
       reg Y X1 X2 X3 if year == `year'
       capture drop resid
       predict resid if e(sample), r
       su resid
       replace resid_stddev = r(sd) if year == `year'
}
table year, contents(mean resid_stddev)



在实际的回归分析中,经常需要做多分组的回归,譬如:分别按年度、行业进行回归。如果仅仅使用regress命令,那么必然造成进行重复多次的繁重劳动。当然,一种办法就是通过编程来实现,不过这需要拥有较好的编程能力,绝大多数初学者甚至是资深人士都不愿选择的。其实STATA中已经提供了相应的命令完成这个貌似繁重的工作,即statsby,这个可以专门用来处理分组数据的命令。


一、statsby的命令格式及说明

statsby命令格式为:

statsby [exp_list] [, options ]: command

其具体内容,请参见STATA的help文件,即:

help statsby

在分组回归中,statsby最重要的是如下三个部分:

(1)[, options ],应使用分组变量,如:“,by(year industry)”;

(2)command,应选用相应的回归命令,如果是OLS,那么就为“regress y x1 x2”;

(3)[exp_list],要统计的相应参数,如:系数拟合值、拟和优度、自由度等,可参见对应command的help文件。

综合起来,命令可以写为:

use “d:statsbydata.dta”,clear

sort year industy

Statsby _b _se e(r2) e(r2_a) e(df_m) e(df_r) e(F) e(N), by(year industry) saving(d:statsbyresults.dta, replace): regress y x1 x2

其中:

d:statsbydata.dta为举例使用数据库,包括变量为:y、x1、x2、year和industry,其中year和industry是用来做分组回归的分组标识变量;

sort是排序命令,建议养成好习惯对分组变量排序,为了后续研究做准备。

_b为各变量的回归系数;

_se为各变量的标准误;

e(r2)为回归方程的拟和优度r2;

e(r2_a)为回归方程的调整后r2;

e(df_m)为回归方程的模型自由度,一般的统计、计量的书籍都记为(K-1);

e(df_r)为回归方程的剩余自由度,一般的统计、计量的书籍都记为(n-K);

e(F)为回归方程的F值;

e(N)为进入回归方程的有效样本数N,一般的统计、计量的书籍都记为n,也即前述提及的n;

by(year industry),使用变量year和industry作为分组变量,进行分组统计; saving(d:statsbyresults.dta, replace),将结果保存,也可以保存在临时表里;

regress y x1 x2,进行回归,这部分可以参看regress命令自身格式进行扩充。

此命令结束后,将在D盘下产生一个名字为statsbyresults.dta的文件,上述统计量都将在此文件中。这里需要说明的是_b和_se是系统生成的向量,因此不能随便赋给变量,而e()

则是标量,可以赋值给一个变量,譬如在命令中可以写:“R_square=e(r2)”,这样在statsbyresults.dta就会出现一个R_square,替代原有的系统默认生成的变量。即使是系统生成的变量,也不用担心,因为变量的label可以区分具体的变量意义。


二、使用statsby命令后计算各回归方程中各回归系数的t值和p值

这里又发现了新的问题,首先在regress命令结果中的e()函数中,没有t值和对应的p值,这对于想验证相应分组模型对应的系数是否显著或是模型是否显著就很麻烦,因此,这里只能通过t值的计算公式和STATA提供的t检验的p值函数。具体步骤如下:

首先切换到结果表,

save “d:statsbydata.dta”,replace

use “d:statsbyresults.dta”, clear

其中,save命令使用要十分小心,会把原有的数据库内容改变,因此存在大量的STATA的使用讲解中都提及到如何避免这个问题的处理,请自行参考。本文为了说明方便,简化处理。

回归系数的t值公式为:ti?其中: ?ise(?i)t(n?K)

?i是第i个回归系数,可以在结果表中找到相应变量,以“_b_”开头的、以对应回归变量名为结尾的,如:“_b_x1”为x1的回归系数、“_b_cons”为截距项回归系数;

se(?i)为其标准误,可以在结果表中找到相应变量,以“_se_”为开头的、以对应回归变量名为结尾的,如:“_se_x1”为x1的回归系数的标准误、“_se_cons”为截距项回归系数的标准误;

n?K为回归方程剩余自由度,即e(df_r),如果没有赋给变量,那么系统自动生成一个变量,其label会标注“e(df_r)”,此处回归的系统变量为_eq2_stat_4。

因此,计算x1回归系数的t值和p值可以用如下的命令:

gen x1_t=_b_x1/_se_x1

gen x1_p=ttail(_eq2_stat_4,abs(x1_t))

其中:

ttail(e(df_r),abs(t_value))为计算t检验值对应的p值函数,具体函数要求请参考help文件;abs()为取绝对值函数。

这样,d:statsbyresults.dta文件中生成了两个新的变量x1_t和x1_p,分别为x1回归系数的t值和对应的p值。


三、使用statsby命令后计算各回归方程F值对应的p值

同t值和对应的p值一样,e()中也没有给出各个模型的F值对应的p值,因此需要通过STATA提供的F检验的p值函数来计算生成。具体步骤如下:

r2/(K?1)回归方程的F值公式为:F?, (1?r2)/(n?K)

其中:

r2为回归方程拟和优度,即e(r2);

K?1为回归方程的模型自由度,即e(df_m);

n?K为回归方程的剩余自由度,即e(df_r)。

而计算F值相应p值的函数为Ftail(e(df_m),e(df_r),e(F))。

按照此分组回归模型形成的结果数据中,使用系统生成变量分别为:_eq2_stat_3为e(df_m)、_eq2_stat_4为e(df_r)、_eq2_stat_5为e(F),那么F值的相应p值为:

gen PF=Ftail(_eq2_stat_3, _eq2_stat_4, _eq2_stat_5)

则在d:statsbyresults.dta文件中生成了一个新的变量PF,为相应回归方程的F值对应的p值。


四、使用statsby命令后如何生成各组回归方程的拟合值和残差等

在实际分组回归后,研究还需要保存相应因变量的拟合值或是方程的残差,如果不使用statsby的话,需要一个一个回归,然后使用predict命令,如:

reg y x1 x2 if year==2002 & industry==“A0“

predict yhat2002A0

predict resid2002A0,residuals

这太麻烦了,还要面临产生变量等问题。在使用statsby命令后,可以通过回归方程的回归系数直接计算相应的拟合值和残差,具体步骤如下:

首先打开d:statsbydata.dta数据:

use “d:statsbydata.dta”,clear

merge m:1 year industry using “d:statsbyresults.dta”

gen yhat=_b_cons+_b_x1*x1+_b_x2*x2

gen resid=y-yhat

其中,merge是合并命令,m:1是多对一合并,要求using后的数据库必须按照year和industry排序并且是唯一排序,由于statsby命令结果自然是排好序的,这里就没有再排序。_b_cons、_b_x1和_b_x2分别是截距、x1的回归系数和x2的回归系数。合并的结果是,所有在d:statsbydata.dta的变量数据都在year和industry的分类基础上合并到对应的样本中。这样就完成了分组回归后的因变量拟合值和残差的生成。


本文仅是就在STATA中使用statby完成分类回归工作及相应结果生成的简单描述,其他复杂内容,可以参考相应的help文件和编程知识进一步扩展。





https://blog.sciencenet.cn/blog-793574-877288.html

上一篇:差分广义矩( DiffGMM) 和系统广义矩(SYSGMM)
下一篇:MATLAB_R2015a(8.5.0.197613)安装及破解方法
收藏 IP: 111.203.16.*| 热度|

2 yangb919 fangshuaifinch

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-23 06:28

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部