如何推断超出传递给 `ksmooth` 的 x 点?
How to extrapolate beyond the x points passed to `ksmooth`?
我有一个这样的内核函数:
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
函数外推数据?我知道这在理论上是个坏主意,但在实践中这个问题一直存在。
为了回答你的附带问题,查看 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)
}
由此可见,我们需要不提供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 更远。
我有一个这样的内核函数:
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
函数外推数据?我知道这在理论上是个坏主意,但在实践中这个问题一直存在。
为了回答你的附带问题,查看 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)
}
由此可见,我们需要不提供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 更远。