Stata无上下界数据生成带置信区间的分组均值柱状图优化
简化Stata分组均值柱状图(带置信区间)的实现方法
问题背景
现有Stata数据集包含字段:math_score、literacy_score、student_gender(Girl=0,Boy=1)、Location(Rural=0,Urban=1)。需生成按性别和地点分组的literacy_score均值柱状图,并添加置信区间,但原代码冗长且生成冗余临时数据集,需更简洁的实现方式。
简化方案
无需生成中间数据集,直接通过estpost统计分组均值与置信区间,再结合twoway绘图,全程在原数据集操作,避免文件杂乱:
单科目(literacy_score)实现代码
* 统计分组均值与95%置信区间 estpost tabstat literacy_score, by(student_gender Location) statistics(mean ci) columns(statistics) * 提取统计结果并清理格式 estimates store literacy_stats esttab literacy_stats, noobs not label cells("mean(fmt(1)) ci_low(fmt(1)) ci_high(fmt(1))") clear * 生成分组轴标签 gen group = _n label define group 1 "Girl" 2 "Boy" 3 "Rural" 4 "Urban" label values group group * 绘制带置信区间的柱状图 twoway (bar mean group, color(ltblue)) /// (rcap ci_high ci_low group, color(black)) /// (scatter mean group, msymbol(none) mlabel(mean) mlabposition(1) mlabsize(small)), /// xlabel(1/4, valuelabel noticks labsize(small)) /// ytitle("Mean Literacy Score") /// xtitle("Student Features") /// title("Literacy Student Knowledge Score (0-100)") /// ylabel(0(25)100) /// legend(off) /// scheme(s2color8) /// name(literacy_gen_loc, replace) * 导出图片 graph export "$output/literacy_gen_loc.jpg", as(jpg) width(4000) replace
多科目(math_score + literacy_score)循环实现代码
如果需要一次性生成两个科目的图表,可套入foreach循环,同样无需临时文件:
foreach score_var in math_score literacy_score { * 统计分组均值与置信区间 estpost tabstat `score_var', by(student_gender Location) statistics(mean ci) columns(statistics) estimates store stats_`score_var' esttab stats_`score_var', noobs not label cells("mean(fmt(1)) ci_low(fmt(1)) ci_high(fmt(1))") clear * 生成分组轴标签 gen group = _n label define group 1 "Girl" 2 "Boy" 3 "Rural" 4 "Urban" label values group group * 动态设置标题与纵轴标签 local title_str = cond("`score_var'" == "math_score", "Math Student Knowledge Score (0-100)", "Literacy Student Knowledge Score (0-100)") local ytitle_str = cond("`score_var'" == "math_score", "Mean Math Knowledge Score", "Mean Literacy Knowledge Score") * 绘图 twoway (bar mean group, color(ltblue)) /// (rcap ci_high ci_low group, color(black)) /// (scatter mean group, msymbol(none) mlabel(mean) mlabposition(1) mlabsize(small)), /// xlabel(1/4, valuelabel noticks labsize(small)) /// ytitle("`ytitle_str'") /// xtitle("Student Features") /// title("`title_str'") /// ylabel(0(25)100) /// legend(off) /// scheme(s2color8) /// name(`score_var'_gen_loc, replace) * 导出图片 graph export "$output/`score_var'_gen_loc.jpg", as(jpg) width(4000) replace * 恢复原数据集 restore, not }
方案优势
- 全程在原数据集操作,不生成任何冗余临时文件,避免工作目录杂乱
- 代码结构简洁,逻辑清晰,易维护和修改
- 直接通过
estpost自动计算置信区间,无需手动调用ci mean和statsby
内容的提问来源于stack exchange,提问作者Shubhi
相关产品推荐
相关产品推荐

