【问题标题】:Polynomial Regression nonsense Predictions多项式回归无意义预测
【发布时间】:2012-12-03 12:15:56
【问题描述】:

假设我想用二次(正交)多项式拟合线性回归模型,然后预测响应。这是第一个模型(m1)的代码

x=1:100
y=-2+3*x-5*x^2+rnorm(100)
m1=lm(y~poly(x,2))
prd.1=predict(m1,newdata=data.frame(x=105:110))

现在让我们尝试相同的模型,但不使用 $poly(x,2)$,我将使用它的列,例如:

m2=lm(y~poly(x,2)[,1]+poly(x,2)[,2])
prd.2=predict(m2,newdata=data.frame(x=105:110))

我们来看看m1和m2的总结。

> summary(m1)

Call:
lm(formula = y ~ poly(x, 2))

Residuals:
     Min       1Q   Median       3Q      Max 
-2.50347 -0.48752 -0.07085  0.53624  2.96516 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.677e+04  9.912e-02 -169168   <2e-16 ***
poly(x, 2)1 -1.449e+05  9.912e-01 -146195   <2e-16 ***
poly(x, 2)2 -3.726e+04  9.912e-01  -37588   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.9912 on 97 degrees of freedom
Multiple R-squared:     1,      Adjusted R-squared:     1 
F-statistic: 1.139e+10 on 2 and 97 DF,  p-value: < 2.2e-16 

> summary(m2)

Call:
lm(formula = y ~ poly(x, 2)[, 1] + poly(x, 2)[, 2])

Residuals:
     Min       1Q   Median       3Q      Max 
-2.50347 -0.48752 -0.07085  0.53624  2.96516 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)     -1.677e+04  9.912e-02 -169168   <2e-16 ***
poly(x, 2)[, 1] -1.449e+05  9.912e-01 -146195   <2e-16 ***
poly(x, 2)[, 2] -3.726e+04  9.912e-01  -37588   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.9912 on 97 degrees of freedom
Multiple R-squared:     1,      Adjusted R-squared:     1 
F-statistic: 1.139e+10 on 2 and 97 DF,  p-value: < 2.2e-16 

所以 m1 和 m2 基本相同。现在让我们看看预测 prd.1 和 prd.2

> prd.1
        1         2         3         4         5         6 
-54811.60 -55863.58 -56925.56 -57997.54 -59079.52 -60171.50 

> prd.2
         1          2          3          4          5          6 
  49505.92   39256.72   16812.28  -17827.42  -64662.35 -123692.53 

Q1:为什么 prd.2 与 prd.1 有很大不同?

Q2:如何使用模型m2获取prd.1?

【问题讨论】:

  • 不是答案,但足够高的 R 平方值(0.99 左右)总是让我感到害怕......
  • 这根本不是问题。我们可以用 $y=-2+3*x-5*x^2+x^5+rnorm(100,15)$ 来改变 $y$ 并且 R-squared 减少到 95%,但问题仍然存在预测。
  • 第一个模型的结果在某处看起来像一个病态矩阵。预测只是根据第一个模型估计的无意义系数得出。
  • 共线性很大,这在多项式项中很常见。这可能导致提到的@DeerHunter 病态。在那之后,你用结果来推断,加剧了危险。 prd 的差异可能是由于两个模型的舍入不同。
  • @Peter Flom,poly 创建正交多项式(默认情况下),因此它会显着减少多重共线性(实际上这就是使用 poly 的全部原因!)例如在模型 m2 中,方差膨胀因子(VIF)大约是 1,所以多重共线性不是问题。 (你可以先用包车检查,再用vif(m2))

标签: r regression prediction


【解决方案1】:

m1 是这样做的正确方法。 m2正在进入一个痛苦的世界……

要从m2 进行预测,模型需要知道它已拟合到一组正交基函数,以便它对外推的新数据值使用相同的基函数。比较:poly(1:10,2)[,2]poly(1:12,2)[,2] - 前十个值不一样。如果您使用poly(x,2) 明确地拟合模型,那么predict 会理解所有这些并做正确的事情。

您需要做的是确保使用与最初创建模型时相同的一组基函数来转换您的预测位置。您可以为此使用predict.poly(注意我将解释变量称为x1x2,以便轻松匹配名称):

px = poly(x,2)
x1 = px[,1]
x2 = px[,2]

m3 = lm(y~x1+x2)

newx = 90:110
pnew = predict(px,newx) # px is the previous poly object, so this calls predict.poly

prd.3 = predict(m3, newdata=data.frame(x1=pnew[,1],x2=pnew[,2]))

【讨论】:

  • 非常感谢您的回复。这完全回答了我的问题。我问第二个问题的原因是:假设我们拟合一个 5 次多项式,如 m4=lm(y~poly(x,5))。然后在拟合之后,我们想通过删除两个项来拟合一个新模型(m5):即 2 次和 4 次多项式。最后用这个最终模型(m5)做一些预测。我无法通过仅使用 m4 来做到这一点。但是,这可以通过使用您提到的参数和模型 m3 来完成。
猜你喜欢
  • 2019-07-29
  • 2019-01-24
  • 2018-10-19
  • 1970-01-01
  • 2023-04-10
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多