【问题标题】:SAS Remove OutliersSAS 删除异常值
【发布时间】:2016-01-21 00:01:31
【问题描述】:

我正在寻找 SAS 中的宏或其他东西,它可以帮助我从数据集中隔离异常值。我将异常值定义为:上界:Q3+1.5(IQR) 下界: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 数据集中的异常值。我找到了一些宏,但在使用宏时没有运气。有几个有一个我没有的类变量。任何想法如何分离我的数据?

【问题讨论】:

  • 异常值没有标准定义。您需要定义您的规则,然后您可以过滤掉观察结果。什么是异常值,可能属于 stats.stackexchange.com 上的一个问题
  • 酷。我正在寻找一个简单的宏,它可以根据这个定义找到以下异常值:Upperbound: Q3+1.5(IQR) Lowerbound: Q1-1.5(IQR)。
  • 您可以在此处修改代码,但这不是一种有效的方法。 gist.github.com/statgeek/31316a678433a1db8136

标签: sas outliers


【解决方案1】:

这是我不久前编写的一个宏,用于执行此操作,但规则略有不同。我已对其进行了修改以满足您的标准 (1.5)。

  1. 使用 proc 方法计算 Q1/Q3 和 IQR (QRANGE)
  2. 根据规则构建宏以设置上限
  3. 使用调用执行和边界设置调用宏,使用步骤 1 的输出。

    *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;
    

【讨论】:

  • 你能告诉我数据上限来自哪里吗?宏观上上下下,这些是信心吗?谢谢。
  • 数据上限作为样本生成。它用于执行宏的最后一个数据空步骤中的宏执行。您应该能够按原样运行代码以帮助跟踪问题。
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2012-08-11
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多