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

R语言循环提取117个逻辑回归模型的OR值与P值报错解决

解决逻辑回归模型OR值与P值提取报错的方法

报错原因

你写的两种代码都犯了同一个错误:没有对列表中的单个模型进行处理,而是直接对整个模型列表mdls调用summary()。mdls是lapply生成的模型列表,summary()无法直接处理列表对象,因此触发$ operator is invalid for atomic vectors错误。

解决方案

方法1:基础R实现

遍历每个模型,逐个提取系数、计算OR值(对数优势比取指数)、提取P值,最后合并为汇总表:

# 遍历每个模型,提取所需信息
results_list <- lapply(mdls, function(model) {
  # 获取模型的summary结果
  model_summary <- summary(model)
  # 提取自变量的系数行(第二行,第一行是截距)
  coef_info <- model_summary$coefficients[2, ]
  # 计算OR值:exp(对数优势比)
  or <- exp(coef_info[1])
  # 提取P值
  p_val <- coef_info[4]
  # 返回包含代谢物名称、OR、P值的数据框
  data.frame(
    Metabolite = rownames(model_summary$coefficients)[2],
    OR = round(or, 3),
    P_Value = round(p_val, 4)
  )
})

# 将列表合并为单个数据框
final_results <- do.call(rbind, results_list)

# 查看结果前几行
head(final_results)

方法2:用broom包简化操作

broom包可以自动整理模型结果为结构化数据框,更简洁高效:

# 安装并加载broom包(如果没装过)
# install.packages("broom")
library(broom)
library(dplyr)

# 提取每个模型的结果,计算OR并筛选出自变量行
results_tidy <- lapply(mdls, function(model) {
  tidy(model, exponentiate = TRUE) %>%
    filter(term != "(Intercept)") %>%  # 去掉截距行
    select(term, estimate, p.value) %>%
    rename(Metabolite = term, OR = estimate, P_Value = p.value) %>%
    mutate(across(c(OR, P_Value), round, digits = 3))  # 保留小数位
})

# 合并为汇总表
final_results <- bind_rows(results_tidy)

结果说明

最终的final_results数据框会包含三列:

  • Metabolite:代谢物名称(对应metabolite.names中的元素)
  • OR:该代谢物的优势比
  • P_Value:对应的显著性P值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54