R语言线性回归报错:替换行数与数据行数不匹配问题求助
问题原因
报错的核心是数据裁剪逻辑错误:
- 你在循环中连续两次删减行(
papa <- papa[-1, ]+papa <- papa[1:(nrow(papa)-1), ]),导致Ctem列的长度比后续处理的Colum4多一行,赋值时出现长度不匹配。 - 每次循环都从原始
df创建papa,没有基于上一次优化后的数据集继续迭代,不符合“重复调整并重新分析”的需求。
修正后的代码
library(openxlsx) # 读取文件 file_path <- "C://Users//hhernandez//OneDrive - Unitec NZ//Desktop//Cal R/pp.xlsx" df <- read.xlsx(file_path) # 初始化当前数据集:提取第4列和Ctem列 current_data <- data.frame(Col4 = df[[4]], Ctem = df$Ctem) # 初始线性回归计算 reg <- lm(Ctem ~ Col4, data = current_data) r_squared <- summary(reg)$r.squared # 存储所有迭代结果的表格 pepe <- data.frame(Equation = character(), `R-squared` = numeric(), stringsAsFactors = FALSE) # 先记录初始回归结果 initial_eq <- paste("y =", round(coef(reg)[2], 2), "x +", round(coef(reg)[1], 2)) pepe <- rbind(pepe, data.frame(Equation = initial_eq, `R-squared` = r_squared)) # 循环执行优化逻辑 while (r_squared < 0.8) { # 执行正确的裁剪:Ctem删除首个值,第4列删除最后一个值 new_data <- data.frame( Col4 = current_data$Col4[-nrow(current_data)], Ctem = current_data$Ctem[-1] ) # 防御性检查:确保两行列数一致 if (length(new_data$Col4) != length(new_data$Ctem)) { warning("行列数不一致,终止循环") break } # 重新计算线性回归与R² reg_new <- lm(Ctem ~ Col4, data = new_data) new_r_squared <- summary(reg_new)$r.squared # 记录本次迭代的结果 new_eq <- paste("y =", round(coef(reg_new)[2], 2), "x +", round(coef(reg_new)[1], 2)) pepe <- rbind(pepe, data.frame(Equation = new_eq, `R-squared` = new_r_squared)) # 判断是否继续迭代 if (new_r_squared > r_squared) { r_squared <- new_r_squared current_data <- new_data # 更新数据集用于下一次迭代 } else { break # R²不再提升,停止循环 } } # 输出所有结果 print(pepe)
关键修改说明
- 迭代逻辑修正:用
current_data存储当前迭代的数据集,每次循环基于上一次的结果裁剪,而非重复从原始数据开始。 - 正确裁剪方式:直接对
Ctem取[-1](删除首个值)、对第4列取[-nrow(current_data)](删除最后一个值),确保两行列数完全一致。 - 防御性检查:添加行列数一致性校验,避免意外报错。
- 初始结果记录:将初始回归结果存入
pepe表格,方便对比每次优化的效果。 - 清理无用依赖:移除未使用的
readr包加载语句。
内容的提问来源于stack exchange,提问作者Ger Hernandez
相关产品推荐
相关产品推荐

