如何使用 na.spline() 防止外推

Cap*_*rog 5 interpolation r cubic-spline

na.spline()我在使用包中的功能时遇到问题zoo。尽管文档明确指出这是一个插值函数,但我得到的行为包括外推。

以下代码重现了该问题:

require(zoo)
vector <- c(NA,NA,NA,NA,NA,NA,5,NA,7,8,NA,NA)
na.spline(vector)
Run Code Online (Sandbox Code Playgroud)

其输出应该是:

NA NA NA NA NA NA  5  6  7  8  NA NA
Run Code Online (Sandbox Code Playgroud)

这将是内部 NA 的插值,将尾随 NA 保留在适当的位置。但是,我得到的是:

-1  0  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

根据文档,这不应该发生。有什么方法可以避免外推吗?

我认识到在我的示例中,我可以使用线性插值,但这是 MWE。虽然我不一定会使用 na.spline() 函数,但我需要某种方法来使用三次样条进行插值。

Mat*_*rde 4

这种行为似乎来自函数stats::spline,例如,

spline(seq_along(vector), vector, xout=seq_along(vector))$y
# [1] -1  0  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

这是一种解决方法,使用严格插值的事实na.approx

replace(na.spline(vector), is.na(na.approx(vector, na.rm=FALSE)), NA)
# [1] NA NA NA NA NA NA  5  6  7  8 NA NA
Run Code Online (Sandbox Code Playgroud)

编辑

正如 @G.Grothendieck 在下面的评论中建议的那样,另一种无疑更高效的方法是:

na.spline(vector) + 0*na.approx(vector, na.rm = FALSE)
Run Code Online (Sandbox Code Playgroud)

  • 或 `na.spline(向量) + 0*na.approx(向量, na.rm = FALSE)` (6认同)