R语言 优化GAM以获得平滑度

but5z9lq  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(350)

我目前正在尝试使用一个响应变量和三个预测变量在R中生成一个一般可加模型,其中一个预测变量是线性的,数据集由298个观测值组成。
我已经运行了以下代码来生成一个基本的GAM:
GAM〈- gam(响应~线性预测因子+ s(预测因子2)+ s(预测因子3),数据=数据[2:5])
这产生了一个具有18个自由度的模型,似乎大大过拟合了数据。我想知道我如何才能生成一个最大化平滑度和预测误差的GAM。我意识到这些特征中的每一个都将以牺牲另一个为代价,但有没有一个好的方法来找到不过拟合的最优模型?
另外,我需要执行leave one out cross validation(LOOCV),我不确定如何确保gam()在MGCV包中执行此操作。对于这些问题中的任何一个,我都将非常感谢。谢谢。
我已经运行了这个程序来生成GAM,但是它过度拟合了数据。
GAM〈- gam(响应~线性预测因子+ s(预测因子2)+ s(预测因子3),数据=数据[2:5])
我还使用不同的平滑参数组合生成了1,000,000个GAMs,并将允许的最大自由度从10(如下面的代码所示)到19。变量“combinations 2”是我选择的所有1,000,000个平滑器组合的列表。此代码旨在尝试平衡自由度和AIC分数。它确实起作用,但我不确定我是否真的能从中找到最优模型,我也不知道如何确保它使用LOOCV。

BestGAM <- gam(response~ linearpredictor+ predictor2+ predictor3, data = data[2:5])

for(i in 1:100000){
PotentialGAM <- gam(response~ linearpredictor+ s(predictor2) + s(predictor3), data = data[2:5], sp=c(combinations2[i,]$Var1,combinations2[i,]$Var2)) 

if (AIC(PotentialGAM,BestGAM)$df[1] <= 10 & AIC(PotentialGAM,BestGAM)$AIC[1] < AIC(PotentialGAM,BestGAM)$AIC[2]){

BestGAM <<- PotentialGAM
listNumber <- i
}
}
7gyucuyw

7gyucuyw1#

您正在使用广义交叉验证(GCV)平滑度选择拟合GAM。GCV是一种解决普通交叉验证(OCV)不变性问题的方法;请注意,在拟合问题的旋转版本(将y-X β旋转Q,任何正交矩阵)中,GCV与OCV相同,而当使用GCV {mgcv}拟合时,实际上不需要进行旋转,预期的GCV评分不受旋转影响,GCV只是OCV(wood 2017,p. 260)
已经表明,GCV * 可以 * 欠平滑(导致更多的摆动模型),因为目标函数(GCV轮廓)可以在最优值附近变得平坦。相反,优选地使用REML或ML平滑度选择来估计GAM(具有惩罚平滑度);将method = "REML"(或"ML")添加到您的gam()呼叫。
如果REML或ML拟合与GCV拟合一样不稳定,那么我可能会假设gam() * 不是 * 过拟合,但关于您的响应数据,有一些东西在这里没有解释(例如,数据是否按时间排序?)
关于你的问题
我如何生成一个GAM,使平滑度最大化,预测误差最小化,
您已经在使用GCV平滑度选择并针对“平滑度”的特定定义执行此操作(在本例中,它是估计平滑度的平方二阶导数,在协变量范围内积分,并在平滑度上求和)。
如果您想要GCV但更平滑的模型,可以将gamma参数增加到1以上;例如,经常使用gamma 1.4,这意味着在GCV标准中,每个EDF的成本要高出40%。
FWIW,您可以通过使用影响矩阵 A 获得模型的LOOCV(OCV)分数,而无需实际拟合288个GAMs。以下是使用我的{gratia}包的可重现示例:

library("gratia")
library("mgcv")

df <- data_sim("eg1", seed = 1)
m <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = df, method = "REML")
A <- influence(m)
r <- residuals(m, type = "response")

ocv_score <- mean(r^2 / (1 - A))

相关问题