多个回归模型的 coefplot 图如何使用 twoway 绘制

最近有小伙伴问到了这样一个问题。首先我们创建一些示例模型:

sysuse auto, clear
qui reg price mpg
est store M
qui reg price mpg rep78
est store R
qui reg price mpg rep78 headroom
est store H
qui reg price mpg rep78 headroom trunk
est store T
qui reg price mpg rep78 headroom trunk weight
est store W
qui reg price mpg rep78 headroom trunk weight length
est store L
qui reg price mpg rep78 headroom trunk weight length turn
est store TU
qui reg price mpg rep78 headroom trunk weight length turn displacement
est store D

使用 coefplot 可以提取所有模型 mpg 系数和置信区间绘图展示:

coefplot M R H T W L TU D, keep(rep78) vertical ///
nolabel yline(0, lp(dash) lcolor(gs10)) ///
level(95 90) ciopts(recast(rcap)) ///
graphregion(color(white)) legend(off)

但是他想要这样的效果:

这该如何实现呢?

实际上有很多时候我们想要绘制的结果难以直接使用 coefplot 命令实现,因此我们可以考虑提取模型数据,然后使用 twoway 绘制。下面我们来看一下如何使用 twoway 绘制第二幅图。

首先提取模型估计结果:

qui esttab M R H T W L TU D, ci(%6.4f)
ret list

*> scalars:
*> r(nmodels) = 8
*> r(ccols) = 4
*>
*> macros:
*> r(names) : "M R H T W L TU D"
*> r(m8_depname) : "price"
*> r(m7_depname) : "price"
*> r(m6_depname) : "price"
*> r(m5_depname) : "price"
*> r(m4_depname) : "price"
*> r(m3_depname) : "price"
*> r(m2_depname) : "price"
*> r(m1_depname) : "price"
*> r(cmdline) : "estout M R H T W L TU D, cells(b(fmt(a3) star) ci(fmt(%6.4f) par(.."
*>
*> matrices:
*> r(coefs) : 9 x 32
*> r(stats) : 1 x 8

显然估计结果就存储在 r(coefs) 里面:

mat list r(coefs)

把这个矩阵读取到 dta 中再稍作处理,这部分细节难以一一讲解,详情可以观看视频讲解学习:

qui esttab M R H T W L TU D, ci(%6.4f)
ret list

mat list r(coefs)

mat a = r(coefs)
clear
svmat a
keep in 1
xpose, clear

local r: colfullnames a
gen colname = ""
local j 1
foreach i in `r' {
replace colname = "`i'" in `j'
local ++j
}
egen v = fill(1 1 1 1 2 2 2 2)

replace colname = string(v) + "_" + colname
drop v
split colname, parse(:)
drop colname
*- ssc install tidy
spread colname2 v1
split colname1, parse(_)
destring colname11, replace
gsort colname11
gen id = _n
*- ssc install sencode
sencode colname12, gen(x) gsort(id)

然后我们就可以使用处理得到的结果绘图了:

tw rcap ci_l ci_u x || ///
sc b x, xla(1(1)8, val) m(o) ///
yla(, format(%6.1f)) ///
leg(order(1 "95% 置信区间" 2 "估计系数") ///
row(1) pos(6)) xti("")

点击这里跳转到 RStata 短书平台获取附件:多个回归模型的 coefplot 图如何使用 twoway 绘制

评论