尝试step.Gam函数时出现“无效的“方法””错误

时间:2019-01-31 11:40:54

标签: r distance sampling gam

我有一个gam函数,其中包含许多协变量,我想简化一下(找到最小模型)

我使用了dsm函数来模拟跨线段的物种密度与协变量的关系。而且效果很好! 但这是协变量太多的最大模型,我想自动减少它们的数量。因此,我尝试使用gam::step.Gam函数。 (我还使用了gam.scope函数来确保我正确执行了所有操作。)

DSM代码:

GamModel = dsm(
  ddf.obj=PreparedDdf, 
  formula = D ~ x + y + Cov1 + Cov2 +...+ Covn factor1+ factor2+...+factorn,
  family=gaussian(link='identity'), 
  group=FALSE,
  engine='gam',
  convert.units=1,
  segment.data=segment.df, 
  observation.data=observation.df
)

step.Gam代码:

GamScope=gam.scope(segment.df[,c(5:6,11:16)], response=1, smoother="s", arg=NULL, form=TRUE)
MinModel = step.Gam(GamModel, GamScope, trace=TRUE, direction="backward")

我希望获得最小模型,相反,它会给我以下错误:

  

gam中的错误(公式= D〜x + Cov1 + Cov2 + Cov3,:无效的'方法':REML

我不明白为什么会这样!我尝试了不同的方法(GACV.Cp,ML),但遇到了相同类型的错误(无效方法:GACV.Cp等) 为什么会这样呢?是因为它是由dsm函数生成的gam模型吗? 更重要的是,如何自动最小化模型?

(当我在engine='glm'函数中使用'gam'而不是dsm时,我尝试使用stats::step函数来找到可以工作的最小模型,但是结果似乎有点恶心...所以我想使用gam引擎)

1 个答案:

答案 0 :(得分:1)

gam 软件包不适合使用REML或您声明的其他选项的模型。这些是 mgcv 软件包中gam()函数的选项。

methodgam::gam()参数唯一允许的选项是:

  1. "glm.fit",这是默认设置,并且
  2. "model.frame",它实际上并没有执行任何操作,因为它指示函数只是吐出由公式得出的模型框架。

区分这两个都提供gam()函数的软件包非常重要。它们是估算GAM的非常不同的方法。

在使用dsm()时,将使用mgcv::gam()而不是gam::gam()进行拟合,在这种情况下,无法将gam::step.gam()函数应用于模型。

我相信dsm()的作者建议您对select = TRUE使用mgcv::gam()参数,您可以在使用dsm()时提供该参数,并将其传递给gam()。这将对模型中的平滑项增加额外的罚款,以便可以将其从模型中缩小。