使用 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)
}}}
关于该方法的几点注意事项:
- 您还没有说您使用了哪个
gam
功能,包 gam
和 mgcv
中有功能,可能还有其他功能。后者可以根据训练集估计合适的自由度
- 您似乎是根据对测试数据集的拟合来估计自由度,这在某种程度上违背了拥有单独的训练和测试数据集的想法。
我需要使用以下三个变量对变量“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)
}}}
关于该方法的几点注意事项:
- 您还没有说您使用了哪个
gam
功能,包gam
和mgcv
中有功能,可能还有其他功能。后者可以根据训练集估计合适的自由度 - 您似乎是根据对测试数据集的拟合来估计自由度,这在某种程度上违背了拥有单独的训练和测试数据集的想法。