R拟合不同变换的响应变量线性模型报变量长度不一致错误如何解决
R代码报错修复与需求实现方案
核心错误原因
- 循环逻辑错误:
for(i in length(lambda))仅会循环1次,length(lambda)返回的是lambda向量的总长度(此处为9),应改为遍历所有索引的for(i in seq_along(lambda)) - 条件判断逻辑错误:判断条件写了
i != 0,i是循环索引从1开始永远不会等于0,应该判断当前迭代的lambda值lambda[i] != 0 - Box-Cox变换计算错误:计算变换后y值时直接用了整个lambda向量,得到的是多列矩阵,应该用当前迭代的
lambda[i]计算 - 模型公式变量长度不匹配:拟合时写了
y[i] ~ Time,y[i]是取y的第i个元素(长度为1),和Time列的长度不一致,直接用变换后的完整y向量拟合即可
修改后完整代码
library(GLMsData) data(fluoro) lambda <- seq(-2,2,0.5) lm.out <- list() # 批量拟合模型 for(i in seq_along(lambda)){ if(lambda[i] != 0){ y <- (fluoro$Dose^lambda[i] - 1)/lambda[i] } else { y <- log(fluoro$Dose) } lm.out[[i]] <- lm(y ~ Time, data = fluoro, na.exclude = TRUE) } # 输出所有模型结果 print(lm.out) # 批量生成残差图(可选,按3行3列排布) par(mfrow = c(3,3)) for(i in seq_along(lm.out)){ plot(lm.out[[i]]$residuals, main = paste0("Lambda = ", lambda[i], " 残差图"), ylab = "残差值", xlab = "观测序号") abline(h = 0, col = "red", lty = 2) } par(mfrow = c(1,1)) # 恢复默认绘图布局
运行说明
修改后代码会按指定的lambda序列完成所有Box-Cox变换下的线性模型拟合,结果存储在lm.out列表中,可选的绘图代码会一次性输出所有lambda对应的残差图,方便对比不同变换下的残差分布。
内容的提问来源于stack exchange,提问作者Quamena
相关产品推荐
相关产品推荐

