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

如何使用Proc sgplot在分组趋势图上叠加疾病率总体平均趋势

实现方案

方法1:直接追加无分组的VLINE语句(无需提前处理数据)

这是最简便的实现方式,不需要提前计算全人群均值,直接在原有代码中新增一条不指定group参数的vline语句即可,SAS会自动按年份统计全人群的平均发病率:

proc sgplot data=have ;
/* 原有分性别趋势线 */
vline year/response=disease_rate group=sex stat=mean datalabel=disease_rate name="sex_trend" legendlabel="分性别趋势";
/* 新增全人群总体趋势线,无group参数即统计全量数据均值 */
vline year/response=disease_rate stat=mean lineattrs=(thickness=2 pattern=dash color=black) datalabel=disease_rate name="total_trend" legendlabel="全人群总体趋势";
yaxis values=(0,1)  label="Percentage";
/* 控制图例展示,可根据需求调整位置 */
keylegend "sex_trend" "total_trend" / location=inside position=topleft;
run; 

你可以通过调整lineattrs参数里的粗细、线型、颜色,让总体趋势线和分性别的趋势线更易区分。

方法2:预计算总体均值后绘图(适合自定义统计规则场景)

如果你需要自定义总体均值的计算逻辑(比如加权计算、排除特定异常样本等),可以先提前算出每年的全人群发病率,再合并绘图:

/* 第一步:计算每年全人群平均发病率 */
proc means data=have noprint nway;
class year;
var disease_rate;
output out=year_total mean=disease_rate_total;
run;

/* 第二步:将总体均值合并到原数据集 */
proc sql;
create table plot_data as
select a.*, b.disease_rate_total
from have a left join year_total b
on a.year = b.year;
quit;

/* 第三步:绘制包含三类趋势的折线图 */
proc sgplot data=plot_data ;
vline year/response=disease_rate group=sex stat=mean datalabel=disease_rate name="sex_trend" legendlabel="分性别趋势";
series x=year y=disease_rate_total / lineattrs=(thickness=2 pattern=dash color=black) datalabel=disease_rate_total name="total_trend" legendlabel="全人群总体趋势";
yaxis values=(0,1)  label="Percentage";
keylegend "sex_trend" "total_trend" / location=inside position=topleft;
run;

内容的提问来源于stack exchange,提问作者kiabar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:04