使用 for 循环调整 GAM 模型

Tune a GAM model with a for loop

我需要使用以下三个变量对变量“Life_expectancy”执行 GAM:“Adult_Mortality”、“HIV_AIDS”和“Schooling”。为了优化调整 GAM 模型,我需要为每个变量找到自由度的完美组合。 为此,我需要在另一个 for 循环中创建一个 for 循环,以找到所有变量的最佳组合,例如运行 以下命令在 3 个 for 循环中,一个用于 i,一个用于 j,一个用于 k:

gam.fit <- gam(Life_expectancy ~ + s(Adult_Mortality, df = i) + s(HIV_AIDS, df = j) + s(Schooling, df = k), data=train)

对于i,j,k的每个组合,每次都计算测试误差。最后,选择测试误差最低的模型。我尝试使用以下代码执行此操作:

test.err <- rep(0, 8)
for (i in 3:10) {
  for (j in 3:10) {
    for (k in 3:10) {
  gam.fit <- gam(Life_expectancy ~ + s(Adult_Mortality, df = i) + 
                 s(HIV_AIDS, df = j) + 
                 s(Schooling, df = k),
               data=train)
  gam.pred <- predict(gam.fit, test)
  test.err[i-2] <- mean((test$Life_expectancy - gam.pred)^2)
    }}}

但这只会产生 8 个自由度 i 从 3 到 10 的测试错误。我如何为 i、j、k 的每个组合输出自由度?

代码可以修改为:

test.err <- array(0, c(8,8,8))
for (i in 3:10) {
  for (j in 3:10) {
    for (k in 3:10) {
  gam.fit <- gam(Life_expectancy ~ + s(Adult_Mortality, df = i) + 
                 s(HIV_AIDS, df = j) + 
                 s(Schooling, df = k),
               data=train)
  gam.pred <- predict(gam.fit, test)
  test.err[i-2, j-2, k-2] <- mean((test$Life_expectancy - gam.pred)^2)
    }}}

关于该方法的几点注意事项:

  1. 您还没有说您使用了哪个 gam 功能,包 gammgcv 中有功能,可能还有其他功能。后者可以根据训练集估计合适的自由度
  2. 您似乎是根据对测试数据集的拟合来估计自由度,这在某种程度上违背了拥有单独的训练和测试数据集的想法。