填补缺失值

R 中的时间序列数据处理

Harrison Brown

Graduate Researcher in Geography

规则与非规则时间序列

规则型时间序列:

  • 无缺失或 NA
  • 间隔等距

现实问题:

  • 传感器/设备故障
  • 天气影响

聚合:

  • 重新采样为更低时间分辨率
  • 信息减少
  • 如:日值求和成月度

插补:

  • 填补缺失值
  • 估值方法各异
R 中的时间序列数据处理

插补

Mauna Loa 数据集的部分图。该版本存在缺失点,导致曲线上出现"空洞",即 NA 值。

上图的放大版。折线中的缺口更清晰。

R 中的时间序列数据处理

用 zoo 插补数值

zoo 的 na 点函数:

  • zoo::na.fill()

  • zoo::na.locf()

  • zoo::na.approx()

R 中的时间序列数据处理

识别缺失值

observations
2017-01-01 NA
2017-01-02  2
2017-01-03  2
2017-01-04  2
2017-01-05  4
2017-01-06  2
2017-01-07 NA
2017-01-08  1
2017-01-09  2
2017-01-10  2
...
sum(is.na(observations))
[1] 23
R 中的时间序列数据处理

na.fill

observations
2017-01-01 NA
2017-01-02  2
2017-01-03  2
2017-01-04  2
2017-01-05  4
...
table(observations, useNA = 'ifany')
   1    2    3    4    5    6 <NA> 
  43   29   17   13    1    2   23

一张虚构时间序列图,y 轴为每日"observations"数量。图中有间断,由数据集中的缺失 NA 值导致。

R 中的时间序列数据处理

na.fill

observations_fill <-
  na.fill(object = observations,
          fill = 0)

table(observations_fill)
 0  1  2  3  4  5  6 
23 43 29 17 13  1  2
autoplot(observations_fill)

该图为"每日 observations"图的"填充版"——使用常数填充法将缺失 NA 值替换为 0。

R 中的时间序列数据处理

na.locf

autoplot(scores)
Warning message:
Removed 12 row(s) containing
missing values (geom_path).

虚构"月度测试分数"时间序列图。折线戛然而止,表示之后存在缺失 NA 值。数据范围 2005–2008,总体上升;2007 年后缺失。

scores_locf <- na.locf(scores)
autoplot(scores_locf)

使用 LOCF(上一个观测前推)得到的"月度测试分数"填充版。2007 年后用最近的非 NA 值替代。

R 中的时间序列数据处理

线性插值

na.approx()

"线性插值"概念动画的第 1 张。示意图含 x、y 轴与折线,左右两段中间有大空缺,表示 NA 值。

R 中的时间序列数据处理

线性插值

na.approx()

"线性插值"概念动画第 2 张。两段数据间以红色虚线相连,表示用相邻的非 NA 值线性连接跨越缺失段。

R 中的时间序列数据处理

线性插值

na.approx()

"线性插值"概念动画第 3 张。红色虚线改为黑色实线,表示缺失值已用线性插值替换。

R 中的时间序列数据处理

na.approx

maunaloa_approx <-
  na.approx(maunaloa_missing)

autoplot(maunaloa_approx) +
  labs(
    x = "Index",
    y = "CO2 Concentration",
    title = "Approximated Data Points"
  )

Mauna Loa 时间序列图,缺失 NA 值已用线性插值"填补"。几乎难以分辨原缺失位置,显示该方法较准确。

R 中的时间序列数据处理

Passons à la pratique !

R 中的时间序列数据处理

Preparing Video For Download...