我在Windows 10 x64上使用R版3.3.3中的'pracma'软件包(v 2.0.7)中的interp1
。
我想在xi
超出x
范围时返回NA。这是一个基本问题,但我尝试在网上查找,找不到我想要的内容。
interp1
用于拥有此功能('extrap'
)? Doc for version 0.7
#library(pracma)
x = c(2,4,5,6,8,9)
y = c(0.3,0.5,0.4,0.7,0.3,0.2)
xi = c(1,2,4,6,8)
yi = interp1(x,y,xi,method = "linear")
# my error message:
Error in interp1(x, y, xi, method = "linear") :
Points 'xi' outside of range of argument 'x'.
我如何检索yi
而不是错误,以便在xi
超出x
范围的一端说明NA?
例如,当我在MatLab中执行相同的代码时,使用它的interp1
函数。我得到一个推断。
yi = interp1(x,y,xi,'linear','extrap')
yi = 0.2 0.3 0.5 0.7 0.3
当我删除'extrap'
条款时,我得到一个NaN:
yi = NaN 0.3 0.5 0.7 0.3
有没有办法在R中实现等效而不重写interp1
函数?
答案 0 :(得分:0)
正如?interp1
会告诉你(强调我的):
xi:数字向量;计算插值的点; 所有点必须位于'min(x)'和'max(x)'之间。
因此,如果xi
超出该范围,则必须为自己编写代码。
以下是一个示例,我在其中定义了一个简短的新函数interp2
,为NA
之外的xi
值提供了range(x)
。
# Your sample data
x <- c(2,4,5,6,8,9);
y <- c(0.3,0.5,0.4,0.7,0.3,0.2);
xi <- c(1,2,4,6,8);
# New function interp2
interp2 <- function(x, y, xi = x, ...) {
yi <- rep(NA, length(xi));
sel <- which(xi >= range(x)[1] & xi <= range(x)[2]);
yi[sel] <- interp1(x = x, y = y, xi = xi[sel], ...);
return(yi);
}
yi <- interp2(x, y, xi, method = "linear");
#[1] NA 0.3 0.5 0.7 0.3
如果您查看样本数据,可能会使用大粒度的盐进行任何插值结果。更一般地说,更健壮的方法是拟合线性模型,然后您可以使用该模型来预测任何新值x
(包括不确定性)
ynew <- predict(lm(y ~ x), data.frame(x = xi));
# 1 2 3 4 5
#0.484 0.466 0.430 0.394 0.358
对于您的样本数据,线性拟合显然不是很好。
或者,您也可以根据局部多项式回归拟合(LOESS)获得预测。这将为您提供与pracma::interp1
类似的结果(忽略源于数据点太少的警告)。
ynew <- predict(loess(y ~ x), data.frame(x = xi));
# 1 2 3 4 5
# NA 0.3 0.5 0.7 0.3