凡是搞计量经济的,都关注这个号了
稿件:econometrics666@126.com
所有计量经济圈方法论丛的code程序, 宏微观数据库和各种软件都放在社群里.欢迎到计量经济圈社群交流访问.
Source: 杨金海科学网博客; 文中一些small bugs不影响整体理解; http://blog.sciencenet.cn/blog-793574-877288.html
比如截面的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 [exp_list] [, options ]: command在分组回归中,statsby最重要的是如下三个部分:(1)[, options ],应使用分组变量,如:“,by(year industry)”;(2)command,应选用相应的回归命令,如果是OLS,那么就为“regress y x1 x2”;(3)[exp_list],要统计的相应参数,如:系数拟合值、拟和优度、自由度等,可参见对应command的help文件。use “d:statsbydata.dta”,clearStatsby _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 x2d:statsbydata.dta为举例使用数据库,包括变量为:y、x1、x2、year和industry,其中year和industry是用来做分组回归的分组标识变量;sort是排序命令,建议养成好习惯对分组变量排序,为了后续研究做准备。e(df_m)为回归方程的模型自由度,一般的统计、计量的书籍都记为(K-1);e(df_r)为回归方程的剩余自由度,一般的统计、计量的书籍都记为(n-K);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”,replaceuse “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_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)而计算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 resid2002A0,residuals这太麻烦了,还要面临产生变量等问题。在使用statsby命令后,可以通过回归方程的回归系数直接计算相应的拟合值和残差,具体步骤如下:use “d:statsbydata.dta”,clearmerge m:1 year industry using “d:statsbyresults.dta”gen yhat=_b_cons+_b_x1*x1+_b_x2*x2其中,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.空间计量免费课程, 文章, 数据和代码全在这里, 空间相关学者注意查收!下面这些短链接文章属于合集,可以收藏起来阅读,不然以后都找不到了。