对于可视化一种比率(如:死亡率)要特别小心。因为在考虑到比率的大小外,还要考虑到样本数据的大小。
例如:武汉市确诊病例10000例,死亡病例100例,那么死亡率是 1% ; 北京市确诊病例10例,死亡病例1例,那么死亡率是 10% 。如果单独看死亡率,北京是武汉的10倍,北京的疫情要比武汉严重的多,但事实并非如此。这是因为北京的样本量太小,其死亡率不可信,或者说其死亡率的变动太大。
如果用条形图展示死亡率,会导致北京疫情比武汉严重的错误结论。漏斗图既考虑了死亡率又考虑了样本量大小的因素。它是一种带置信限的散点图,显示了在不同样本量下期望的死亡率的范围,可以判断哪些省份的死亡率在期望范围内,哪些省份的死亡率在期望范围外。
SAS代码如下:
options validvarname=any;
data have;
infile cards expandtabs truncover;
input 地区 :$20. 新增 现有 确诊病例 治愈 死亡 ;
死亡率 = 死亡 / 确诊病例;
if 地区 in ('香港' '台湾' '湖北' '海南' '北京' '贵州') then Label = 地区;
cards;
香港 0 78465 98135 18926 744
台湾 0 5938 20533 13742 853
广东 115 893 4800 3899 8
上海 38 510 4388
浙江 0 245 2265 2019 1
辽宁 0 207 1027 818 2
江苏 0 128 1779 1651 0
北京 5 113 1484 1362 9
福建 0 91 1561 1469 1
四川 6 88 1468 1377 3
云南 3 81 1959 1876 2
山东 6 44 1138 1087 7
湖北 0 37 68357 63808 4512
天津 0 33 1126 1090 3
黑龙江 0 21 2084 2050 13
山西 1 17 285 268 0
吉林 1 15 606 588 3
河南 1 11 2667 2634 22
甘肃 0 10 368 356 2
重庆 0 7 620 607 6
安徽 0 3 1012 1003 6
湖南 0 3 1233 1226 4
澳门 0 2 81 79 0
海南 0 1 191 184 6
宁夏 0 0 122 122 0
江西 0 0 959 958 1
新疆 0 0 996 993 3
河北 0 0 1476 1469 7
西藏 0 0 1 1 0
贵州 0 0 162 160 2
青海 0 0 30 30 0
陕西 0 0 2826 2823 3
;
proc sql noprint;
/* 计算全国的死亡率 */
select sum(死亡)/sum(确诊病例) into :AvgProp from have;
select round(max(确诊病例)+20,50) into :max from have;
quit;
%put &=AvgProp;
data limit;
do n = 4 to 200 by 10 , 200 to &max. by 50;
/*置信下限*/
r = quantile("binom", 0.025, &AvgProp., n);
numer = cdf("binom", r , &AvgProp., n) - 0.025;
denom = cdf("binom", r , &AvgProp., n) - cdf("binom", r-1, &AvgProp., n);
alpha = numer / denom;
L2sd= (r-alpha)/n;
if L2sd<0 then L2sd=0;
/*置信上限*/
r = quantile("binom", 0.975, &AvgProp., n);
numer = cdf("binom", r , &AvgProp., n) - 0.975;
denom = cdf("binom", r , &AvgProp., n) - cdf("binom", r-1, &AvgProp., n);
alpha = numer / denom;
U2sd= (r-alpha)/n;
if U2sd<0 then U2sd=0;
output;
end;
keep n L2sd U2sd;
run;
data want;
set have limit;
run;
title "中国各省新冠肺炎死亡率";
proc sgplot data=want noautolegend;
band x=N lower=L2sd upper=U2sd /
fill fillattrs=GraphConfidence outline lineattrs=GraphPrediction transparency=0.6
curvelabelloc=outside curvelabelupper="置信上限" curvelabellower="置信下限";
scatter x=确诊病例 y=死亡率 / datalabel=Label ;
refline &AvgProp. / axis=y label="中国新冠肺炎死亡率=%sysfunc(putn(&AvgProp.,8.3 -l))" lineattrs=GraphData2 label;
xaxis grid ;
yaxis grid Label="死亡率" max=0.067 ;
run;
结果如下:
上图中红色线条表示中国新冠肺炎的整体死亡率,蓝色部分表示其置信限,是其的期望/正常范围。可以看到其置信限是随着确诊病例(样本量)的变化而变化,呈现一个漏斗形状。
可以看到湖北和台湾远远超过置信上限,说明两地的疫情非常严重(湖北比台湾更严重),防控措施需要提高。海南和贵州的死亡率在正常范围内。其它省份远远小于置信下限,说明其它省份对疫情的防控非常好,可以借鉴相应的防控措施。
最后,从图中可以看到北京要远远好于湖北,这也证明死亡率不能只看数字,还需要看样本量。
_____________
数据来源:
http://jjh.cngold.org/apps/tg_yq.html
参考文献:
http://blogs.sas.com/content/iml/2020/04/20/funnel-plot-covid-nc.html
http://blogs.sas.com/content/iml/2020/04/22/funnel-plot-covid-us.html