You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:12:26