如何使用 na.spline() 防止外推
How to prevent extrapolation using na.spline()
我在使用 zoo
包中的 na.spline()
函数时遇到问题。尽管文档明确指出这是一个 interpolation 函数,但我得到的行为包括外推。
以下代码重现了该问题:
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() 函数,但我需要一些方法来使用三次样条进行插值。
此行为似乎来自 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)
我在使用 zoo
包中的 na.spline()
函数时遇到问题。尽管文档明确指出这是一个 interpolation 函数,但我得到的行为包括外推。
以下代码重现了该问题:
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() 函数,但我需要一些方法来使用三次样条进行插值。
此行为似乎来自 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)