【问题标题】:SAS Finding Median without PROC MEANSSAS 在没有 PROC MEANS 的情况下找到中位数
【发布时间】:2013-12-08 00:38:39
【问题描述】:

我有一个数据集(已按血压变量排序)

Blood Pressure

87

99

99

109

111

112

117

119

121

123

139

143

145

151

165

198

我需要在不使用 proc 方法的情况下找到中位数。 现在对于这个数据,有 16 个观测值。中位数为 (119+121)/2 = 120。

无论有多少观察值,我如何编写代码以便始终能够找到中位数。适用于偶数观察和奇数观察的代码。

当然,PROC 方式是不允许的。

谢谢。

【问题讨论】:

    标签: sas


    【解决方案1】:

    我为此使用了 FCMP 函数。这是我个人库中的通用分位数函数。由于中位数是 50% 的平铺,这将起作用。

    options cmplib=work.fns;
    data input;
    input BP;
    datalines;
    87
    99
    99
    109
    111
    112
    117
    119
    121
    123
    139
    143
    145
    151
    165
    198 
    ;run;
    
    proc fcmp outlib=work.fns.fns;
    function qtile_n(p, arr[*], n);
        alphap=1;
        betap=1;
    
        if n > 1 then do;
            m = alphap+p*(1-alphap-betap);
            i = floor(n*p+m);
            g = n*p + m - i;
            qp = (1-g)*arr[i] + g*arr[i+1];
        end;
        else 
            qp = arr[1];
        return(qp);
    endsub;
    quit;
    
    proc sql noprint;
    select count(*) into :n from input;
    quit;
    
    data _null_;
    set input end=last;
    array v[&n] _temporary_;
    
    v[_n_] = bp;
    
    if last then do;
        med = qtile_n(.5,v,&n);
        put med=;
    end;
    run;
    

    【讨论】:

      【解决方案2】:

      假设你有一个名为 HAVE 的数据集,按变量 BP 排序,你可以试试这个:

      data want(keep=median);
        if mod(nobs,2) = 0 then do; /* even number if records in data set */
           j = nobs / 2;
           set HAVE(keep=bp) point=j nobs=nobs;
           k = bp;  /* hold value in temp variable */
           j + 1;
           set HAVE(keep=bp) point=j nobs=nobs;
           median = (k + bp) / 2;
           end;
        else do;
           j = round( nobs / 2 );
           set HAVE(keep=bp) point=j nobs=nobs;
           median = bp;
           end;
         put median=; /* if all you want is to see the result */
         output;      /* if you want it in a new data set */
         stop;        /* stop required to prevent infinite loop */
      run;
      

      这是“老式”代码;我确信有人可以展示另一种使用哈希对象的解决方案,这可能会消除首先对数据进行排序的要求。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2020-02-25
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多