原始或正交多项式回归?


22

我想将变量回归y到。我应该使用原始多项式还是正交多项式?我在处理这些问题的网站上看了一个问题,但我真的不明白使用它们有什么区别。 x,x2,,x5

为什么我不能只是做一个“正常”的回归得到的系数的βiy=i=05βixi(与p值和所有其他不错的东西一起),而是不必担心使用原始多项式还是正交多项式?在我看来,这种选择超出了我想要做的事情的范围。

在我目前正在阅读的统计书中(Tibshirani等人的ISLR)中没有提到这些东西。其实,他们在某种程度上被淡化。
原因是AFAIK,lm()在R 中的函数中,使用y ~ poly(x, 2)等于使用正交多项式,而使用y ~ x + I(x^2)等于使用原始多项式。但是在第116页上,作者说我们使用第一个选项,因为后者是“麻烦的”,它没有迹象表明这些命令实际上对完全不同的事物(因此具有不同的输出)。
(第三个问题)为什么会ISLR的作者混淆读者这样呢?


1
@Sycorax我知道这poly与正交多项式有关,而I(x ^ 2)与无关(尽管我不知道细节)-但是,为什么ISLR的作者然后会推荐一种不起作用的方法?如果两个命令似乎都执行相同的操作,这似乎会产生误导,但实际上只有一个命令是可以的。
l7ll7

1
@gung我查看了的文档,poly并花了一段时间解决这个问题,但是我不知道为什么poly(x,2)和x + I(x ^ 2)会有所作为?如果问题是题外话,请您在评论中给我启发?
l7ll7

1
@gung我完全重新编辑了我的问题。这种原始的/正交的选择使我更加困惑-以前我认为这只是一个小R技巧,我不了解,但是现在看来这是一个成熟的统计问题,阻碍了我编写不应被回归的回归很难编码。
l7ll7

2
@gung这实际上使我感到困惑,而不是帮助。以前我认为我应该只使用正交多项式,因为这似乎是正确的方法,但是在该答案中使用了原始多项式。令人惊奇的是,每个人都在网上尖叫“RTFM”,但实际上还没有明确的答案,什么时候用什么。(您的链接也没有给出答案,仅举一个例子,当
Orth。pol

2
除非您在某个物理或工程领域中工作,指出响应将是五次多项式,否则几乎可以肯定,正确的方法是首先不要进行多项式回归。投资你的自由度样条线或东西,将远远超过多项式拟合更灵活,更稳定。
whuber

Answers:


10

我相信答案不在于数字稳定性(尽管起着一定作用),而在于减少相关性。

从本质上说 - 这个问题归结为一个事实,当我们回归对一堆高阶多项式,我们对回归协变量变得高度相关。实施例下面的代码:

x = rnorm(1000)
raw.poly = poly(x,6,raw=T)
orthogonal.poly = poly(x,6)
cor(raw.poly)
cor(orthogonal.poly)

这是非常重要的。随着协变量变得更加相关,我们的能力,以确定哪些是重要的(什么他们的影响大小)快速侵蚀。这通常称为多重共线性问题。在极端情况下,如果我们有两个变量是完全相关的,当我们回归他们反对的东西,它无法区分这两个 - 你可以认为这是问题的一个极端版本,但这个问题会影响我们的估计相关程度也较小。因此,在一个真正意义上的 - 即使数值不稳定是不是一个问题 - 从高阶多项式的相关性确实给我们的推论套路了巨大的伤害。这将表现为您可能会看到的更大的标准误差(因此也就是较小的t统计量)(请参见下面的示例回归)。

y = x*2 + 5*x**3 - 3*x**2 + rnorm(1000)
raw.mod = lm(y~poly(x,6,raw=T))
orthogonal.mod = lm(y~poly(x,6))
summary(raw.mod)
summary(orthogonal.mod)

如果运行此代码,则解释会很困难,因为系数都会发生变化,因此很难进行比较。但是,从T统计量来看,我们可以确定,使用正交多项式确定系数的能力要大得多。对于这三个相关系数,正交模型的t统计量为(560,21,449),而原始多项式模型的t统计量仅为(28,-38,121)。对于仅包含几个相对较低阶多项式项的简单模型而言,这是一个巨大的差异。

这并不是说这是免费的。需要牢记两个主要成本。1)我们失去了正交多项式的可解释性。我们可能会理解系数的x**3含义,但是要解释系数x**3-3x(第三个hermite多边形-不一定要使用的系数)可能会困难得多。其次,当我们说这些多项式是正交的时,我们的意思是它们相对于某种距离度量是正交的。采摘的距离的测量,是有关您的情况是很困难的。但是,话虽如此,我相信poly函数的设计目的是要选择与协方差正交的函数,这对于线性回归很有用。


3
-1。较大的标准误差您在低阶系数看到的是一个红色的鲱鱼。在两种模式的低阶系数估计完全不同的东西,所以比较他们的标准差是没有意义的。在两个模型中,最高阶系数是唯一一个估计相同事物的系数,并且您将看到,无论多项式是否正交,t统计量都是相同的。您的两个模型在拟合值,R ^ 2等方面在统计上是等效的,它们的主要区别仅在于系数的解释
Jake Westfall

@JakeWestfall,我认为我不同意你的看法。首先,运行代码产生这对所有的多项式的订单不同,不是所有,但一个价值观-在本质上它采用多项式和做PCA就可以了。其次,更重要的是,t统计量大不相同-在我的答案中运行代码将确认-从功能上讲,我们正在解决多重共线性问题。没错,拟合值,R ^ 2,F检验等不会改变。这实际上是正交化的原因- 除了我们检测多项式项的能力之外,它什么都没有改变。
user5957401 19-10-25

1
回复:第一点,对不起,我的意思是指最高阶术语的t统计量,而不是系数。这种预测被缩放+转移模型之间,所以是在COEF的变化,但它测试同样的实质性效果,如图牛逼
杰克西部荒野

关于第二点,低阶术语“ t统计量显着不同”的原因再次是,因为它们估计了两个模型中完全不同的事物。考虑线性效应:在raw.mod其中估计曲线在x = 0处的斜率,在orthogonal.mod其中估计边缘斜率(即与lm(y ~ poly(x,1))省略高阶项的情况相同)。完全没有理由对这些完全不同的估计值进行估计,并具有可比较的标准误差。人们可以很容易构建一个反例,其中raw.mod具有高得多的叔统计
杰克荒野

@JakeWestfall。我还是觉得你错过了多重共线性。但是,我们似乎彼此交谈,也许有解决方案。你说你可以很容易地构造一个反例,请做。我认为看到您的dgp会为我澄清很多。目前,我所能想到的唯一可能会像您描述的那样发生的事情涉及严重的模型错误指定。
user5957401 19-10-29

8

为什么我不能只做“正常”回归来获得系数?

因为它在数值上不稳定。请记住,计算机使用固定位数表示浮点数。检查IEEE754以获得详细信息,您可能会感到惊讶,即使是简单的数字,计算机也需要将其存储为0.4000000059604644775390625。您可以在这里尝试其他号码0.40.4000000059604644775390625

使用原始多项式将引起问题,因为我们将拥有大量的数字。这是一个小证明:我们正在将矩阵条件数与原始多项式和正交多项式进行比较。

> kappa(model.matrix(mpg~poly(wt,10),mtcars))
[1] 5.575962
> kappa(model.matrix(mpg~poly(wt,10, raw = T),mtcars))
[1] 2.119183e+13

您也可以在此处查看我的答案作为示例。

为什么高阶多项式有大系数


6
您似乎在使用单精度浮点数并将它们引用为四倍精度!那是怎么发生的?除GPU外,几乎所有统计计算都至少使用双精度。例如,在R输出print(0.4, digits=20)IS 0.40000000000000002
whuber

6

我觉得像一些这些答案完全错过了这一点。海涛的回答地址的计算问题,装修原料多项式,但很明显,OP是询问有关统计两种方法之间的差异。也就是说,如果我们有可能会代表所有值完全是一个完美的电脑,我们为什么宁愿一个方法比其他?

user5957401认为,正交多项式会减少多项式函数之间的共线性,这会使它们的估计更稳定。我同意杰克·韦斯特伦的批评。正交多项式中的系数表示的量与原始多项式中的系数完全不同。不管使用正交多项式还是原始多项式,模型暗示的剂量响应函数R2,MSE,预测值和预测值的标准误差都将相同。对系数X2阶原始多项式回归中解释为“的瞬时变化 “。如果你对正交多项式在那里进行的边际效应过程XYX=0X=0X

data("iris")

#Raw:
fit.raw <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
summary(fit.raw)

#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)        1.1034     0.1304   8.464 2.50e-14 ***
#> Petal.Width        1.1527     0.5836   1.975  0.05013 .  
#> I(Petal.Width^2)   1.7100     0.5487   3.116  0.00221 ** 
#> I(Petal.Width^3)  -0.5788     0.1408  -4.110 6.57e-05 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.3898 on 146 degrees of freedom
#> Multiple R-squared:  0.9522, Adjusted R-squared:  0.9512 
#> F-statistic: 969.9 on 3 and 146 DF,  p-value: < 2.2e-16

#Orthogonal
fit.orth <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), data = iris)

#Marginal effect of X at X=0 from orthogonal model
library(margins)
summary(margins(fit.orth, variables = "Petal.Width", 
                at = data.frame(Petal.Width = 0)))
#> Warning in check_values(data, at): A 'at' value for 'Petal.Width' is
#> outside observed data range (0.1,2.5)!
#>       factor Petal.Width    AME     SE      z      p  lower  upper
#>  Petal.Width      0.0000 1.1527 0.5836 1.9752 0.0482 0.0089 2.2965

reprex软件包(v0.3.0)创建于2019-10-25

Petal.Width正交拟合及其标准误差在0处的边际效应与原始多项式拟合的边际效应完全相同。使用正交多项式不会提高两个模型之间相同数量的估计的精度。

YXYX

library(jtools)
data("iris")

fit.raw3 <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
fit.raw1 <- lm(Petal.Length ~ Petal.Width, data = iris)

round(summ(fit.raw3, part.corr = T)$coef, 3)
#>                    Est.  S.E. t val.     p partial.r part.r
#> (Intercept)       1.103 0.130  8.464 0.000        NA     NA
#> Petal.Width       1.153 0.584  1.975 0.050     0.161  0.036
#> I(Petal.Width^2)  1.710 0.549  3.116 0.002     0.250  0.056
#> I(Petal.Width^3) -0.579 0.141 -4.110 0.000    -0.322 -0.074

round(summ(fit.raw1, part.corr = T)$coef, 3)
#>              Est.  S.E. t val. p partial.r part.r
#> (Intercept) 1.084 0.073 14.850 0        NA     NA
#> Petal.Width 2.230 0.051 43.387 0     0.963  0.963

fit.orth3 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), 
               data = iris)
fit.orth1 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3)[,1], 
               data = iris)

round(summ(fit.orth3, part.corr = T)$coef, 3)
#>                                Est.  S.E.  t val. p partial.r part.r
#> (Intercept)                   3.758 0.032 118.071 0        NA     NA
#> stats::poly(Petal.Width, 3)1 20.748 0.390  53.225 0     0.975  0.963
#> stats::poly(Petal.Width, 3)2 -3.015 0.390  -7.735 0    -0.539 -0.140
#> stats::poly(Petal.Width, 3)3 -1.602 0.390  -4.110 0    -0.322 -0.074

round(summ(fit.orth1, part.corr = T)$coef, 3)
#>                                    Est.  S.E. t val. p partial.r part.r
#> (Intercept)                       3.758 0.039 96.247 0        NA     NA
#> stats::poly(Petal.Width, 3)[, 1] 20.748 0.478 43.387 0     0.963  0.963

reprex软件包(v0.3.0)创建于2019-10-25

0.0010.0030.0050.9270.9270.0200.0050.927。从正交多项式模型而不是原始多项式模型,我们知道大部分的方差的结果,由于线性名词解释是,从平方项很少来了,甚至更少从三次项。原始多项式值不告诉的故事。

现在,无论您是想让这种解释上的好处,而不是实际上能够理解模型系数的竞争上的好处,那么您都应该使用正交多项式。如果您希望查看系数并确切地知道它们的含义(尽管我通常会怀疑),那么您应该使用原始多项式。如果您不在乎(即,您只想控制混淆或生成预测值),那实际上就没有关系。相对于这些目标,两种形式都携带相同的信息。我还要指出,正交多项式在正则化中应优先使用(例如套索),因为删除高阶项不会影响低阶项的系数,原始多项式则不然,


1
杰出贡献。我无法复制您的边际结果(当我尝试运行您的第一段代码时,margin函数会弹出关于poly的错误-我对margin包不熟悉)-但它们正是我所期望的。作为一个小建议-您还应该在原始模型上包括利润率分析的输出。p值从汇总到边距函数的变化(稍微改变了我们的结论!)(略有改变)削弱了您的论点,这似乎是由于使用正态分布而不是分布引起的。您的正则化点非常好。
user5957401

1
谢谢你的客气话。我认为您必须在stats::in的调用中poly()加入lm()for margins才能识别它(这很愚蠢)。我想将论点集中在点估计和标准误上,我知道这里提供了很多无关紧要的信息,但我希望本文能说明我的观点。
诺亚

不是这个。我完全复制了您的代码,然后您使用stats::poly()。错误提示'degree' must be less than number of unique points-对我没有多大帮助。但是,margin()正在备份可证明的语句,因此它并不重要。
user5957401

4

我证实了@ user5957401的出色响应,并添加了有关插值,外推和报告的注释。

即使在稳定参数值的范围内,通过正交多项式建模的系数/参数也将具有比通过原始参数建模的系数/参数小得多的标准误差。本质上,正交多项式是零协方差描述符的自由集合。那是免费的PCA!

唯一的潜在缺点是必须向不了解零协方差描述符的优点的人解释这一点。在一阶(类似于速度)或二阶(类似于加速度)效应的上下文中,这些系数无法立即得到解释。在业务环境中,这可能是非常可恶的。

10dR2adj R2的。预测能力是相同的。但是参数值的正交模型的标准误差等于或原始模型下面几个数量级。

因此,与原始模型相比,我将更加有把握地报告正交模型。在实践中,我将有两种模式,但我会推断仅与正交之一。


1

我本来想提一下这句话,但我没有足够的代表,所以我将尝试扩展为一个答案。你可能有兴趣地看到,在实验的第7.8.1节中“中的统计学”(詹姆斯等人,2017年,修正8打印),他们讨论了使用正交多项式与否,它是使用之间存在一些差异raw=TRUEraw=FALSEpoly()功能。例如,系数估计值将更改,但拟合值不会:

# using the Wage dataset in the ISLR library
fit1 <- lm(wage ~ poly(age, 4, raw=FALSE), data=Wage)
fit2 <- lm(wage ~ poly(age, 4, raw=TRUE), data=Wage)
print(coef(fit1)) # coefficient estimates differ
print(coef(fit2))
all.equal(predict(fit1), predict(fit2)) #returns TRUE    

书中还讨论了如何在使用正交多项式,使用所获得的所述的p值anova()嵌套F-检验(探索何种程度多项式可能保证)是相同的使用标准t检验时,输出由获得的那些summary(fit)。这说明在某些情况下F统计量等于t统计量的平方。


不论您的信誉等级如何,都不应将评论用作答案。
Michael R. Chernick

关于最后一点,对于非正交多项式也是如此。系数t检验等于F检验,将其中有系数的模​​型与没有回归所有系数的模​​型(一次取一个)进行比较。
诺亚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.