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

R语言中为每个rs开头列批量拟合两种逻辑回归模型的方法

批量为rs开头列拟合两种逻辑回归模型

需求说明

针对数据集中所有以rs开头的列,分别拟合以下两种逻辑回归模型:

  • 模型1:AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + [rs列](依次替换每个rs列)
  • 模型2:AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + [rs列] * alcohol_intake(依次替换每个rs列)

修正后的示例数据集

原示例代码存在行长度不匹配问题,以下是可直接运行的修正版:

set.seed(543)
mydata <- data.frame(ID = 1:500, 
                     sex = sample(1:2, size = 500, replace = TRUE), 
                     age = runif(500, min= 35, max = 70), 
                     bmi = runif(500, min= 15, max = 35),
                     smoker = rep(c('smoker', 'not smoker'), 250),
                     alcohol_intake = rep(c('regular', 'not regular'), 250),
                     AD = sample(0:1, size = 500, replace = TRUE),
                     cov1 = runif(500, min= 0.0000, max = 1.0000),
                     cov2 = runif(500, min= -3.013e-02, max = 1.818e-02),
                     cov3 = runif(500, min= -3.562e-02, max = 1.540e-02),
                     cov4 = runif(500, min= -2.356e-02, max = 1.685e-02),
                     cov5 = runif(500, min= -1.392e-02, max = 2.894e-02),
                     cov6 = runif(500, min= -1.896e-02, max = 2.136e-02),
                     rs1 = sample(0:2, size = 500, replace = TRUE), 
                     rs2 = sample(0:2, size = 500, replace = TRUE),
                     rs3 = sample(0:2, size = 500, replace = TRUE),
                     rs4 = sample(0:2, size = 500, replace = TRUE),
                     rs5 = sample(0:2, size = 500, replace = TRUE),
                     rs6 = sample(0:2, size = 500, replace = TRUE),
                     rs7 = sample(0:2, size = 500, replace = TRUE),
                     rs8 = sample(0:2, size = 500, replace = TRUE),
                     rs9 = sample(0:2, size = 500, replace = TRUE),
                     rs10 = sample(0:2, size = 500, replace = TRUE),
                     rs11 = sample(0:2, size = 500, replace = TRUE),
                     rs12 = sample(0:2, size = 500, replace = TRUE),
                     rs13 = sample(0:2, size = 500, replace = TRUE),
                     rs14 = sample(0:2, size = 500, replace = TRUE),
                     rs15 = sample(0:2, size = 500, replace = TRUE),
                     rs16 = sample(0:2, size = 500, replace = TRUE),
                     rs17 = sample(0:2, size = 500, replace = TRUE),
                     rs18 = sample(0:2, size = 500, replace = TRUE),
                     rs19 = sample(0:2, size = 500, replace = TRUE),
                     rs20 = sample(0:2, size = 500, replace = TRUE),
                     rs21 = sample(0:2, size = 500, replace = TRUE),
                     rs22 = sample(0:2, size = 500, replace = TRUE),
                     rs23 = sample(0:2, size = 500, replace = TRUE),
                     rs24 = sample(0:2, size = 500, replace = TRUE),
                     rs25 = sample(0:2, size = 500, replace = TRUE),
                     rs26 = sample(0:2, size = 500, replace = TRUE),
                     rs27 = sample(0:2, size = 500, replace = TRUE),
                     rs28 = sample(0:2, size = 500, replace = TRUE),
                     rs29 = sample(0:2, size = 500, replace = TRUE),
                     rs30 = sample(0:2, size = 500, replace = TRUE)
)

解决方案

1. 提取所有rs开头的列名

先筛选出目标列:

# 基础R方法
rs_cols <- grep("^rs", colnames(mydata), value = TRUE)

# 可选:用stringr包(需先安装install.packages("stringr"))
# library(stringr)
# rs_cols <- str_subset(colnames(mydata), "^rs")

2. 用sapply批量拟合模型

模型1:无交互项

# 存储所有模型结果
model_list1 <- sapply(rs_cols, function(col) {
  formula <- as.formula(paste0("AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + ", col))
  glm(formula, data = mydata, family = binomial(link = "logit"))
}, simplify = FALSE)

# 查看单个模型结果,比如rs1的模型
summary(model_list1[["rs1"]])

模型2:带交互项

model_list2 <- sapply(rs_cols, function(col) {
  formula <- as.formula(paste0("AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + ", col, " * alcohol_intake"))
  glm(formula, data = mydata, family = binomial(link = "logit"))
}, simplify = FALSE)

# 查看rs1的交互模型结果
summary(model_list2[["rs1"]])

3. 用for循环批量拟合模型

如果更习惯循环写法:

# 初始化空列表存储模型
model_list1_loop <- list()
model_list2_loop <- list()

for (col in rs_cols) {
  # 模型1
  formula1 <- as.formula(paste0("AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + ", col))
  model_list1_loop[[col]] <- glm(formula1, data = mydata, family = binomial)
  
  # 模型2
  formula2 <- as.formula(paste0("AD ~ cov1 + cov2 + cov3 + cov4 + cov5 + cov6 + ", col, " * alcohol_intake"))
  model_list2_loop[[col]] <- glm(formula2, data = mydata, family = binomial)
}

4. 提取关键结果(OR值和p值)

快速提取每个模型中rs列的核心统计量,以模型1为例:

# 定义提取函数
extract_results <- function(model, rs_col) {
  coefs <- summary(model)$coefficients
  rs_row <- grep(rs_col, rownames(coefs))
  or <- exp(coefs[rs_row, 1])
  p_val <- coefs[rs_row, 4]
  data.frame(rs_col = rs_col, OR = round(or, 3), p_value = round(p_val, 4))
}

# 批量提取模型1的结果
results1 <- do.call(rbind, lapply(names(model_list1), function(col) {
  extract_results(model_list1[[col]], col)
}))

print(results1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:01:04