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

5

我在zoo包中使用na.spline()函数时遇到了问题。尽管文档明确说明这是一种插值函数,但我得到的结果却包括外推。

以下代码重现了这个问题:

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

根据文档,这不应该发生。有没有什么方法可以避免外推?
我认识到在我的例子中,我可以使用线性插值,但这是一个最小工作示例。虽然我不一定要使用na.spline()函数,但我需要一种使用三次样条插值的方法。

问题似乎出在 stats::spline 上:spline(seq_along(vector), vector, xout=seq_along(vector))。它与 approx 不一致,后者严格执行插值。 - Matthew Plourde
Achim已经在zoo的开发版本中纠正了文档。由于问题不在zoo本身,而且zoo试图与R核心保持一致,因此代码实际上没有任何变化。 - G. Grothendieck
1个回答

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

以下是解决方法,利用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)

6
na.spline(vector)表示对向量进行样条插值,而na.approx(vector, na.rm = FALSE)则表示使用近似法来填补缺失值,两者相加后结果仍为向量。 - G. Grothendieck
@G.Grothendieck 的妙招! - Lazarus Thurston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接