使用 gam.check() 检查基本维度结果的 GAM 拟合问题
Problem with GAM fitting using gam.check() to check the basis dimension results
我正在使用 R 包 'mgcv' 创建用于预测海鸟分布的 GAM。我在解释 gam.check() 的某些模型(每个物种一个模型)的结果时遇到了一些问题。
我使用负二项式族和对数 link,样本区域的对数偏移。我有 13 个可能的预测变量。我的响应数据是来自调查的离散计数数据,它是高度零膨胀的。
在每个候选人中,我检查并发性(在整个模型中使用 0.8 作为阈值),并且我的模型项使用 summary() 很重要,(否则它们被丢弃),并且模型每次都收敛。
尽管如此,我仍然从 gam.check() 中获得了非常重要的结果。这是尽管 edf 远低于 k。
我尝试过多次增加 k,但这对结果和 edf 都没有影响,我也尝试过使用 tweedie 和零膨胀泊松 (ziP) 族,但这也没有太大影响.不过我要说的是,我的QQ剧情不怎么好看。
QQ_plot
有谁知道为什么会发生这种情况?我认为该模型不稳定,不应使用,但我不知道如何修复它。它也发生在几乎所有物种中,因此它不特定于一个文件。
这是我的模型
gam_nb <- gam(COUNT_SUM ~ s(X_MEAN_2, k=25) + s(Currents_Northward, k=25),
data=my_data,family = "nb", select=TRUE, offset=LOG_AREA_SUM, method = "REML")
这是诊断结果
Method: REML Optimizer: outer newton
full convergence after 7 iterations.
Gradient range [-0.002334867,0.0005403022]
(score 1783.03 & scale 1).
Hessian positive definite, eigenvalue range [1.846342e-06,121.4505].
Model rank = 49 / 49
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(X_MEAN_2) 24.0 11.4 0.66 <2e-16 ***
s(Currents_Northward) 24.0 11.8 0.69 0.025 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
现在看看当我增加 k 时会发生什么
gam_nb <- gam(COUNT_SUM ~ s(X_MEAN_2, k=100) + s(Currents_Northward, k=100),
data=my_data,family = "nb", select=TRUE, offset=LOG_AREA_SUM, method = "REML")
Method: REML Optimizer: outer newton
full convergence after 7 iterations.
Gradient range [-6.715822e-05,1.121576e-05]
(score 1783.004 & scale 1).
Hessian positive definite, eigenvalue range [7.32924e-06,120.848].
Model rank = 199 / 199
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(X_MEAN_2) 99.0 12.0 0.67 <2e-16 ***
s(Currents_Northward) 99.0 13.1 0.68 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
您不应该根据 summary()
输出中 terms/smooths 的类似 Wald 显着性检验保留项来进行模型选择;您注定会将估计的影响偏低(即排除时假定为 0)或偏高(因为极端 effect/functions 更可能显着,但也可能是虚假的)。
您正在使用 select = TRUE
,因此只需包括您认为对响应重要的控制变量集并拟合该单一模型,然后对其进行解释。
gam.check()
的输出是启发式的;并且只是表明模型存在一些问题。表面上你是 运行 这是为了检查基础维度,但是当项的 EDF 与最大值 (k'
) 相比较低但 p 值仍然很低时,这可能表明模型存在其他问题。您可能缺少协变量(您根据重要性排除的那些东西很可能控制现在显示为未建模依赖的响应变化)。
要检查这一点,请使用所有协变量(单独或组合)对残差进行建模,并根据协变量绘制残差。您可能还遗漏了一些您没有想到或未测量的其他协变量。那里可用的选项较少,因为您对此无能为力,除非您可以为这种未建模的“效果”引入替代项。
此外,请考虑数据中是否存在未建模的空间或时间结构或聚类(来自相同位置的重复观察)。所有这些都可能导致 gam.check()
中的启发式测试失败。
我正在使用 R 包 'mgcv' 创建用于预测海鸟分布的 GAM。我在解释 gam.check() 的某些模型(每个物种一个模型)的结果时遇到了一些问题。
我使用负二项式族和对数 link,样本区域的对数偏移。我有 13 个可能的预测变量。我的响应数据是来自调查的离散计数数据,它是高度零膨胀的。
在每个候选人中,我检查并发性(在整个模型中使用 0.8 作为阈值),并且我的模型项使用 summary() 很重要,(否则它们被丢弃),并且模型每次都收敛。 尽管如此,我仍然从 gam.check() 中获得了非常重要的结果。这是尽管 edf 远低于 k。 我尝试过多次增加 k,但这对结果和 edf 都没有影响,我也尝试过使用 tweedie 和零膨胀泊松 (ziP) 族,但这也没有太大影响.不过我要说的是,我的QQ剧情不怎么好看。
QQ_plot
有谁知道为什么会发生这种情况?我认为该模型不稳定,不应使用,但我不知道如何修复它。它也发生在几乎所有物种中,因此它不特定于一个文件。
这是我的模型
gam_nb <- gam(COUNT_SUM ~ s(X_MEAN_2, k=25) + s(Currents_Northward, k=25),
data=my_data,family = "nb", select=TRUE, offset=LOG_AREA_SUM, method = "REML")
这是诊断结果
Method: REML Optimizer: outer newton
full convergence after 7 iterations.
Gradient range [-0.002334867,0.0005403022]
(score 1783.03 & scale 1).
Hessian positive definite, eigenvalue range [1.846342e-06,121.4505].
Model rank = 49 / 49
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(X_MEAN_2) 24.0 11.4 0.66 <2e-16 ***
s(Currents_Northward) 24.0 11.8 0.69 0.025 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
现在看看当我增加 k 时会发生什么
gam_nb <- gam(COUNT_SUM ~ s(X_MEAN_2, k=100) + s(Currents_Northward, k=100),
data=my_data,family = "nb", select=TRUE, offset=LOG_AREA_SUM, method = "REML")
Method: REML Optimizer: outer newton
full convergence after 7 iterations.
Gradient range [-6.715822e-05,1.121576e-05]
(score 1783.004 & scale 1).
Hessian positive definite, eigenvalue range [7.32924e-06,120.848].
Model rank = 199 / 199
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(X_MEAN_2) 99.0 12.0 0.67 <2e-16 ***
s(Currents_Northward) 99.0 13.1 0.68 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
您不应该根据 summary()
输出中 terms/smooths 的类似 Wald 显着性检验保留项来进行模型选择;您注定会将估计的影响偏低(即排除时假定为 0)或偏高(因为极端 effect/functions 更可能显着,但也可能是虚假的)。
您正在使用 select = TRUE
,因此只需包括您认为对响应重要的控制变量集并拟合该单一模型,然后对其进行解释。
gam.check()
的输出是启发式的;并且只是表明模型存在一些问题。表面上你是 运行 这是为了检查基础维度,但是当项的 EDF 与最大值 (k'
) 相比较低但 p 值仍然很低时,这可能表明模型存在其他问题。您可能缺少协变量(您根据重要性排除的那些东西很可能控制现在显示为未建模依赖的响应变化)。
要检查这一点,请使用所有协变量(单独或组合)对残差进行建模,并根据协变量绘制残差。您可能还遗漏了一些您没有想到或未测量的其他协变量。那里可用的选项较少,因为您对此无能为力,除非您可以为这种未建模的“效果”引入替代项。
此外,请考虑数据中是否存在未建模的空间或时间结构或聚类(来自相同位置的重复观察)。所有这些都可能导致 gam.check()
中的启发式测试失败。