R语言修改LM多项式模型系数后predict输出偏移、截距异常问题求解
问题解答
1. predict函数输出和手动计算结果不一致的原因
- 核心原因是R中
poly()函数默认生成正交多项式基,而非原始x的幂次项:默认参数raw=FALSE时,poly(x,2)会对x做中心化、标准化变换,生成两两正交的基函数,lm()返回的系数是正交基的权重,不是直接对应x和x²的系数,你直接用系数乘x + x²的手动计算逻辑自然和predict()结果不一致。 - 你设置
raw=TRUE后业务数据仍不符合预期,是因为绘图时的错误:你调用plot(predict(org))时没有指定x轴变量,plot默认将样本索引作为x轴,而非你的原始气温x,看起来像是整体偏移,实际上是绘图逻辑错误,改成plot(x, predict(org), type="l")即可匹配手动计算结果。
2. 示例模型截距不为0的原因
默认正交多项式模式下,lm(y ~ poly(x,2))的截距等价于训练样本y的均值,第一个示例中y是x从0到20的平方值,离散均值约为133.67,和你输出的截距完全一致,自然不为0。只有当raw=TRUE且y在x=0处的拟合值为0时,截距才会为0。
3. 手动计算修改后模型预测值的方法
方法1:使用raw=TRUE的多项式模型(推荐)
拟合时指定poly(x, 2, raw=TRUE),后续直接代入公式计算即可:
# 通用公式:y = 截距 + 一次项系数*x + 二次项系数*x² pred_manual = coef(orgm)[1] + coef(orgm)[2] * x + coef(orgm)[3] * x^2
方法2:默认正交多项式模型的手动计算
需要先提取poly()生成的基变换参数,将原始x转换为正交基后再乘系数:
# 从原模型中提取poly的变换参数 poly_attr = attributes(mod$model[[2]]) # 生成正交基 x_poly = poly(x, 2, coefs = poly_attr$coefs) # 计算预测值 pred_manual = coef(mody)[1] + x_poly %*% coef(mody)[-1]
原始业务数据修改后偏移的额外说明
你当前修改系数的逻辑是固定x=0处的截距不变,但你的研究区间是x=15~23.5,x=0不在研究范围内,调整一次项、二次项系数后,研究区间内的拟合值自然会整体偏移。如果你希望两条拟合曲线在研究区间的某个参考点(比如平均气温)相交,需要同步调整截距:
# 示例:让两条曲线在x=平均气温处相交 x_mean = mean(x) # 计算原模型在x_mean处的拟合值 pred_org_mean = coef(org)[1] + coef(org)[2]*x_mean + coef(org)[3]*x_mean^2 # 调整修改后模型的截距,保证x_mean处值不变 orgm$coefficients[1] = pred_org_mean - orgm$coefficients[2]*x_mean - orgm$coefficients[3]*x_mean^2
内容的提问来源于stack exchange,提问作者Lyzzie777
相关产品推荐
相关产品推荐

