我的问题是关于不必要的预测变量,即不提供任何新线性信息的变量或其他预测变量的线性组合的变量。正如您所看到的
swiss
数据集有六个变量。
library(swiss)
names(swiss)
# "Fertility" "Agriculture" "Examination" "Education"
# "Catholic" "Infant.Mortality"
现在我引入一个新变量
ec
。它是 Examination
和 Catholic
的线性组合。
ec <- swiss$Examination + swiss$Catholic
当我们使用不必要的变量运行线性回归时,R 会删除其他项的线性组合项,并返回
NA
作为它们的系数。下面的命令完美地说明了这一点。
lm(Fertility ~ . + ec, swiss)
Coefficients:
(Intercept) Agriculture Examination Education
66.9152 -0.1721 -0.2580 -0.8709
Catholic Infant.Mortality ec
0.1041 1.0770 NA
但是,当我们首先对
ec
进行回归,然后对所有回归量进行回归时,如下所示,
lm(Fertility ~ ec + ., swiss)
Coefficients:
(Intercept) ec Agriculture Examination
66.9152 0.1041 -0.1721 -0.3621
Education Catholic Infant.Mortality
-0.8709 NA 1.0770
我预计
Catholic
和 Examination
的系数均为 NA
。变量ec
是两者的线性组合,但最终Examination
的系数不是NA
,而Catholic
的系数是NA
。
谁能解释一下原因吗?
会有
?NA
是的。添加这些列不会扩大列空间。所得矩阵是秩亏的。
有多少
?NA
这取决于数字排名。
number of NA = number of coefficients - rank of model matrix
在你的例子中,引入
ec
后,就会有一个NA
。更改模型公式中协变量的指定顺序本质上是对模型矩阵进行列改组。这不会改变矩阵秩,因此无论您的规格顺序如何,您始终只会得到一个 NA
。
好的,但是哪一个是
?NA
lm
进行 LINPACK QR 因式分解和 restricted 列旋转。协变量的顺序会影响哪个是 NA
。一般来说,“先来先服务”的原则成立,NA
的位置是可以预见的。举个例子来说明一下。在第一个规范中,这些共线项以 Examination
、Catholic
、ec
的顺序出现,因此第三个 ec
具有 NA
系数。在第二个规范中,这些项按 ec
、Examination
、Catholic
顺序显示,第三个 Catholic
具有 NA
系数。请注意,尽管拟合值是不变的,但系数估计对于规范顺序并不是不变的。
如果采用complete列旋转的LAPACKQR分解,则系数估计对于规范顺序将是不变的。然而,
NA
的位置并不像LINPACK情况那样可预测,而是纯粹由数字决定。
基于 LAPACK 的 QR 分解在
mgcv
包中实现。使用 REML 估计时会检测到数值等级,并且无法识别的系数将报告为 0(不是 NA
)。所以我们可以在线性模型估计中对 lm
和 gam
/ bam
进行比较。我们首先构建一个玩具数据集。
set.seed(0)
# an initial full rank matrix
X <- matrix(runif(500 * 10), 500)
# make the last column as a random linear combination of previous 9 columns
X[, 10] <- X[, -10] %*% runif(9)
# a random response
Y <- rnorm(500)
现在我们打乱
X
的列,看看 NA
是否在 lm
估计下改变了它的位置,或者 0 是否在 gam
和 bam
估计下改变了它的位置。
test <- function (fun = lm, seed = 0, ...) {
shuffleFit <- function (fun) {
shuffle <- sample.int(ncol(X))
Xs <- X[, shuffle]
b <- unname(coef(fun(Y ~ Xs, ...)))
back <- order(shuffle)
c(b[1], b[-1][back])
}
set.seed(seed)
oo <- t(replicate(10, shuffleFit(fun)))
colnames(oo) <- c("intercept", paste0("X", 1:ncol(X)))
oo
}
首先我们检查
lm
:
test(fun = lm)
我们看到
NA
随着 X
的列洗牌而改变了位置。估计系数也有所不同。
现在我们检查
gam
library(mgcv)
test(fun = gam, method = "REML")
我们看到估计对于
X
的列改组是不变的,并且 X5
的系数始终为 0。
最后我们检查
bam
(bam
对于像这里这样的小数据集来说很慢。它是为大型或超大型数据集设计的。所以下面的速度明显慢)。
test(fun = bam, gc.level = -1)
结果与我们看到的
gam
相同。
ec、examination和catholic是3个参数,其中您需要至少2个变量来确定第三个。 重要的是,三分之二始终是必需的。 现在,当您将其传递给 lm 时,3 个相关变量中的前两个将获得系数,第三个将以 NA 结束。变量的顺序很重要。我希望这能解释为什么考试和天主教都不适用。仅凭 ec ,您无法同时确定考试和天主教