R语言循环运行模型后将所有模型估计结果存储至数据框
解决循环仅保留最后一次迭代结果的问题
核心问题是你在循环里直接用fixed <- ...和rand <- ...赋值,每次迭代都会覆盖上一次的结果,所以最后只留下了最后一次的输出。要保存所有迭代结果,得用列表累积的方式来实现,具体步骤和代码如下:
实现步骤
- 提前创建两个空列表,分别用来存每次迭代的固定效应和随机效应结果
- 在循环内部,给当前迭代的结果加个迭代序号列,方便后续对应到
post_fit_use的行 - 把当前迭代的结果存入对应的列表
- 循环结束后,把列表里的所有小数据框合并成完整的数据集
代码示例
# 初始化空列表,用来存每一次的结果 fixed_list <- list() rand_list <- list() # 遍历post_fit_use的每一行 for (i in 1:nrow(post_fit_use)) { # 提取当前行的参数 current_params <- post_fit_use[i, ] # 生成新数据集(替换成你实际的生成代码) new_data <- your_data_generator(current_params) # 拟合lmer模型 lmer_model <- lmer(your_model_formula, data = new_data) # 提取固定效应和随机效应 fixed_result <- tidy(lmer_model, effects = "fixed") rand_result <- tidy(lmer_model, effects = "ran_vals") # 加迭代序号,标记这是第i次循环的结果 fixed_result$iter <- i rand_result$iter <- i # 把当前结果存入列表 fixed_list[[i]] <- fixed_result rand_list[[i]] <- rand_result } # 合并所有迭代的结果,得到完整数据框 final_fixed_data <- dplyr::bind_rows(fixed_list) final_rand_data <- dplyr::bind_rows(rand_list)
关键说明
- 用列表存储是因为列表可以容纳多个数据框,不会像直接赋值那样覆盖之前的内容
iter列能帮你把结果和post_fit_use里的参数行对应起来,后续分析更方便- 如果没装dplyr包,也可以用
do.call(rbind, fixed_list)来合并列表,但bind_rows对不同列结构的兼容性更好
内容的提问来源于stack exchange,提问作者BobbyPP
相关产品推荐
相关产品推荐

