R plot gam 3D surface 以显示实际响应值

R plot gam 3D surface to show also actual response values

我是一个 R 新手,面临以下挑战。 我将在这里分享我的代码,但应用于不同的数据框,因为我无法共享原始数据框。 这是我的代码:

fit = gam( carb ~ te(cyl, hp,   k=c(3,4)), data = mtcars)
plot(fit,rug=F,pers=T,theta=45,main="test")

使用我公司的数据,这会生成一个漂亮的表面,其预测值位于 Z 轴上。 我想将实际响应值添加为 Z 轴上的红点,以便我可以看到预测值 under/over 估计实际响应的位置。 你知道我应该在 plot 中添加什么参数才能做到这一点吗? 非常感谢

正如@李哲源在评论中指出的,你不应该在这里使用plot,因为它不够灵活。这是基于参考问题 .

的版本
# First, get the fit
library(mgcv)
fit <- gam( carb ~ te(cyl, hp,   k=c(3,4)), data = mtcars)

# Now expand it to a grid so that persp will work
steps <- 30
cyl <- with(mtcars, seq(min(cyl), max(cyl), length = steps) )

hp <-  with(mtcars, seq(min(hp), max(hp), length = steps) )
newdat <- expand.grid(cyl = cyl, hp = hp)
carb <- matrix(predict(fit, newdat), steps, steps)

# Now plot it
p <- persp(cyl, hp, carb, theta = 45, col = "yellow")

# To add the points, you need the same 3d transformation
obs <- with(mtcars, trans3d(cyl, hp, carb, p))
pred <- with(mtcars, trans3d(cyl, hp, fitted(fit), p))
points(obs, col = "red", pch = 16)

# Add segments to show where the points are in 3d
segments(obs$x, obs$y, pred$x, pred$y)

产生以下情节:

您可能不想根据观察到的数据做出如此远的预测。您可以将 NA 值放入 carb 以避免这种情况。此代码执行此操作:

exclude <- exclude.too.far(rep(cyl,steps), 
                           rep(hp, rep(steps, steps)), 
                           mtcars$cyl, 
                           mtcars$hp, 0.15)  # 0.15 chosen by trial and error
carb[exclude] <- NA
p <- persp(cyl, hp, carb, theta = 45, col = "yellow")
obs <- with(mtcars, trans3d(cyl, hp, carb, p))
pred <- with(mtcars, trans3d(cyl, hp, fitted(fit), p))
points(obs, col = "red", pch = 16)
segments(obs$x, obs$y, pred$x, pred$y)

产生这个情节:

最后,您可能想使用 rgl 包来获取动态图。经过与上述相同的操作后,使用此代码进行绘图:

library(rgl)
persp3d(cyl, hp, carb, col="yellow", polygon_offset = 1)
surface3d(cyl, hp, carb, front = "lines", back = "lines")
with(mtcars, points3d(cyl, hp, carb, col = "red"))
with(mtcars, segments3d(rep(cyl, each = 2), 
                        rep(hp, each = 2), 
                        as.numeric(rbind(fitted(fit),
                                   carb))))

这是一种可能的观点:

如果你想换个角度看,可以用鼠标旋转这个。另一个优点是应该被表面隐藏的点确实被隐藏了;在 persp 中,他们将绘制在顶部,即使它们应该在它后面。