R中循环执行ANOVA测试出现重复结果及变量未全运行问题
解决R中ANOVA循环重复行与结果展示问题
问题背景
你构建了包含响应变量Attrition和10个连续自变量的数据集sub3,并尝试用循环批量执行ANOVA检验变量关联,但输出结果出现重复行,且误以为未遍历所有变量。
原数据集构建代码
sub3 <- df1[, c('Attrition', "Age", "DistanceFromHome", "MonthlyIncome", "NumCompaniesWorked", "PercentSalaryHike", "TotalWorkingYears", "TrainingTimesLastYear", "YearsAtCompany", "YearsSinceLastPromotion", "YearsWithCurrManager")] sub3
原ANOVA循环代码
df_num <- function(x) { aov <- aov(as.numeric(sub3$Attrition) ~ sub3[, x], data = sub3) res <- data.frame('row' = 'Attrition' , 'column' = colnames(sub3)[x] , "p.value" = summary(aov)[[1]][["Pr(>F)"]] ) return(res) } num_df <- do.call(rbind, lapply(seq_along(sub3)[-1], df_num)) head(num_df)
错误输出
p.value 1 Attrition Age 1.996802e-26 2 Attrition Age NA 3 Attrition DistanceFromHome 5.182860e-01 4 Attrition DistanceFromHome NA 5 Attrition MonthlyIncome 3.842748e-02 6 Attrition MonthlyIncome NA
问题原因分析
- 重复行根源:
summary(aov)[[1]][["Pr(>F)"]]会返回长度为2的向量——第一个值是自变量的F检验p值,第二个是残差项的p值(残差项无检验意义,故为NA)。你的代码直接将整个向量存入p.value列,导致每个变量生成两行数据。 - 关于“未遍历所有变量”:
seq_along(sub3)[-1]确实遍历了sub3中除Attrition外的10个变量,只是你用head(num_df)仅查看了前6行(对应前3个变量的两行),并非未遍历全部。
修正方案
修改函数,仅提取自变量对应的p值,同时优化公式写法提升代码可读性:
df_num <- function(x) { # 获取当前自变量的列名 var_name <- colnames(sub3)[x] # 动态构建ANOVA公式 formula <- as.formula(paste0("as.numeric(Attrition) ~ ", var_name)) # 拟合模型,正确使用data参数 aov_model <- aov(formula, data = sub3) # 仅提取自变量的p值(取Pr(>F)列的第一行) p_val <- summary(aov_model)[[1]][["Pr(>F)"]][1] # 构建结果数据框,避免自动转为因子 res <- data.frame( row = "Attrition", column = var_name, p.value = p_val, stringsAsFactors = FALSE ) return(res) } # 执行循环并合并结果 num_df <- do.call(rbind, lapply(seq_along(sub3)[-1], df_num)) # 查看完整结果 print(num_df)
修正后的输出会每个变量对应一行,包含Attrition与该变量的ANOVA p值,无重复行。
内容的提问来源于stack exchange,提问作者Alexandra García
相关产品推荐
相关产品推荐

