如何在Stata中用estout将多回归结果按行输出至Excel?
Stata回归结果格式调整与目标变量筛选方案
问题背景
需要在循环生成的一系列回归变量中,筛选出对因变量负向影响且BIC准则最小的变量,同时导出系数估计值、p值、BIC、R平方、聚类数量、观测值等结果至Excel或dta文件。当前estout输出结果呈对角线排列,需调整为每行对应一个变量的完整统计结果格式。
原代码
sysuse auto, clear global min "1800 2000 2500 3000" global max "3500 4000 4500 5000" foreach min of global min{ foreach max of global max{ gen weight_`min'_`max' = weight>=`min' & weight<=`max' } } foreach min of global min{ foreach max of global max{ reg price weight_`min'_`max', cluster(foreign) estimates store weight_`min'_`max' } } estout weight* using "results_weight.xls", cells(b(star fmt(%9.3f)) p(par fmt(%9.3f))) starlevels(* 0.1 ** 0.05 *** 0.01) varwidth(18) modelwidth(16) stats(r2 N bic) keep(weight*) replace
调整输出格式(解决对角线排列问题)
原estout默认将每个回归作为一列、每个变量作为一行,导致仅对角线有值。需调整为每行对应一个变量(回归)、每列对应一项统计指标的格式,推荐使用更简洁的esttab(estout的简化命令)实现:
方案1:导出为Excel格式
esttab weight* using "results_weight.xls", replace /// cells(b(star fmt(%9.3f)) p(par fmt(%9.3f))) /// // 显示带显著性星号的系数、括号包裹的p值 starlevels(* 0.1 ** 0.05 *** 0.01) /// stats(r2 N bic N_clust, fmt(%9.3f %9.0g %9.3f %9.0g) labels(R-squared 观测值 BIC 聚类数量)) /// // 加入聚类组数统计 keep(weight*) /// modelwidth(0) varwidth(20) /// // 调整列宽避免变量名截断 noobs nonote nomtitle /// // 关闭冗余输出项 eqlabels(none) collabels(none) /// // 清除默认标签 title("Weight区间变量回归结果")
方案2:导出为dta格式(便于后续筛选)
esttab weight* using "results_weight.dta", replace /// cells(b p) /// stats(r2 N bic N_clust, fmt(%9.3f %9.0g %9.3f %9.0g)) /// keep(weight*) /// modelwidth(0) varwidth(0) /// noobs nonote nomtitle /// eqlabels(none) collabels(none) /// dta // 指定导出为dta格式
筛选目标变量
导出dta文件后,可直接在Stata中筛选符合条件的变量:
use "results_weight.dta", clear rename _model var_name // 将回归模型名(变量名)列重命名为var_name rename b coef // 重命名系数列 rename p p_value // 重命名p值列 // 筛选负向影响(系数<0)且BIC最小的变量 keep if coef < 0 sort bic list var_name coef p_value r2 N bic N_clust in 1 // 显示BIC最小的结果
补充说明
N_clust为聚类组数,通过e(N_clust)提取,需Stata 13及以上版本支持。- 若坚持使用
estout,需添加unstack选项并调整布局,但esttab更简洁直观,优先推荐。
内容的提问来源于stack exchange,提问作者ele_al_12
相关产品推荐
相关产品推荐

