SAS删除异常值

时间:2016-01-21 00:01:32

标签: sas outliers

我正在寻找一个可以帮助我从数据集中隔离异常值的SAS中的宏或东西。我将异常值定义为:Upperbound:Q3 + 1.5(IQR)Lowerbound:Q1-1.5(IQR)。我有以下SAS代码:

title 'Fall 2015';
proc univariate data = fall2015 freq;
var enrollment_count;
histogram enrollment_count / vscale = percent vaxis = 0 to 50 by 5 midpoints = 0 to 300 by 5;
inset n mean std max min range / position = ne;
run;

我想摆脱fall2015数据集中的异常值。我找到了一些宏,但是在运行宏时没有运气。有几个有一个我没有的类变量。有关如何分离我的数据的任何想法吗?

1 个答案:

答案 0 :(得分:0)

这是我前一段时间写的一个宏,它的规则略有不同。我已将其修改为符合您的标准(1.5)。

  1. 使用proc表示计算Q1 / Q3和IQR(QRANGE)
  2. 根据规则构建宏以限制
  3. 使用来自步骤1的输出,使用call execute和boundary set来调用宏。

    *Calculate IQR and first/third quartiles;
    proc means data=sashelp.class stackods n qrange p25 p75;
    var weight height;
    ods output summary=ranges;
    run;
    
    *create data with outliers to check;
    data capped; 
        set sashelp.class;
        if name='Alfred' then weight=220;
        if name='Jane' then height=-30;
    run;
    
    *macro to cap outliers;
    
    %macro cap(dset=,var=, lower=, upper=);
    
    data &dset;
        set &dset;
        if &var>&upper then &var=&upper;
        if &var<&lower then &var=&lower;
    run;
    
    %mend;
    
    
    *create cutoffs and execute macro for each variable;
    data cutoffs;
    set ranges;
    lower=p25-1.5*qrange;
    upper=p75+1.5*qrange;
    string = catt('%cap(dset=capped, var=', variable, ", lower=", lower, ", upper=", upper ,");");
    call execute(string);
    run;