使用循环提取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)
修正说明
- 提前在循环外初始化存储对象,避免结果被反复覆盖
- 使用
reformulate动态构造公式,确保循环中的列名被正确识别为自变量 - 提取p值时指定第2行,对应自变量的系数检验结果(第1行是截距项的p值,无需保留)
- 最后统一完成p值筛选,直接输出符合条件的变量及对应p值
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

