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

R语言循环中向数据框追加混合效应模型结果的方法求助

解决R中循环追加混合效应模型结果到数据框的问题

你的问题核心是每次循环都直接覆盖了results对象,没有保留之前迭代的结果。下面提供两种实用的解决方法:

方法1:预先初始化空数据框,循环内用rbind追加

先创建一个列名和数据类型匹配的空数据框,每次循环把新结果行追加进去:

library(nlme)

data(mtcars)
names_mdl <- c("cyl",  "disp", "hp",   "drat")

# 预先初始化空数据框,指定列类型避免类型转换问题
results <- data.frame(
  "Explanatory Variable" = character(),
  "Lower Conf Int" = numeric(),
  "Upper Conf Int" = numeric(),
  "P Value" = numeric(),
  stringsAsFactors = FALSE
)

for (n in names_mdl){
  exp <- mtcars[,n]
  
  # 拟合混合效应模型
  mlme <- lme(mpg ~ exp, random = ~ 1|cyl, data = mtcars, 
              control = lmeControl(msMaxIter = 1000, msMaxEval = 1000))
  
  sum_mlme <- summary(mlme)
  conf <- intervals(mlme, level = 0.95, which = 'fixed')
  
  lower <- conf$fixed["exp","lower"]
  upper <- conf$fixed["exp","upper"]
  p <- coef(sum_mlme)[2, "p.value"]
  
  # 生成当前行结果
  current_row <- data.frame(
    "Explanatory Variable" = n,
    "Lower Conf Int" = lower,
    "Upper Conf Int" = upper,
    "P Value" = p,
    stringsAsFactors = FALSE
  )
  
  # 追加到结果数据框
  results <- rbind(results, current_row)
}

# 查看最终结果
results

方法2:用列表收集结果,最后合并成数据框(更高效)

当迭代次数较多时,rbind循环追加会频繁修改数据框,效率较低。推荐先把每个迭代的结果存入列表,最后一次性合并:

library(nlme)

data(mtcars)
names_mdl <- c("cyl",  "disp", "hp",   "drat")

# 初始化空列表
results_list <- list()

for (i in seq_along(names_mdl)){
  n <- names_mdl[i]
  exp <- mtcars[,n]
  
  mlme <- lme(mpg ~ exp, random = ~ 1|cyl, data = mtcars, 
              control = lmeControl(msMaxIter = 1000, msMaxEval = 1000))
  
  sum_mlme <- summary(mlme)
  conf <- intervals(mlme, level = 0.95, which = 'fixed')
  
  lower <- conf$fixed["exp","lower"]
  upper <- conf$fixed["exp","upper"]
  p <- coef(sum_mlme)[2, "p.value"]
  
  # 将当前结果存入列表的对应位置
  results_list[[i]] <- data.frame(
    "Explanatory Variable" = n,
    "Lower Conf Int" = lower,
    "Upper Conf Int" = upper,
    "P Value" = p,
    stringsAsFactors = FALSE
  )
}

# 合并列表中的所有数据框
results <- do.call(rbind, results_list)

# 查看最终结果
results

关键说明

  • 原代码中sum是R的内置求和函数,建议不要用它做变量名,改成sum_mlme这类更清晰的名字,避免函数冲突。
  • 两种方法的核心都是保留之前的迭代结果,而不是每次都重新赋值覆盖。列表收集的方式在大数据量下性能更优。

内容的提问来源于stack exchange,提问作者John Conor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:12