You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言拟合二次方程遇下标越界错误,求问题原因

问题分析与解决方案

嘿,你遇到的问题核心是极端严重的多重共线性,而且和你的x数据取值有直接关系!

为什么会出现NA和下标越界?

先看你的x值:1.053848,1.054189,1.054529,这三个数的差异极小(最大差值仅约0.00068),当x的取值范围窄到这种程度时,x会呈现出近乎完美的线性相关关系(你可以用cor(x, x^2)算一下,相关系数几乎等于1)。

线性回归模型lm无法区分两个完全(或近乎完全)共线的变量对y的单独影响,所以它会把其中一个变量的系数设为NA(这里就是I(x^2)的系数)。当你尝试用summary(ypoly)$coefficients[3, 1]提取第三行系数时,要么是因为模型的有效系数行数不足3,要么是该行的系数值为NA导致提取时触发下标越界错误。

另外,虽然三个点理论上可以确定一条抛物线,但在x取值范围极小的情况下,抛物线和直线的差异微乎其微,拟合抛物线本身就没有实际统计意义——这个区间内的曲线几乎就是一条直线。

怎么解决?

这里有几个可行的方向:

  • 检查数据合理性:先确认你的x数据是否正确,是不是应该有更大的取值范围?如果x的取值本就这么窄,那抛物线拟合没有必要。
  • 改用线性模型:直接拟合lm(y ~ x),结果会更可靠,而且在这个极小的x区间内,线性模型的拟合效果和抛物线几乎没有差别。
  • 中心化x以减少共线性:如果一定要拟合抛物线,可以先对x做中心化处理,打破x的共线性:
    x <- c(1.053848,1.054189,1.054529)
    y <- c(0.0137554979,0.0006841939,0.0007282808)
    # 中心化x:减去均值
    x_center <- x - mean(x)
    # 拟合中心化后的抛物线模型
    ypoly_center <- lm(y ~ x_center + I(x_center^2))
    # 提取系数
    summary(ypoly_center)$coefficients
    
    这样你就能得到完整的三个系数,不会再出现NA或下标越界的问题。不过要注意:即使这样,因为x的范围太小,平方项的系数估计依然会非常不稳定,结果的参考价值有限。

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

火山引擎 最新活动