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

使用循环提取glm模型中p<0.05的变量p值,求修正代码

问题分析与代码修正

你的原代码存在三个核心问题:

  • 循环内每次重置list_glm和z,导致之前的结果全部丢失,最终仅保留最后一次循环的输出
  • 公式status~i无法正确识别循环中的列名,R会把i当作一个字面变量名,而非当前循环的目标列
  • 没有将所有变量的结果统一存储,无法完成后续的p值筛选

以下是修正后的代码,同时提供两种实现方式:

方式一:for循环实现

# 初始化存储结果的数据框
result_df <- data.frame(
  variable = character(),
  p_value = numeric(),
  stringsAsFactors = FALSE
)

# 遍历所有自变量(排除因变量status)
for (var in setdiff(colnames(df2), "status")) {
  # 构造正确的回归公式
  formula <- reformulate(var, response = "status")
  # 拟合二项式glm模型
  model <- glm(formula, data = df2, family = binomial())
  # 提取自变量对应的p值(跳过截距项的结果)
  p_val <- summary(model)$coefficients[2, 4]
  # 将当前变量的结果存入数据框
  result_df <- rbind(result_df, data.frame(variable = var, p_value = p_val))
}

# 筛选p值<0.05的显著结果
significant_results <- subset(result_df, p_value < 0.05)
print(significant_results)

方式二:lapply简洁实现(更高效)

# 获取所有自变量(排除status)
vars <- setdiff(colnames(df2), "status")

# 批量拟合模型
model_list <- lapply(vars, function(var) {
  glm(reformulate(var, "status"), data = df2, family = binomial())
})

# 批量提取p值并整理成数据框
p_values <- sapply(model_list, function(x) summary(x)$coefficients[2, 4])
result_df <- data.frame(variable = vars, p_value = p_values)

# 筛选显著结果
significant_results <- result_df[result_df$p_value < 0.05, ]
print(significant_results)

修正说明

  1. 提前在循环外初始化存储对象,避免结果被反复覆盖
  2. 使用reformulate动态构造公式,确保循环中的列名被正确识别为自变量
  3. 提取p值时指定第2行,对应自变量的系数检验结果(第1行是截距项的p值,无需保留)
  4. 最后统一完成p值筛选,直接输出符合条件的变量及对应p值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:55:36