我正在尝试使用公式z
和x
功能,使y
的平滑表面与z ~ s(x, y)
和gam
相符
在mgcv
包中。我的目标是根据z
和x
的新值预测回复y
。
在我的实际情况中,z
应该是正数,否定z
将毫无意义。但是,预测z
s
有时是负面的。似乎对于某些地区,训练数据中没有足够的点来估算z
准确。
我的问题是:有没有办法在z
平滑期间指定gam
的下限,以便后来我不会得到否定z
s使用predict
?
以下是重现此问题的最小示例。
library(mgcv)
x <- seq(0.1, 1, by = 0.01)
y <- seq(0.1, 1, by = 0.01)
dtt <- expand.grid(x = x, y = y)
set.seed(123)
dtt$xp <- dtt$x + rnorm(nrow(dtt)) / 100
dtt$yp <- dtt$y + rnorm(nrow(dtt)) / 100
dtt$z <- 1 / (dtt$xp^2 + dtt$yp^2)
m <- sample.int(nrow(dtt), 3000)
dtt.train <- dtt[m, ]
dtt.test <- dtt[!(1:nrow(dtt) %in% m), ]
fit <- gam(z ~ s(x, y), data = dtt.train)
p <- predict(fit, newdata = dtt.test)
plot(dtt.test$z, p, xlab = 'Real', ylab = 'Predicted', pch = 19, col = 1 + (p < 0))
abline(h = 0, v = 0)
正如你所看到的,红点。实际值是正数但预测值是负值。