使用lm()遇矩阵类型错误:未用矩阵却报poly类型不匹配
R多项式回归predict报错:poly类型不匹配问题解决
错误原因
你在for循环中创建模型时,公式里的i是循环变量,lm()并不会将i的当前值固化到模型中,而是保留对环境变量i的引用。当循环结束后,i的值停留在5,调用predict(fit2)时,R会重新执行poly(x, degree = i, raw = TRUE),此时生成的是5阶多项式矩阵,和拟合fit2时的2阶矩阵类型不匹配,因此触发报错。
解决方案
方案1:手动创建模型(推荐,阶数少更清晰)
因为任务只要求拟合0-3阶多项式,直接手动定义每个模型即可,避免循环带来的变量引用问题:
fit0 = lm(y ~ 1, data = data_train) fit1 = lm(y ~ poly(x, degree = 1, raw = TRUE), data = data_train) fit2 = lm(y ~ poly(x, degree = 2, raw = TRUE), data = data_train) fit3 = lm(y ~ poly(x, degree = 3, raw = TRUE), data = data_train)
方案2:动态生成公式(适合多阶场景)
如果一定要用循环,需要将i的当前值固化到公式字符串中,再转换为公式对象传入lm():
fit0 = lm(y ~ 1, data = data_train) # 仅循环到3阶,匹配任务要求 for(i in 1:3) { # 动态生成带固定阶数的公式 formula_expr = as.formula(paste0("y ~ poly(x, degree = ", i, ", raw = TRUE)")) assign(paste0("fit", i), lm(formula = formula_expr, data = data_train)) }
绘图修正说明
另外注意:abline()仅适用于一阶线性拟合,二阶及以上的拟合线需要用predict()生成预测值后,用lines()绘制;同时0阶拟合是水平线,应该用h参数而非v:
# 绘制训练数据散点图 plot(data_train$x, data_train$y) # 0阶拟合(水平线) abline(h = fit0$coef[1], col = 'blue') # 二阶拟合线 y2_pred = predict(fit2, newdata = data.frame(x = data_train$x)) lines(data_train$x, y2_pred, col = 'red')
内容的提问来源于stack exchange,提问作者Mikayla Eckel Cifrese
相关产品推荐
相关产品推荐

