4

我有一个像这样的内核函数:

x <- 1:100
y <- rnorm(100, mean=(x/2000)^2)
plot(x,y)
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10)
print(kernel$y)

如果我尝试在 x 值范围之外的某个点进行预测,它会给我NaN,因为它试图在数据之外进行推断:

x <- 1:100
y <- rnorm(100, mean=(x/2000)^2)
plot(x,y)
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, x.points=c(130))
print(kernel$y)

> print(kernel$y)
[1] NA

即使我改变range.x它也不会让步:

x <- 1:100
y <- rnorm(100, mean=(x/2000)^2)
plot(x,y)
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200) , x.points=c(130))
print(kernel$y)

> print(kernel$y)
[1] NA

我如何获得ksmooth超出数据外推的函数?我知道这在理论上是一个坏主意,但实际上这个问题一直存在。

4

1 回答 1

2

要回答您的附带问题,请查看 , 的代码ksmoothrange.x仅在x.points未提供时使用,以便解释为什么您没有看到它被使用。让我们看一下中的代码ksmooth

function (x, y, kernel = c("box", "normal"), bandwidth = 0.5, 
    range.x = range(x), n.points = max(100L, length(x)), x.points) 
{
    if (missing(y) || is.null(y)) 
        stop("numeric y must be supplied.\nFor density estimation use density()")
    kernel <- match.arg(kernel)
    krn <- switch(kernel, box = 1L, normal = 2L)
    x.points <- if (missing(x.points)) 
        seq.int(range.x[1L], range.x[2L], length.out = n.points)
    else {
        n.points <- length(x.points)
        sort(x.points)
    }
    ord <- order(x)
    .Call(C_ksmooth, x[ord], y[ord], x.points, krn, bandwidth)
}

由此我们看到,我们不需要提供x.points以确保range.x使用它。如果你运行:

x <- 1:100
y <- rnorm(100, mean=(x/2000)^2)
plot(x,y)
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200))
plot(kernel$x, kernel$y)

现在您将看到您的内核被评估超过 100(尽管没有达到 200)。增加带宽参数可以让您离 100 更远。

于 2016-05-05T00:09:31.767 回答