我试图找到一种合理的方法来计算 GAM 模型中每个预测变量所解释的偏差,并且需要在我的计算中输入一些信息。
按照 Simon Wood 在线程https://stat.ethz.ch/pipermail/r-help/2009-July/397343.html上的示例,假设我有以下数据:
set.seed(1745)
dat <- gamSim(1,n=400,dist="normal",scale=2)
这些数据包括响应变量 y 和预测变量 x0、x1、x2 和 x3。使用这些数据,我拟合了以下 GAM 模型:
b <- gam(y ~ s(x0, k=4) + s(x1,k=4) + s(x2,k=4) + s(x3,k=4),
gamma = 1.4,
data=dat)
使用 command plot(b, page = 1)
,模型拟合如下所示:
目标是计算该模型中每个预测变量解释的偏差百分比。
首先,我计算模型解释的整体偏差,如下所示:
bint <- gam(y ~ 1,data=dat)
overall.deviance.explained <- (deviance(bint) - deviance(b))/deviance(bint)
percent.overall.deviance.explained <- round(overall.deviance.explained*100)
percent.overall.deviance.explained
这给出了 74%,这正是 summary(b) 报告的内容。到现在为止还挺好。
请注意,用于估计模型中 x0、x1、x2 和 x3 的平滑、非线性效应的平滑参数由 b$sp 给出:
b$sp
另请注意,我对每个平滑使用 k = 4 并将 gamma 设置为 1.4 以防止过度拟合。
接下来,我计算模型 b 中由 x2 解释的偏差百分比,如下所示:
# fit an alternative model b2 without x2, but use the same smoothing parameters for the
# smooth terms preserved in the model as used in the original model b
b2 <- gam(y ~ s(x0, k = 4) + s(x1, k = 4) + s(x3, k = 4),
sp = b$sp[-3], # omit smoothing parameter for s(x2) in the original model b,
gamma = 1.4,
data = dat)
partial.deviance.explained.by.x2 <- (deviance(b2) - deviance(b))/deviance(bint)
percent.partial.deviance.explained.by.x2 <-
round(partial.deviance.explained.by.x2 * 100)
percent.partial.deviance.explained.by.x2
以这种方式计算部分偏差百分比的想法来自参考“城市生物多样性的模式可以使用绿色基础设施的简单测量来预测吗?” 作者:Brunbjerg 等人,城市林业与城市绿化 32 (2018) 143–153:
要使用此参考中的语言,我的示例中的null 模型是仅拦截模型。最好的模型是模型 b,它包括所有预测变量:x0、x1、x2 和 x3。没有目标变量的替代模型是通过从最佳模型中删除预测变量 x2 获得的。
以下是我的问题:
问题1:引用的参考文献没有提到“没有目标变量的替代模型”中使用的平滑参数(即模型b2,它是通过从模型b中删除x2获得的)应该与“最佳模型”(即模型 b,其中包括 x2 以及所有其他预测变量)。根据 Simon Wood 在https://stat.ethz.ch/pipermail/r-help/2009-July/397343.html上的回答,在我看来,“替代”和“最佳”的偏差之间的公平比较模型应该确保平滑参数在两个模型中出现的术语中保持相同。我认为它应该正确吗?
问题 2: 如果我使用上述计算来计算模型中每个预测变量解释的部分偏差百分比,然后将这些百分比加到原始模型中包含的所有预测变量中,我最终会遇到我自己的数据的奇怪情况(不适用于上面提供的示例)其中:
(i) sum of percent partial deviances across all predictors < overall deviance
(ii) sum of percent partial deviances across all predictors > overall deviance
第二种情况尤其令人费解。(请注意,如果我在有和没有目标预测变量的模型中使用相同的平滑参数,有时我会得到一些预测变量的负百分比部分偏差,这也看起来很奇怪。)
为了解决这些问题,我倾向于将部分偏差百分比定义为与所有预测变量的部分偏差百分比总和相关(而不是与整体偏差相关)。换句话说,定义:
sum.partial.deviances.across.all.predictors <- (deviance(b0) - deviance(b)) +
(deviance(b1) - deviance(b)) +
(deviance(b2) - deviance(b)) +
(deviance(b3) - deviance(b))
然后使用:
partial.deviance.explained.by.x2 <- (deviance(b2) -
deviance(b))/sum.partial.deviances.across.all.predictors
代替:
partial.deviance.explained.by.x2 <-
(deviance(b2) - deviance(b))/deviance(b0)
这样的事情有意义吗?至少我会得到解释为 100% 的部分偏差百分比。
问题 3:是否有一种不同的并且希望更好的方法来计算 GAM 模型中每个预测变量解释的部分偏差百分比,这不会受到我在这篇文章中指出的问题的影响?
问题 4: 鉴于我遇到的奇怪/令人费解的行为,我不再确定我是否理解GAM 模型中的偏差概念。如果我们从模型中删除具有平滑、非线性效应的预测变量(但保持模型中具有相同平滑、非线性效应的其他预测变量的平滑参数相同),我们是否应该预期结果的偏差?型号增加?concurvity 会在我们的期望中扮演什么角色吗?
问题 5:从表面上看,比较带有和不带有目标预测器的 GAM 模型(例如我上面示例中的 x2)就其偏差而言,应该以确保模型具有可比性的方式进行(即,两个模型是相同的,除了一个包含目标预测器的平滑非线性效应而另一个不包含这一事实之外)。最初,我希望保持两个模型中非目标预测变量的平滑参数相同(除了在我的示例中使用相同的基础维度 k 和相同的 gamma 值)将确保模型的可比性,这样我们就可以在偏差方面进行同类比较。现在,我不太确定。我在文献中找到的一个似乎担心可比性问题的参考建议用一个(拟合的)“模型”替换没有目标预测器的替代(拟合)模型,其中目标预测器的平滑效果 - 比如说, s(x2) - 由 s(m2) 给出的常数代替,其中 m2 = mean(x2)。从最初包含它的模型中消除x2 的影响,同时保持其他所有内容相同??