我想更新R素食主义者中ordisurf函数后面的GAM模型(添加随机因子)。为此,我首先构建了一个模型,该模型应与ordisurf背后的模型相同,如下所示:https://www.fromthebottomoftheheap.net/2011/06/10/what-is-ordisurf-doing/
但是,我在mgcv中制作的ordisurf和GAM模型得出的结果却截然不同。下面是带有沙丘数据的示例代码。谁能解释? GAM模型应表现出与ordisurf相似的效果吗? (重要的是在人们开始改进它之前……:))
ord <-metaMDS(dune, k=3)
surf <- ordisurf(ord, dune.env$A1, choices = c(2,3))
scrs <- data.frame(scores(ord, display = "sites", choices = c(1,2,3)))
dat <- with(dune, cbind(scrs, dune.env$A1))
mod_23 <- gam(dune.env$A1 ~ s(NMDS2, NMDS3, k = 10), data = dat)
plot.gam(mod_12, se=FALSE, cex = 1, pch = 1, col="blue")
答案 0 :(得分:1)
此类问题的最佳答案是阅读源代码,以了解实际上正在做什么。自从我写了那篇博客文章以来,我们决定调整ordisurf()
的默认设置,以反映估算GAM的良好做法,并严格选择模型。
首先,我们使用mgcv::gam()
将模型与method = 'REML'
拟合,以利用REML平滑度选择。 GCV平滑度选择(当前)是mgcv::gam()
中的默认设置,但不建议使用, mgcv 的开发者Simon Wood暗示了 mgcv 可以将默认值从method = 'GCV.Cp'
更改为method = 'REML'
。其原因是,在许多应用中已观察到GCV平滑度选择不够平滑。发生这种情况时,GCV函数的轮廓在全局最佳GCV得分附近变得非常平坦。数据中的细微差异可能会导致选择非常不同的平滑度参数,其中一些会导致平滑度不足。 REML和ML平滑度选择受此问题影响较小; REML分数的分布曲线趋于弯曲并具有明显的最小值。
第二点以及我们现在为什么使用select = TRUE
的原因是,观察结果表明GAM中的平滑度惩罚决定了估计曲面的摆动程度,而该惩罚只会影响摆动的基函数。基数展开包含两个基函数,从罚金的角度来看,它们是完全平滑的;有两个表示两个线性平面的线性2-D基函数,根据定义,它们具有零曲率(零二阶导数),因此完全不影响摆动性罚分(无论如何都是默认值,即使用估计样条曲线的曲率损失)。最终结果是,平滑度损失会一直惩罚到估计的平面表面,但不会进一步。实际上,这意味着用户可以将ordisurf()
模型的结果解释为线性表面,即使该线性表面在统计上不显着(许多用户只是看图而不是潜在的GAM)会告诉他们他们的飞机是否重要)。 select = TRUE
所做的是向平滑添加第二个惩罚,这只会影响完全平滑的基函数。这具有GAM能够从模型中完全补偿/缩小模型的效果。换句话说,它可以将表面收缩为平坦的水平表面,零序===零序排列与响应变量之间的关系为零。
总的来说,我认为这些选项可以最好地防止用户误报。
如果您将gam()
的呼叫更改为:
mod_23 <- gam(dune.env$A1 ~ s(NMDS2, NMDS3, k = 10), data = dat,
method = 'REML', select = TRUE)
然后您将获得与ordisurf()
产生的输出相同的输出:
r$> mod_23
Family: gaussian
Link function: identity
Formula:
dune.env$A1 ~ s(NMDS2, NMDS3, k = 10)
Estimated degrees of freedom:
0.285 total = 1.28
REML score: 43.25057
r$> surf
Family: gaussian
Link function: identity
Formula:
y ~ s(x1, x2, k = 10, bs = "tp", fx = FALSE)
Estimated degrees of freedom:
0.285 total = 1.28
REML score: 43.25057