如何使用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
相关产品推荐
相关产品推荐

