tidymodels分组自举回归如何同时用int_pctl算CI和glance取摘要
解决思路
你原有的两段代码重复执行了自举采样和模型拟合步骤,只需将公共的采样、建模流程抽出来执行一次,再分别提取置信区间和模型摘要统计量即可,既避免重复计算,也能保证两次计算使用完全相同的自举样本,结果一致性更高。
完整实现代码
library(tidyverse) library(tidymodels) set.seed(27) # 示例数据 dat <- structure(list(site = c("mb", "mb", "mb", "mb", "mb", "mb", "mb", "mb", "sp", "sp", "sp", "sp", "sp", "sp", "sp", "sp"), year = c(2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015), yday = c(15, 15, 35, 35, 48, 48, 69, 69, 15, 15, 37, 37, 49, 49, 69, 69), samp_depth_cat2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Mid-2", "Bottom"), class = "factor"), analyte = c("NO3", "NO3", "NO3", "NO3", "NO3", "NO3", "NO3", "NO3", "NH4", "NH4", "NH4", "NH4", "NH4", "NH4", "NH4", "NH4"), conc = c(44.8171069465267, 44.7775358035268, 33.3678662097523, 33.0710828871279, 25.8427604055115, 26.9309658742058, 23.7585524380667, 17.5240386949382, 8.35832733633183, 9.29280745341615, 10.0797380595417, 10.2322058970515, 13.7930668951239, 15.6226805882773, 25.3003042764332, 16.8723637466981)), row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame")) # 第一步:仅执行一次自举采样与建模,保存所有中间结果 lm_boot_full <- dat %>% group_by(site, year, samp_depth_cat2, analyte) %>% group_modify( ~ bootstraps(., times = 100, apparent = TRUE) %>% mutate( model = map(splits, ~ lm(conc ~ yday, data = .)), coefs = map(model, tidy), glanced = map(model, glance) ) ) # 第二步:从已有的模型结果中提取系数置信区间 lm_boot_CI <- lm_boot_full %>% group_modify(~ int_pctl(., coefs)) # 第三步:从已有的模型结果中提取回归摘要统计量 lm_boot_R2 <- lm_boot_full %>% unnest(glanced)
可选:合并分组R²统计量与置信区间到同一张表
如果需要把每个分组的R²汇总结果和系数置信区间整合在一张表,可以执行以下代码:
# 汇总每个分组的R²统计量 r2_summary <- lm_boot_R2 %>% group_by(site, year, samp_depth_cat2, analyte) %>% summarise( r2_mean = mean(r.squared), r2_sd = sd(r.squared), .groups = "drop" ) # 关联置信区间与R²汇总结果 ci_with_r2 <- lm_boot_CI %>% left_join(r2_summary, by = c("site", "year", "samp_depth_cat2", "analyte"))
内容的提问来源于stack exchange,提问作者D Kincaid
相关产品推荐
相关产品推荐

