如何在SAS PROC MEANS中新增nmiss/(nmiss+n)计算变量?
如何在SAS PROC MEANS中新增缺失率(nmiss/(n+nmiss))统计量
问题描述
我现有一段运行正常的SAS PROC MEANS语句如下:
proc means data=MBA_NODUP_APPLICANT_&TERM. missing nmiss n mean median p10 p90 fw = 8; where ENR = 1; by SRC_TYPE; var gmattotal greverb2 grequant2 greanwrt; run;但我希望新增一个计算
nmiss/(nmiss+n)的变量(即缺失率),未找到相关示例,特此咨询实现方法。
解决方案
PROC MEANS本身没有内置的缺失率统计量,但可以通过两种常用方法实现需求:
方法1:先输出统计量到数据集,再计算缺失率
先利用PROC MEANS的output语句把n和nmiss等基础统计量导出到数据集,再用DATA步计算缺失率,最后整理成和原输出格式一致的结果:
/* 第一步:导出PROC MEANS的统计量到数据集,关闭默认打印 */ proc means data=MBA_NODUP_APPLICANT_&TERM. missing nmiss n mean median p10 p90 fw = 8 noprint; where ENR = 1; by SRC_TYPE; var gmattotal greverb2 grequant2 greanwrt; output out=means_stats(keep=SRC_TYPE _TYPE_ _STAT_ gmattotal greverb2 grequant2 greanwrt) n= nmiss= mean= median= p10= p90=; run; /* 转置为长格式,方便按变量分组计算缺失率 */ proc transpose data=means_stats out=means_long(rename=(COL1=VALUE _NAME_=VAR_NAME)); by SRC_TYPE _TYPE_ _STAT_; var gmattotal greverb2 grequant2 greanwrt; run; /* 合并n和nmiss的记录,计算缺失率 */ proc sort data=means_long; by SRC_TYPE VAR_NAME; run; data means_with_rate; merge means_long(where=(_STAT_='N') rename=(VALUE=N)) means_long(where=(_STAT_='NMISS') rename=(VALUE=NMISS)); by SRC_TYPE VAR_NAME; /* 避免除以0的情况,当总观测数为0时缺失率设为缺失值 */ if N + NMISS > 0 then MISSING_RATE = NMISS / (N + NMISS); else MISSING_RATE = .; /* 保留原统计量记录,再新增缺失率的记录 */ output; _STAT_ = 'MISSING_RATE'; VALUE = MISSING_RATE; output; run; /* 转置回宽格式,和原PROC MEANS输出结构一致 */ proc transpose data=means_with_rate out=final_results(drop=_NAME_) prefix=; by SRC_TYPE _TYPE_ _STAT_; id VAR_NAME; var VALUE; run; /* 打印最终结果 */ proc print data=final_results; run;
方法2:用PROC SUMMARY自定义统计量直接计算
PROC SUMMARY比PROC MEANS更灵活,可以直接通过表达式统计缺失数,再计算缺失率:
proc summary data=MBA_NODUP_APPLICANT_&TERM. missing fw=8; where ENR = 1; class SRC_TYPE; /* 等价于PROC MEANS的by语句,注意class会输出汇总行,可通过_TYPE_筛选 */ var gmattotal greverb2 grequant2 greanwrt; output out=summary_stats /* 输出原有需要的统计量 */ n= nmiss= mean= median= p10= p90= /* 自定义统计:统计每个变量的缺失数(表达式(var=.)返回1表示缺失,0表示非缺失,sum后就是缺失总数) */ sum( (gmattotal=. ) )=gmattotal_miss sum( (greverb2=. ) )=greverb2_miss sum( (grequant2=. ) )=grequant2_miss sum( (greanwrt=. ) )=greanwrt_miss /* 输出每个变量的非缺失数 */ n=gmattotal_n greverb2_n grequant2_n greanwrt_n; run; /* 计算缺失率并整理数据集 */ data final_summary; set summary_stats; where _TYPE_=1; /* 筛选出按SRC_TYPE分组的统计结果,排除整体汇总行 */ /* 计算每个变量的缺失率 */ gmattotal_missing_rate = gmattotal_miss / (gmattotal_miss + gmattotal_n); greverb2_missing_rate = greverb2_miss / (greverb2_miss + greverb2_n); grequant2_missing_rate = grequant2_miss / (grequant2_miss + grequant2_n); greanwrt_missing_rate = greanwrt_miss / (greanwrt_miss + greanwrt_n); /* 删除中间计算变量 */ drop gmattotal_miss greverb2_miss grequant2_miss greanwrt_miss gmattotal_n greverb2_n grequant2_n greanwrt_n; run; /* 打印结果 */ proc print data=final_summary; run;
内容的提问来源于stack exchange,提问作者Gary Glasspool
相关产品推荐
相关产品推荐

