You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:52:51