我使用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
输出中检索单个模型是否比手工指定模型更直接?
答案 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)3
和poly(x, 5)5
。您可以安全地删除poly(x, 5)5
,但仍然建议保留poly(x, 5)3
。这是代替四阶多项式,而不是拟合五阶多项式。leaps
掉落poly(x, 6)3
和poly(x, 6)5
。由于poly(x, 6)6
没有被删除,因此建议您不要删除任何术语。