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
中,他们将绘制在顶部,即使它们应该在它后面。
我是一个 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
中,他们将绘制在顶部,即使它们应该在它后面。