查看原文
其他

​如何用做分年和分行业的回归?提供一些操作代码!

凡是搞计量经济的,都关注这个号了

稿件:econometrics666@126.com

所有计量经济圈方法论丛的code程序, 宏微观数据库和各种软件都放在社群里.欢迎到计量经济圈社群交流访问.

Source: 杨金海科学网博客; 文中一些small bugs不影响整体理解; http://blog.sciencenet.cn/blog-793574-877288.html 

如何用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文件和编程知识进一步扩展。

关于相关计量方法视频课程,文章,数据和代码,参看 1.面板数据方法免费课程, 文章, 数据和代码全在这里, 优秀学人好好收藏学习!2.双重差分DID方法免费课程, 文章, 数据和代码全在这里, 优秀学人必须收藏学习!3.工具变量IV估计免费课程, 文章, 数据和代码全在这里, 不学习可不要后悔!4.各种匹配方法免费课程, 文章, 数据和代码全在这里, 掌握匹配方法不是梦!5.断点回归RD和合成控制法SCM免费课程, 文章, 数据和代码全在这里, 有必要认真研究学习!6.空间计量免费课程, 文章, 数据和代码全在这里, 空间相关学者注意查收!
下面这些短链接文章属于合集,可以收藏起来阅读,不然以后都找不到了。

2.5年,计量经济圈近1000篇不重类计量文章,

可直接在公众号菜单栏搜索任何计量相关问题,

Econometrics Circle




数据系列空间矩阵 | 工企数据 | PM2.5 | 市场化指数 | CO2数据 |  夜间灯光 | 官员方言  | 微观数据 | 内部数据计量系列匹配方法 | 内生性 | 工具变量 | DID | 面板数据 | 常用TOOL | 中介调节 | 时间序列 | RDD断点 | 合成控制 | 200篇合辑 | 因果识别 | 社会网络 | 空间DID数据处理Stata | R | Python | 缺失值 | CHIP/ CHNS/CHARLS/CFPS/CGSS等 |干货系列能源环境 | 效率研究 | 空间计量 | 国际经贸 | 计量软件 | 商科研究 | 机器学习 | SSCI | CSSCI | SSCI查询 | 名家经验计量经济圈组织了一个计量社群,有如下特征:热情互助最多前沿趋势最多、社科资料最多、社科数据最多、科研牛人最多、海外名校最多。因此,建议积极进取和有强烈研习激情的中青年学者到社群交流探讨,始终坚信优秀是通过感染优秀而互相成就彼此的。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存