你可以先使用类似于gam()
的方法来进行模型拟合,然后绘制预测结果图。首先,我们可以将GAM拟合到数据上。在本例中,hp
和wt
是两个独立变量(即上图中的x
和y
轴)。而qsec
是绘制在z轴上的变量,也是模型中的因变量。
data(mtcars)
library(mgcv)
mod <- gam(qsec ~ te(hp) + te(wt) + ti(hp, wt), data=mtcars)
接下来,我们需要对模型在不同的hp
和wt
组合上进行一些预测。最简单的方法是为每个变量制作一个序列,从它们的最小值到最大值。以下命令就是这样做的,它将制作一个由25个均匀间隔的值组成的序列,从每个自变量的最小值到最大值。
hp.seq <- seq(min(mtcars$hp, na.rm=TRUE), max(mtcars$hp, na.rm=TRUE), length=25)
wt.seq <- seq(min(mtcars$wt, na.rm=TRUE), max(mtcars$wt, na.rm=TRUE), length=25)
接下来,我们可以创建一个生成预测的函数。由于我们将在下面使用outer()
,所以函数应该有两个输入,x
和y
。我们要传递的x-y对是用于预测的hp
和wt
的值。该函数创建一个数据帧,其中包含一个观察值和两个变量-hp
和wt
。它使用该新数据帧使用predict()
函数从模型生成单个预测。
predfun <- function(x,y){
newdat <- data.frame(hp = x, wt=y)
predict(mod, newdata=newdat)
}
接下来,我们将该预测函数应用于我们之前生成的数据序列。我们使用
outer()
函数对每个
hp.seq
和
wt.seq
组合进行外积运算,生成一个 25x25 的预测值矩阵。将
predfun
包装在
Vectorize()
中可防止出现替换长度问题的错误。
fit <- outer(hp.seq, wt.seq, Vectorize(predfun))
最后,我们可以在 plot_ly
中将所有内容组合在一起。我们使用 add_marker()
添加点,并使用 add_surface
添加预测。
plot_ly() %>%
add_markers(x = ~mtcars$hp, y=mtcars$wt, z=mtcars$qsec) %>%
add_surface(x = ~hp.seq, y = ~wt.seq, z = t(fit))
![enter image description here](https://istack.dev59.com/8Ib0p.webp)