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

时间:2015-12-14 18:32:05

标签: r interpolation cubic-spline

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

以下代码重现了该问题:

require(zoo)
vector <- c(NA,NA,NA,NA,NA,NA,5,NA,7,8,NA,NA)
na.spline(vector)

的输出应为:

NA NA NA NA NA NA  5  6  7  8  NA NA

这将是内部NA的插值,留下尾随的NA。但是,我得到了:

-1  0  1  2  3  4  5  6  7  8  9 10

According to the documentation,这不应该发生。有没有办法避免外推?

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

1 个答案:

答案 0 :(得分:1)

此行为似乎来自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

这是一个解决方法,使用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

修改

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

na.spline(vector) + 0*na.approx(vector, na.rm = FALSE)