【问题标题】:Linear Interpolation on missing values at the end of the period期末缺失值的线性插值
【发布时间】:2019-12-19 08:46:14
【问题描述】:

这是一个数据集示例:

data data;
   input group $ date value;
   datalines;
A 2001 1.5
A 2002 2.6
A 2003 2.8
A 2004 2.9
A 2005 .
B 2001 0.1
B 2002 0.6
B 2003 0.7
B 2004 1.4
B 2005 .
C 2001 4.7
C 2002 4.6
C 2003 4.8
C 2004 5.0
C 2005 .
;
run;

我想使用线性插值替换每组变量“value”的缺失值。

我尝试使用 proc expand :

proc expand data=data method = join out=want;
    by group;
    id date;
    convert value;
run;

但它不会替换输出数据库中的任何值。

知道我做错了什么吗?

【问题讨论】:

    标签: sas linear-interpolation


    【解决方案1】:

    这里有三种方法可以做到这一点。您丢失的数据位于该系列的末尾。您实际上是在用几个点进行预测。 proc expand 对此并不好,但为了填补缺失值,这些是一些可用的选项。

    1.过程扩展

    你很接近!您的缺失数据位于系列的末尾,这意味着它没有可连接的值。在这种情况下,您需要使用 extrapolate 选项。如果两个数据点之间有缺失值,则不需要使用extrapolate

    proc expand data=data method = join 
                out=want
                extrapolate;
        by group;
        id date;
        convert value;
    run;
    

    2。 PROC ESM

    您可以使用指数平滑模型进行插值。我喜欢这种方法,因为它可以考虑季节性、趋势等因素。

    /* Convert Date to SAS date */
    data to_sas_date;
        set data;
        year = mdy(1,1,date);
    
        format year year4.;
    run;
    
    proc esm data=to_sas_date
             out=want
             lead=0;
        by group;
        id year interval=year;
        forecast value / replacemissing;
    run;
    

    3.处理时间序列

    这将使用均值/中值/第一/最后/等填充值。一个时间范围。首先将年份转换为 SAS 日期,如上所示。

    proc timeseries data=to_sas_date
                    out=want;
        by group;
        id year interval=year;
        var value / setmissing=average;
    run;
    

    【讨论】:

    • 回答的很详细,非常感谢,效果很好!
    【解决方案2】:

    我不太了解expand 过程,但您可以将extrapolate 添加到proc expand 语句中。

    proc expand data=data method = join out=want extrapolate;
        by group;
        id date;
        convert value;
    run;
    

    结果:

      Obs    group    date    value
    
        1      A      2001     1.5
        2      A      2002     2.6
        3      A      2003     2.8
        4      A      2004     2.9
        5      A      2005     3.0
        6      B      2001     0.1
        7      B      2002     0.6
        8      B      2003     0.7
        9      B      2004     1.4
       10      B      2005     2.1
       11      C      2001     4.7
       12      C      2002     4.6
       13      C      2003     4.8
       14      C      2004     5.0
       15      C      2005     5.2
    

    请注意here的声明

    默认情况下,PROC EXPAND 避免将值外插到序列的第一个或最后一个输入值之外,并且只在非缺失输入值范围内内插值。请注意,外插值通常不是很准确,对于 SPLINE 方法,EXTRAPOLATE 选项的结果可能非常不合理。 EXTRAPOLATE 选项很少使用。”

    【讨论】:

    • 该死,我怎么没有找到关于推断的东西,非常感谢!
    猜你喜欢
    • 2018-06-27
    • 2021-07-24
    • 1970-01-01
    • 2016-01-16
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多