使用 GAM 进行预测,使用偏移量

机器算法验证 r 广义加法模型 抵消
2022-03-25 11:26:13

我发表了一篇新文章,因为我对在 gam() 函数(mgcv 包)中使用偏移量感到非常困惑。我实际上正在使用航空调查(捕食者的观察)和二级生产模型输出来预测海洋顶级捕食者的分布。我的数据以 0.25° 分辨率网格形成,覆盖大面积区域,例如西南印度洋。已经在该网格上的几个部门进行了调查,也就是说,所有网格都没有被抽样。我的二次生产协变量来自 Lehodey 等人开发的 SEAPODYM 模型。我有一组大约 12 个协变量,并希望找到它们的最佳组合来预测捕食者的分布。

也就是说,因为我的目标是预测捕食者的分布,所以在排除了相关协变量的所有组合之后,我根据 GCV 分数进行了模型选择。我正在对观察进行建模,因此我使用了准泊松分布(过度分散的数据),每个像素的采样面积作为偏移量。我使用如下编写的模型进行了模型选择:

mod1<-gam(Y ~ offset(log(sampled area))+ covariate1 + covariate2 + covariate3 + covariate4, family=quasipoisson)

在那之前,一切都很顺利,但后来我开始在我的整个网格中预测捕食者的观察结果。使用之前的模型执行此操作会导致仅预测过采样像素。根据同事的建议,我预测使用不同的写作,认为它不会改变结果中的任何内容:

mod2<-gam(Y ~ covariate1 + covariate2 + covariate3 + covariate4, offset(log(sampled area)), family=quasipoisson)

确实,它允许我预测整个网格的观察结果,但我完全混淆了,因为我查看了模型的摘要。结果实际上完全不同,GCV 分数和已解释的偏差具有更高的值:

summary(mod1)
Family: quasipoisson 
Link function: log 

Formula:
species ~ offset(log(sampled area) + s(covariate1,k=4) + s(covariate2,k=4)
     + s(covariate3,k=4) + s(covariate4,k=4)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.12268    0.08025  -1.529    0.127

Approximate significance of smooth terms:
                 edf Ref.df     F  p-value    
s(bathy_mnk_B) 2.722  2.951 15.89 4.83e-10 ***
s(meso_mnk_B)  2.995  3.000 17.52 3.52e-11 ***
s(bathy_mnk_P) 2.989  3.000 20.37 6.21e-13 ***
s(mmeso_mnk_P) 2.536  2.855 12.71 6.49e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

R-sq.(adj) =  0.0838   Deviance explained = 16.4%
GCV score = 22.371  Scale est. = 22.188    n = 1491


summary(mod2)
Family: quasipoisson 
Link function: log 
Formula:
species ~ s(covariate1,k=4) + s(covariate2,k=4) + s(covariate3,k=4) + 
    s(covariate4,k=4)
Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.30093    0.07884    16.5   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
Approximate significance of smooth terms:
                 edf Ref.df     F  p-value    
s(bathy_mnk_B) 2.802  2.974 17.37 5.18e-11 ***
s(meso_mnk_B)  3.000  3.000 16.35 1.86e-10 ***
s(bathy_mnk_P) 2.988  3.000 27.75  < 2e-16 ***
s(mmeso_mnk_P) 2.460  2.806 12.47 1.12e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

R-sq.(adj) =  0.0938   Deviance explained = 17.5%
GCV score = 31.809  Scale est. = 31.547    n = 1491

鉴于我的模型选择是基于 GCV 分数的,它如此变化的事实让我感到困惑,我想知道我的模型选择是否正确。我用第二种模型(Y~X1+X2,offset)重新进行了模型选择,结果选择的模型并不总是与我的第一个程序相同。

看到这里,我想知道我应该根据模型的哪个写作来进行建模和预测?

有谁可以解释一下为什么这两个模型给出了如此不同的结果?

提前感谢您的帮助和建议,

夏洛特

1个回答

首先,来自gam(我添加的粗体字体)的帮助页面:

偏移量:可用于提供模型偏移量以用于拟合。请注意,与公式中包含的偏移量不同,预测时将始终完全忽略此偏移量:这符合 lm 和 glm 的行为。

因此,对于预测,您应该使用公式规范。此外,如果您将偏移量指定为参数,而不是在公式中,则应使用等号 (=):

mod2<-gam(Y ~ covariate1 + covariate2 + covariate3 + covariate4, offset=log(sampled area), family=quasipoisson)

这应该给出与本规范完全相同的结果:

mod1<-gam(Y ~ offset(log(sampled area))+ covariate1 + covariate2 + covariate3 + covariate4, family=quasipoisson)

老实说,如果您在括号内指定偏移量,我不知道 R 计算什么,例如offset(sampled area).

希望有帮助。