R语言中循环测试不同数据集模型的p值与AIC值失效问题
问题原因
你循环里的pM1、aicM1等变量每次迭代都会被新值覆盖,循环结束后只保留最后一次计算的结果,而且你没有在循环过程中把每一组的结果存储起来,最后cbind只能得到一组数据。
修正后的代码
# 提前创建空数据框,用于存储10次循环的结果 summary_df <- data.frame( pM1 = numeric(10), pM2 = numeric(10), pM3 = numeric(10), aicM1 = numeric(10), aicM2 = numeric(10), aicM3 = numeric(10) ) # 循环生成数据集并计算指标 for (i in 1:10) { N <- 100 M <- 2000 SD1 <- 500 SD2 <- 50 Slope <- 3 Slope1 <- 2 Intercept <- 0 B <- rnorm(N, M, SD1) C <- rnorm(N, M, SD1) # 构建模型数据 A <- Intercept + Slope*B + Slope1*C + rnorm(N,0,SD2) data <- data.frame(A, B, C) # 用data.frame替代cbind+as.data.frame更简洁 # 拟合线性模型 M1 <- lm(A ~ B, data = data) # 推荐用data参数,避免$引用 M2 <- lm(A ~ C, data = data) M3 <- lm(A ~ B + C, data = data) # 提取F检验p值 pM1 <- pf(summary(M1)$fstatistic[1], summary(M1)$fstatistic[2], summary(M1)$fstatistic[3], lower.tail=FALSE) pM2 <- pf(summary(M2)$fstatistic[1], summary(M2)$fstatistic[2], summary(M2)$fstatistic[3], lower.tail=FALSE) pM3 <- pf(summary(M3)$fstatistic[1], summary(M3)$fstatistic[2], summary(M3)$fstatistic[3], lower.tail=FALSE) # 提取AIC值 aicM1 <- AIC(M1) aicM2 <- AIC(M2) aicM3 <- AIC(M3) # 将当前迭代的结果存入数据框对应行 summary_df[i, ] <- c(pM1, pM2, pM3, aicM1, aicM2, aicM3) } # 查看结果 print(summary_df)
关键修改点
- 提前初始化
summary_df数据框,预留10行位置存储每次循环的结果 - 在循环内将当前计算的指标赋值给
summary_df的第i行,避免变量被覆盖 - 优化了
lm的写法,使用data参数替代直接引用data$,代码更简洁规范 - 简化了p值计算的代码结构,去掉不必要的代码块包裹
内容的提问来源于stack exchange,提问作者scienceguy_96
相关产品推荐
相关产品推荐

