R语言分段线性回归存储R²至矩阵时出现下标错误求助
分段线性回归断点寻找时的矩阵赋值错误排查
我正在尝试不依赖segmented包,手动为分段线性回归模型寻找两个断点,但在将模型的R²值存入矩阵时触发了错误,想请大家帮忙排查问题。
我的代码:
x <- c(40:90) mse <- matrix(nrow = length(x),ncol = length(x)) for(i in 1:length(x)){ for(j in 1:length(x)){ piecewise <- lm(Meter ~ Temperature*(Temperature <= x[i]) +Temperature*(Temperature > x[i] & Temperature < x[j]) +Temperature*(Temperature >= x[j])) } mse[i,j] <- summary(piecewise)[8] }
触发的错误信息:
Error in mse[i, j] <- summary(piecewise)[8] : incorrect number of subscripts on matrix
问题排查与修正方案:
我帮你梳理了几个关键问题,以及对应的修复方式:
循环结构错误:你把矩阵赋值语句
mse[i,j] <- ...放在了外层循环里,这意味着内层循环跑完所有j之后,才会执行一次赋值。此时j已经是length(x)的最大值,而外层循环的每一次i只会对应这一个j值,这不仅逻辑错误(没有遍历所有i,j组合),还会导致索引混乱。正确的做法是把赋值语句移到内层循环内部。R²取值方式错误:
summary(lm)返回的是一个列表,[8]提取到的是fstatistic——这是一个长度为3的向量(包含F值、自由度1、自由度2),而你试图把这个多元素向量赋值给单个矩阵元素,这会触发维度不匹配的问题。应该用summary(piecewise)$r.squared来直接提取R²值。无效断点组合未过滤:当
i >= j时,你的中间区间Temperature > x[i] & Temperature < x[j]是空的,这会导致模型出现共线性或者无法正常拟合的情况,所以需要跳过这些无效的组合。
修正后的代码:
x <- c(40:90) # 更改为语义清晰的变量名,因为我们存储的是R²而不是MSE r_squared_matrix <- matrix(nrow = length(x), ncol = length(x)) for(i in 1:length(x)){ for(j in 1:length(x)){ # 只处理i < j的有效断点组合,避免区间无效 if(i < j){ piecewise <- lm(Meter ~ Temperature*(Temperature <= x[i]) + Temperature*(Temperature > x[i] & Temperature < x[j]) + Temperature*(Temperature >= x[j])) # 正确提取R²值 r_squared_matrix[i,j] <- summary(piecewise)$r.squared } else { # 对无效组合赋值为NA,方便后续识别 r_squared_matrix[i,j] <- NA } } }
这样修改后,应该就能正常运行并存储每个有效断点组合对应的R²值了。
内容的提问来源于stack exchange,提问作者XF Ye
相关产品推荐
相关产品推荐

