拟合由“ leaps :: regsubsets”

时间:2018-07-07 13:58:01

标签: r regression linear-regression lm polynomials

我使用leaps::regsubsets执行了线性回归模型的最佳子集选择。然后,我选择了具有14个预测变量的模型,并使用coef(model, 14)给了我以下输出:

structure(c(16.1303774392893, -0.0787496652705482, -0.104929454314886, 
-1.22322411065346, 1.14718778105312, 0.75468065020279, 0.455617836039703, 
0.521951041899427, 0.0124590834643436, -0.0002293804247409, 
1.26667965342874e-07, 1.4002805624594e-06, -9.90560347112683e-07, 
1.8809273394337e-06, 5.48249071436573e-07), .Names = c("(Intercept)", "X1", 
"X2", "poly(X4, 2)1", "poly(X5, 2)1", "poly(X6, 2)2", "poly(X7, 2)2", 
"poly(X9, 2)1", "X10", "X12", "X13", "X14", "X16", "X17", "X18"))

要获得此模型,我需要使其与lm相适应。由于poly(X, 2)1是线性的,而poly(X, 2)2是平方的,所以我这样做了:

lm(X20 ~ X1 + X2 + X4 + X5 + I(X6 ^ 2) + I(X7 ^ 2) +
         X9 + X10 + X12 + X13 + X14 + X16 + X17 + X18, df)

我想我知道为什么系数不同(请参阅poly() in lm(): difference between raw vs. orthogonal),但是为什么它们不给出相同的拟合值并调整R2?

当然,在公式中使用poly(X, 2)[,2]可以与regsubsets输出完全一致。但是仅使用第二项正交多项式并指定模型如下是否合法?

lm(X20 ~ X1 + X2 + X4 + X5 + poly(X6, 2)[,2] + poly(X7, 2)[,2] +
   X9 + X10 + X12 + X13 + X14 + X16 + X17 + X18, df) 

regsubsets输出中检索单个模型是否比手工指定模型更直接?

1 个答案:

答案 0 :(得分:3)

  

但是为什么不给出相同的拟合值和调整后的R2?

如果不使用poly中的所有列,则拟合值不一定相同。

set.seed(0)
y <- runif(100)
x <- runif(100)
X <- poly(x, 3)

all.equal(lm(y ~ X)$fitted, lm(y ~ x + I(x ^ 2) + I(x ^ 3))$fitted)
#[1] TRUE

all.equal(lm(y ~ X[, 1:2])$fitted, lm(y ~ x + I(x ^ 2))$fitted)
#[1] TRUE

all.equal(lm(y ~ X - 1)$fitted, lm(y ~ x + I(x ^ 2) + I(x ^ 3) - 1)$fitted)  ## no intercept
#[1] "Mean relative difference: 33.023"

all.equal(lm(y ~ X[, c(1, 3)])$fitted, lm(y ~ x + I(x ^ 3))$fitted)
#[1] "Mean relative difference: 0.03008166"

all.equal(lm(y ~ X[, c(2, 3)])$fitted, lm(y ~ I(x ^ 2) + I(x ^ 3))$fitted)
#[1] "Mean relative difference: 0.03297488"

对于任何~ 1 + poly(x, degree)[, 1:k],我们只有~ 1 + x + I(x ^ 2) + ... + I(x ^ k)相当于k <= degree。 (我明确写出了截距,以强调我们必须从0度的多项式开始。)

原因与如何生成正交多项式有关。请参见How `poly()` generates orthogonal polynomials? How to understand the "coefs" returned?以了解更多详细信息。请注意,在进行QR分解X = QR时,因为R上三角矩阵(不是对角矩阵),Q[, ind]对于任意子集X[, ind]的列空间将与ind相同,除非ind = 1:k

因此,I(x ^ 2)不等于ploy(x, 2)[, 2],因此您将获得不同的拟合值,因此(调整后)R2。

  

仅使用第二项正交多项式并按以下方式指定模型是否有效?

leaps(或者通常是任何建模者)从正交多项式中删除列确实是一个坏主意。正交多项式是一个类似于因子的术语,其重要性由F统计量(即,将所有列作为一个整体进行处理)确定,而不是由单个列的t统计量确定。

实际上,即使对于原始多项式,也不要忽略任何低阶项。例如,y ~ 1 + I(x ^ 2)省略线性项不是一个好主意。这里的一个基本问题是线性位移不是不变的。例如,如果我们将x换为x1

shift <- runif(1)  ## an arbitrary value; can be `mean(x)`
x1 <- x - shift

然后,y ~ 1 + I(x ^ 2)不等同于y ~ 1 + I(x1 ^ 2),但是y ~ 1 + x + I(x ^ 2)等同于y ~ 1 + x1 + I(x1 ^ 2)

all.equal(lm(y ~ 1 + I(x ^ 2))$fitted, lm(y ~ 1 + I(x1 ^ 2))$fitted)
#[1] "Mean relative difference: 0.02020984"

all.equal(lm(y ~ 1 + x + I(x ^ 2))$fitted, lm(y ~ 1 + x1 + I(x1 ^ 2))$fitted)
#[1] TRUE

我简要地提到了在R: How to or should I drop an insignificant orthogonal polynomial basis in a linear model?处删除列的问题,但是我的示例在这里为您提供了更多的见识。

  

regsubsets输出中检索单个模型是否比手工指定模型更直接?

我不知道;至少在2年前,我回答这个线程Get all models from leaps regsubsets时并没有弄清楚。


  

还有一个问题。假设leaps返回poly(X, 2)1,我肯定应该在模型中保留poly(X, 2)1。但是,如果poly(X, 2)1仅返回leaps怎么办?可以删除更高阶的词吗?

删除高阶项没有问题(在这种情况下,您最初拟合的是二次多项式)。就像我说的,我们与ind = 1:j等价,其中j <= degree。但是请确保您了解这一点。举两个例子。

  • 如果leaps掉落了poly(x, 5)3poly(x, 5)5您可以安全地删除poly(x, 5)5,但仍然建议保留poly(x, 5)3 。这是代替四阶多项式,而不是拟合五阶多项式。
  • 如果leaps掉落poly(x, 6)3poly(x, 6)5 。由于poly(x, 6)6没有被删除,因此建议您不要删除任何术语。