ordisurf vs mgcv:gam模型

时间:2019-06-20 21:16:34

标签: r vegan gam

我想更新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")

1 个答案:

答案 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