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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:50:23