R中的高(或非常高)阶多项式回归(或替代?)

时间:2016-10-01 04:49:18

标签: r regression linear-regression lm polynomials

我想对(R)中的一组数据进行(非常)高阶回归拟合,但poly()函数的有限数为25。

对于这个应用程序,我需要一个100到120范围内的订单。

model <- lm(noisy.y ~ poly(q,50))
# Error in poly(q, 50) : 'degree' must be less than number of unique points
model <- lm(noisy.y ~ poly(q,30))
# Error in poly(q, 30) : 'degree' must be less than number of unique points
model <- lm(noisy.y ~ poly(q,25))
# OK

1 个答案:

答案 0 :(得分:10)

多项式和正交多项式

poly(x)没有degree的硬编码限制。但是,实践中存在两个数值约束。

  • 基础函数构造在x值的唯一位置。度k的多项式具有k + 1基和系数。 poly生成没有拦截术语的基础,因此degree = k隐含k基础和k系数。如果有n个唯一x值,则必须满足k <= n,否则根本没有足够的信息来构造多项式。在poly()内,以下行检查此条件:

    if (degree >= length(unique(x))) 
        stop("'degree' must be less than number of unique points")
    
  • 随着x ^ k的增加,x ^ (k+1)k之间的相关性越来越接近1。这种接近的速度当然取决于x值。 poly首先生成普通多项式基础,然后执行QR分解以找到正交跨度。如果在x ^ kx ^ (k+1)之间出现数字排名不足,poly也会停止并抱怨:

    if (QR$rank < degree) 
        stop("'degree' must be less than number of unique points")
    

    但在这种情况下,错误消息不提供信息。此外,这不一定是一个错误;它可以是一个警告,然后poly可以重置degreerank继续。也许R核心可以改善这一点??

您的反复试验表明您无法构建超过25度的多项式。您可以先查看length(unique(q))。如果你的学位小于此但仍然会触发错误,你肯定知道这是由于数字等级不足造成的。

但我想说的是超过3-5度的多项式永远不会有用!关键原因是Runge's phenomenon。在统计术语方面:高阶多项式总是严重过度数据!。不要以为,因为正交多项式在数值上比原始多项式更稳定,所以可以消除龙格的效应。不,k的多项式形成向量空间,因此无论您使用什么基础进行表示,它们都具有相同的跨度!

样条:分段三次多项式及其在回归中的用法

多项式回归确实很有用,但我们经常需要分段多项式。最受欢迎的选择是三次样条。就像那样,多项式有不同的表示,有很多样条表示:

  • 截断功率基础
  • 自然三次样条基础
  • B样条基础
B-spline基础是数值最稳定的,因为它具有紧凑的支持。因此,协方差矩阵X'X被绑定,因此求解正规方程(X'X) b = (X'y)非常稳定。

在R中,我们可以使用bs包中的splines函数(R基础包之一)来获得B样条基础。对于bs(x),对自由度df的唯一数字限制是我们不能有length(unique(x))的基础。

我不确定您的数据是什么样的,但也许您可以尝试

library(splines)
model <- lm(noisy.y ~ bs(q, df = 10))

惩罚平滑/回归样条

如果您不断增加自由度,回归样条仍可能会过度拟合您的数据。最好的模式似乎是选择最佳自由度。

一种很好的方法是使用惩罚平滑样条或惩罚回归样条,以便模型估计和自由度的选择(即&#34;平滑度&#34;)被整合。

smooth.spline包中的stats函数可以同时执行这两项操作。与其名称似乎表明的不同,大部分时间它只是拟合惩罚的回归样条而不是平滑样条。请阅读?smooth.spline了解更多信息。对于您的数据,您可以尝试

fit <- smooth.spline(q, noisy.y)

(注意,smooth.spline没有公式界面。)

添加惩罚样条线和广义加法模型(GAM)

一旦我们有一个以上的协变量,我们需要加法模型来克服维数的诅咒&#34;虽然是明智的。根据平滑函数的表示,GAM可以有多种形式。在我看来,最流行的是mgcv包,由R推荐。

您仍然可以使用mgcv符合单变量惩罚回归样条:

library(mgcv)
fit <- gam(noisy.y ~ s(q, bs = "cr", k = 10))