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
相关产品推荐
相关产品推荐

