求助:RStudio中批量运行多k值组合GAM模型并获取AIC及代码修正
Got it! Let's fix this GAM model tuning issue together. I’ve run into similar problems before, so let’s break down how to batch-fit models with all your k-value combinations and reliably pull AICs—plus I’ll point out the most common mistakes that might have messed up your original code.
First, make sure you’ve got the mgcv package installed (it’s the go-to for GAMs in R) and loaded, and that your dataset is ready to go. Let’s assume your response variable is y and you have, say, 3 predictor variables (x1, x2, x3)—adjust this to match your actual data:
# Install if needed: install.packages("mgcv") library(mgcv) # Replace df with your actual dataset name df <- your_dataset_here
Instead of manually writing out every possible k combination (which is error-prone), use expand.grid() to automatically create every permutation of k values (4-8) for each predictor. This works no matter how many predictors you have:
# Define the range of k values you want to test k_options <- 4:8 # Create all combinations of k values for each predictor # Add more columns (k_x4, k_x5, etc.) if you have more predictors k_combinations <- expand.grid( k_x1 = k_options, k_x2 = k_options, k_x3 = k_options )
Now loop through each k combination, fit the GAM, and store the AIC along with the k values used. We’ll use a data frame to keep everything organized:
# Initialize an empty data frame to store results model_results <- data.frame( k_x1 = integer(), k_x2 = integer(), k_x3 = integer(), AIC = numeric(), stringsAsFactors = FALSE ) # Loop through each k combination for (i in 1:nrow(k_combinations)) { # Pull the k values for this iteration k1 <- k_combinations$k_x1[i] k2 <- k_combinations$k_x2[i] k3 <- k_combinations$k_x3[i] # Fit the GAM model with dynamic k values # Adjust the formula to match your actual predictors/structure (e.g., add te() for tensor products) current_model <- gam( formula = y ~ s(x1, k = k1) + s(x2, k = k2) + s(x3, k = k3), data = df ) # Store the k values and AIC in the results data frame model_results[i, ] <- c(k1, k2, k3, AIC(current_model)) } # View the results (sort by AIC to find the best model quickly!) model_results <- model_results[order(model_results$AIC), ] head(model_results)
Here are the most likely issues with your initial code:
- Hardcoded k values: If you forgot to dynamically replace k values in the model formula (e.g., used
s(x1, k=4)instead ofs(x1, k=k1)), all models would use the same k, leading to identical AICs. - Missing combinations: Manually writing loops for k values often leads to missing permutations—
expand.grid()eliminates this. - Overwriting results: If you didn’t initialize a data frame to append results to, each loop iteration would overwrite the previous model’s AIC instead of storing all of them.
- k value constraints:
mgcvrequires that k is larger than the minimum effective degrees of freedom for a smooth term (usually at least 3). If you tried k=4 with a term that can’t support it, you might get errors—double-check that your data has enough variation for the k values you’re testing.
If your model uses tensor products (te()), random effects, or other structures, just adjust the gam() formula in the loop to match. For example, a tensor product between x1 and x2 would look like te(x1, x2, k = c(k1, k2)).
内容的提问来源于stack exchange,提问作者new2018

