You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言多项式回归:新单调x序列拟合值出现NA问题

问题与解决

问题描述

计算一组含重复x值的x、y数据点斜率时,因x重复导致slope=(y2-y1)/(x2-x1)出现除零错误。尝试用二次多项式回归生成原x值域内的单调递增新x序列(xx),再获取对应拟合值yy,但xx长度为20时,yy仅前10个有值,后10个为NA。

原代码:

x <- c(1,2,2,5,8,12,12,16,17,20)
y <- c(2,4,5,6,8,11,12,15,16,20)
df <- data.frame(x,y)

my_mod <- lm(y ~ poly(x,2,raw=T), data=df)     # 构建二次多项式回归模型

xx <- x[1]:x[length(x)] # 基于原x的边界生成单调递增x序列
yy <- fitted(my_mod)[order(xx)]

plot(x,y)
lines(xx,yy)

问题原因

  1. fitted(my_mod)返回的是原数据10个样本的拟合值,仅10个元素;而xx <- x[1]:x[length(x)]生成的是从1到20的20个连续值,两者长度不匹配。
  2. order(xx)在此场景下返回的是1到20的序列(因为xx本身就是单调递增的),用它去索引仅10个元素的fitted(my_mod),超出的11-20位置自然返回NA。

解决方案

不要用原数据的拟合值去匹配新x序列,而是用predict()函数直接对新x值做预测:

x <- c(1,2,2,5,8,12,12,16,17,20)
y <- c(2,4,5,6,8,11,12,15,16,20)
df <- data.frame(x,y)

my_mod <- lm(y ~ poly(x,2,raw=T), data=df)

# 生成20个原x值域内的均匀递增值
xx <- seq(min(x), max(x), length.out = 20)
# 用模型预测新x对应的y值
yy <- predict(my_mod, newdata = data.frame(x = xx))

plot(x,y)
lines(xx,yy)

关键说明

  • seq(min(x), max(x), length.out = 20)可以精准生成指定长度、覆盖原x范围的单调递增序列,比x[1]:x[length(x)]更灵活(比如原x起始不是1时也适用)。
  • predict()函数会根据回归模型的参数,对任意输入的新x值计算对应的预测y值,完美匹配新x序列的长度。

内容的提问来源于stack exchange,提问作者Greg Kawchuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:31:04