用加权线性插值填充NA

时间:2019-06-19 18:19:22

标签: r time-series interpolation zoo

我有一个时间序列(波高数据),因此需要通过内插来填充空白。我在na.approx包中找到了zoo函数,但是当丢失的观测值比另一个观测值更接近一个观测值时,我还没有找到一种将其考虑在内的方法。

示例:

library(zoo)
test = data.frame(Wave_Height = c(1.2, NA, 0.5), Data = 
    as.POSIXct(c("2019-01-01 00:00", "2019-01-01 05:00", "2019-01-01 06:00"), 
      format = "%Y-%m-%d %H:%M"))
> test
  Wave_Height                Data
1         1.2 2019-01-01 00:00:00
2          NA 2019-01-01 05:00:00
3         0.5 2019-01-01 06:00:00

test$Wave_Height = na.approx(test$Wave_Height)
> test
  Wave_Height                Data
1        1.20 2019-01-01 00:00:00
2        0.85 2019-01-01 05:00:00
3        0.50 2019-01-01 06:00:00

我觉得应该在某个地方有一个权重参数,但是尽管我找不到文档,但仍在扫描。我正在寻找这样的结果:

> test
  Wave_Height                Data
1        1.20 2019-01-01 00:00:00
2        0.62 2019-01-01 05:00:00
3        0.50 2019-01-01 06:00:00

1 个答案:

答案 0 :(得分:0)

也许您可以进行简单的线性回归?

mod <- lm(Wave_Height ~ Data, test[complete.cases(test), ])
test$Wave_Height[is.na(test$Wave_Height)] <- predict(mod, newdata = test[!complete.cases(test), ])

这里是使用广义加性模型的解决方案,因此不假定关系具有线性:

library(mgcv)
mod <- gam(Wave_Height ~ s(Data), data=test[complete.cases(test), ])
test$Wave_Height[is.na(test$Wave_Height)] <- predict(mod, newdata = test[!complete.cases(test), ])

但是您需要稍微更改数据格式(请参阅here),并且可能需要调整模型规范...