【问题标题】: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 选项很少使用。”