R语言嵌套循环回归仅存储3个模型结果的问题求助
问题原因
你这段代码里的嵌套循环只存储3个模型结果的核心问题是行索引赋值错误:
models数据框设计了6行,对应3个数据集×2个vs条件的6种组合- 但循环中你用
models[i, 3]和models[i, 4]赋值,每次i固定时,两次j循环会覆盖同一行的结果(比如i=1时,j=0和j=1都往第1行写,最终只保留j=1的模型结果) - 最终每个数据集只存了vs=1的模型结果,总共3行有值,其余3行还是NA
修正后的代码
仅存储系数版本
library(dplyr) data(mtcars) d1 = sample_n(mtcars, 10) d2 = sample_n(mtcars, 10) d3 = sample_n(mtcars, 10) models = data.frame(model = c(1,1,2,2,3,3), val = c(0,1,0,1,0,1), coef = rep(NA, 6)) d = list(d1, d2, d3) for(i in 1:length(d)) { for (j in 0:1) { # 计算对应行索引:每个数据集占2行,j=0对应第1行,j=1对应第2行 row_idx = (i - 1)*2 + (j + 1) data = d[[i]] %>% filter(vs == j) # 过滤后样本量不足2时lm会报错,先做判断 if(nrow(data) >= 2) { model = lm(cyl~disp, data=data) models[row_idx, 3] = summary(model)$coefficients[2,1] } } }
同时存储系数和标准误版本
library(dplyr) data(mtcars) d1 = sample_n(mtcars, 10) d2 = sample_n(mtcars, 10) d3 = sample_n(mtcars, 10) models = data.frame(model = c(1,1,2,2,3,3), val = c(0,1,0,1,0,1), coef = rep(NA, 6), ste = rep(NA, 6)) d = list(d1, d2, d3) for(i in 1:length(d)) { for (j in 0:1) { row_idx = (i - 1)*2 + (j + 1) data = d[[i]] %>% filter(vs == j) if(nrow(data) >= 2) { model = lm(cyl~disp, data=data) models[row_idx, 3] = summary(model)$coefficients[2,1] models[row_idx, 4] = summary(model)$coefficients[2,2] } } }
额外优化建议
用tidyverse的purrr包可以更简洁地实现,避免手动处理索引:
library(tidyverse) data(mtcars) # 生成3个样本数据集 d_list = map(1:3, ~sample_n(mtcars, 10)) %>% set_names(paste0("d", 1:3)) # 批量拟合模型并提取结果 result_df = imap_dfr(d_list, function(data, dataset_name) { data %>% group_by(vs) %>% nest() %>% mutate( model = map(data, ~lm(cyl~disp, data=.x)), coef = map_dbl(model, ~summary(.x)$coefficients[2,1]), ste = map_dbl(model, ~summary(.x)$coefficients[2,2]) ) %>% ungroup() %>% mutate(model_num = parse_number(dataset_name)) %>% select(model_num, vs, coef, ste) })
这个方法会自动处理每个数据集的vs分组,直接生成包含所有6个模型结果的数据框,还能避免循环中的索引错误问题。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

