SAS PROC TABULATE ALL行百分比默认100%计算调整问题
SAS PROC TABULATE 百分比计算逻辑调整方案
问题原因
你使用的colpctn是列百分比统计量,计算规则为:单元格计数 ÷ 对应列的总计数。胆固醇各分类列的总计数就是1861(Borderline)、1399(Desirable)、1789(High),ALL行对应单元格的分子和分母数值相同,因此输出100%。你需要的ALL行占比逻辑为「单元格计数 ÷ 全表总样本量5049」,可根据你对分组行的百分比需求选择以下两种调整方案:
方案1:所有行使用行百分比逻辑(推荐,符合多数交叉表统计习惯)
如果接受分组行的百分比调整为「对应组内胆固醇分类的人数占该组总人数的比例」,仅需将colpctn替换为rowpctn即可,此时ALL行的胆固醇占比完全符合你的预期:
proc tabulate data=sashelp.heart; class chol_status smoking_status sex; table (all smoking_status sex), (all chol_status)*(n*f=8. rowpctn*f=8.2) ; run;
调整后ALL行输出结果为:
| 指标 | All(N) | All(占比) | Borderline(N) | Borderline(占比) | Desirable(N) | Desirable(占比) | High(N) | High(占比) |
|---|---|---|---|---|---|---|---|---|
| All | 5049 | 100.00 | 1861 | 36.86 | 1399 | 27.71 | 1789 | 35.43 |
方案2:仅调整ALL行占比,分组行保留原有列百分比逻辑
如果需要保留原有分组行的百分比规则(即「该组对应胆固醇分类人数占该胆固醇总人数的比例」),可以通过条件判断指定不同行的百分比统计量:
proc tabulate data=sashelp.heart; class chol_status smoking_status sex; table (all smoking_status sex), all*(n*f=8. colpctn*f=8.2) chol_status*(n*f=8. pctn*f=8.2 (where =(_row_='All')) colpctn*f=8.2 (where =(_row_ ne 'All')) ); run;
其中pctn默认以全表总样本量为分母,可直接输出你需要的ALL行占比,非ALL行仍使用原有colpctn逻辑。
内容的提问来源于stack exchange,提问作者Pam G
相关产品推荐
相关产品推荐

