R 如何在传递给“ksmooth”的x点之外进行推断?

R 如何在传递给“ksmooth”的x点之外进行推断?,r,smooth,kernel-density,extrapolation,R,Smooth,Kernel Density,Extrapolation,我有这样一个内核函数: x <- 1:100 y <- rnorm(100, mean=(x/2000)^2) plot(x,y) kernel <- ksmooth(x,y, kernel="normal", bandwidth=10) print(kernel$y) 即使我更改range.x它也不会移动: x <- 1:100 y <- rnorm(100, mean=(x/2000)^2) plot(x,y) kernel <- ksmooth(x,y

我有这样一个内核函数:

x <- 1:100
y <- rnorm(100, mean=(x/2000)^2)
plot(x,y)
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10)
print(kernel$y)
即使我更改
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

x要回答您的附带问题,请查看
ksmooth
的代码,
range.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)
}

现在,您将看到内核的计算值超过了100(尽管不超过200)。增加带宽参数可以使您离100更远。

我想一个次要问题是:
range.x
做什么?文档似乎表明它是“输出中要覆盖的点的范围”。但是它似乎对这里的输出没有影响?您是否考虑过使用bkde2D{kernsooth}来代替它。默认情况下,每个方向的带宽外推1.5倍。进一步推断你的风险,确保你了解你正在做的事情及其局限性。如果你真的需要外推,那么也许你应该考虑将数据拟合到一个与实际有一定关系的模型,并形成一个更合理的外推基础。问题是,在没有外推的情况下,确实很难运行某种k-折叠交叉验证,因为每当我将第k个折叠拆分为训练和测试时,一些测试示例不可避免地超出了训练示例的范围。我是唯一一个对此感到沮丧的人吗?让我们知道这是否对你更有效。请注意,ksmooth的文档甚至声明“此函数的实现纯粹是为了与S兼容,尽管它远没有S函数慢。其他软件包中有更好的内核平滑器。”
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 <- 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)