如何更高效地在Stata中按时间和区域生成统计量并绘图?
问题描述
我目前用Stata 16的table命令查看单个区域的销售数据统计量:
version 16: table Year if region == 1, c( p25 sales p50 sales p75 sales mean sales)
为对比多区域随时间的销售数据分位数(p25、p50、p75)和均值,我通过循环为每个区域生成对应变量:
levelsof region, local(levels) foreach l of local levels { gen reg_`l'_p25 = . gen reg_`l'_p50 = . gen reg_`l'_p75 = . gen reg_`l'_mean = . forval i = 2000/2010{ sum sales if region == `l' & Year == `i', d replace reg_`l'_p25 = r(p25) if region == `l' & Year == `i' replace reg_`l'_p50 = r(p50) if region == `l' & Year == `i' replace reg_`l'_p75 = r(p75) if region == `l' & Year == `i' replace reg_`l'_mean = r(mean) if region == `l' & Year == `i' } }
随后使用twoway命令绘图:
twoway(mband reg_1_p25 ... ) (mband reg_2_p25.... ) (band reg_3_p25... )
请问是否有更快捷、简便的方法来生成这类统计量并完成绘图?
更简便的实现方法
1. 一步生成分区域年度统计量:用collapse命令
不用再写循环生成一堆变量,直接用collapse把统计量汇总成结构清晰的新数据集:
* 按区域、年份分组,计算销售数据的分位数和均值 collapse (p25) sales_p25=sales (p50) sales_p50=sales (p75) sales_p75=sales (mean) sales_mean=sales, by(region Year)
执行后会得到一个新数据集,每一行对应一个「区域-年份」组合,直接包含该组的p25、p50、p75和均值,完全替代原来的循环操作。
2. 简化绘图:基于汇总数据集批量绘图
有了汇总后的数据集,绘图时直接按region分组,不用手动逐个写区域变量:
* 绘制分位数区间+中位数+均值线 twoway (mband sales_p25 sales_p75 Year, by(region) color(%30)) /// (line sales_p50 Year, by(region) lwidth(medium)) /// (line sales_mean Year, by(region) lstyle(dash) lwidth(medium)), /// legend(label(1 "P25-P75区间") label(2 "中位数(P50)") label(3 "均值")) /// title("各区域年度销售数据统计趋势") /// ytitle("销售额") xtitle("年份")
如果不想切换到新数据集,要在原数据中保留这些统计量,可以用statsby把统计量合并回去:
* 在原数据中添加各区域-年份的统计量 statsby _b*, by(region Year) clear: summarize sales, detail rename r(p25) sales_p25 rename r(p50) sales_p50 rename r(p75) sales_p75 rename r(mean) sales_mean merge 1:m region Year using "你的原数据文件名.dta"
之后照样能用上面的twoway命令绘图。
最偷懒的方法:绘图时直接计算统计量
Stata的twoway支持直接在绘图命令里按分组计算统计量,连提前汇总数据都省了:
twoway (mband sales sales Year, by(region) stats(p25 p75)) /// (line sales Year, by(region) stats(p50) lwidth(medium)) /// (line sales Year, by(region) stats(mean) lstyle(dash) lwidth(medium)), /// legend(label(1 "P25-P75区间") label(2 "中位数(P50)") label(3 "均值")) /// title("各区域年度销售数据统计趋势") /// ytitle("销售额") xtitle("年份")
这个方法最快捷,直接在绘图时按「区域-年份」分组算出需要的统计量,一步到位完成绘图。
内容的提问来源于stack exchange,提问作者sampak
相关产品推荐
相关产品推荐

