我有一个时间序列(波高数据),因此需要通过内插来填充空白。我在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
答案 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),并且可能需要调整模型规范...