簡體   English   中英

如何有效地總結來自多個 GAM 模型的摘要 output?

[英]How do I efficiently summarize summary output from multiple GAM models?

我正在運行多個 GAM 模型,需要從這些模型中查看和比較摘要 output。 我想要一種快速有效的方法來從模型中提取和編譯匯總統計信息,但還沒有找到這樣做的方法。

下面提供了一個示例數據集:


    example.data <- structure(list(response = c(1.47, 0.84, 1.99, 2.29, 4.14, 4.47, 
    2.71, 1.67, 4.12, 1.67, 2.03, 1.74, 0.98, 0.96, 0.56, 2.45, 1.31, 
    3.06, 2.35, 3.2, 1.16, 2.07, 0.99, 1.35, 1.02, 2.92, 1.8, 2.17, 
    2.56, 1.56, 2.33, 3.19, 1.53, 2.94, 3.28, 1.53, 2.8, 5.53, 1.26, 
    2.43, 3.5, 2.22, 3.73, 2.46, 2.16, 1.99, 3.34, 2.63, 2.51, 1.78
    ), predictor1 = c(17, 14.4, 99.45, 10.8, 54.25, 55.1, 40, 9, 
    54.25, 14.4, 14.4, 17, 14.4, 17, 10.8, 54.25, 54.25, 15.3, 55.1, 
    54.25, 14.4, 58, 17, 53.425, 58, 40.45, 14.4, 12.75, 91.05, 6.24, 
    100.25, 77.25, 43.4, 183.6, 91.05, 9.84, 100.25, 64, 10, 10, 
    91.05, 8.25, 100.25, 54.25, 89.4, 9.84, 10.8, 54.25, 10.8, 54.25
    ), predictor2 = c(165.7, 177.3, 594.2, 192.5, 426.2, 270.8, 244, 
    236.1, 416, 175.8, 258.6, 233.5, 115.8, 141, 153.5, 414.2, 438.9, 
    203, 261.4, 357.8, 148, 205.5, 137.4, 214.7, 167.8, 371.4, 179.9, 
    273.7, 567.2, 231.5, 355.3, 270, 319.5, 301.9, 301.9, 215.5, 
    256.5, 417, 231.8, 284.6, 396.3, 323, 458.4, 290, 203, 198, 350.8, 
    338, 323.5, 264.7), predictor3 = c(829.8, 841, 903.6, 870.3, 
    794, 745, 845.2, 906.5, 890.3, 874.2, 805.4, 828.8, 872, 854.7, 
    912.2, 790.8, 759.2, 855.1, 741.6, 961.8, 839.9, 805.1, 885.2, 
    887.8, 833.9, 1050.9, 787.5, 837, 731.9, 774.4, 820.8, 995.8, 
    916.3, 1032.1, 1014.3, 773.7, 846.4, 723.7, 764.2, 708.3, 1009.3, 
    1053.7, 751.7, 901.1, 848.7, 796.5, 697.1, 733.6, 725.6, 856.6
    )), row.names = c(50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 
    60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 
    73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 
    86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 
    99L, 100L), class = "data.frame")

現在,我這樣做的簡單和低效的方式是這樣的:


    library(mgcv)
    
    mod1 = gam(response ~ s(predictor1), data=example.data)
    mod2 = gam(response ~ s(predictor2), data=example.data)
    mod3 = gam(response ~ s(predictor3), data=example.data)
    
    mod.names <- c("mod1", "mod2", "mod3")
    mod.predictors <- c("predictor1", "predictor2", "predictor3")
    mod.rsq <- c(summary(mod1)$r.sq, summary(mod2)$r.sq, summary(mod3)$r.sq)
    mod.AIC <- c(AIC(mod1), AIC(mod2), AIC(mod3))
    
    summary.data <- data.frame(mod.names, 
                               mod.rsq, 
                               mod.AIC,
                               mod.predictors)
    
    summary.data 

然后我可以從匯總表中相應地使用 select 模型。

我在實際數據中有一百多個潛在的預測變量,手動指定所有模型及其 output 顯然很費力,因此需要更自動化的替代方案。

這個問題的難點在於選擇要運行的模型:這是一個很難的統計問題,根據您的選擇,這是一個不太難的編程問題。

我假設您只對示例中的模型感興趣。 那么這應該工作:

library(mgcv)
#> Loading required package: nlme
#> This is mgcv 1.8-33. For overview type 'help("mgcv-package")'.
predictors <- setdiff(names(example.data), "response")
result <- data.frame(predictors = predictors, rsq = NA, AIC = NA)
model <- response ~ predictor
for (i in seq_len(nrow(result))) {
  pred <- result$predictors[i]
  model[[3]] <- bquote(s(.(as.name(pred))))
  mod <- gam(model, data = example.data)
  result$rsq[i] <- summary(mod)$r.sq
  result$AIC[i] <- AIC(mod)
}
result
#>   predictors       rsq      AIC
#> 1 predictor1 0.2011252 138.0875
#> 2 predictor2 0.4666861 118.7270
#> 3 predictor3 0.1959123 139.0365

棘手的部分是計算 model 公式。 我從一個簡單的 model response ~ predictor開始,然后用bquote(s(.(as.name(pred))))生成的代碼替換第三部分( predictor )。 pred持有"predictor1"時, function 會產生未評估的代碼,如s(predictor1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM