在R中使用interp1

时间:2017-11-14 21:55:39

标签: r

我在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函数?

1 个答案:

答案 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