作为线性回归的结果,R总是将NA作为系数返回吗?

时间:2017-06-23 12:22:17

标签: r regression linear-regression lm coefficients

我的问题是关于不必要的预测因子,即不提供任何新线性信息的变量或者是其他预测因子的线性组合的变量。如您所见,swiss数据集有六个变量。

library(swiss)
names(swiss)
# "Fertility"        "Agriculture"      "Examination"      "Education"        
# "Catholic"      "Infant.Mortality"

现在我介绍一个新变量ec。它是ExaminationEducation的线性组合。

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  

我希望CatholicExamination的系数都为NA。变量ec是两者的线性组合,但最后Examination的系数不是NA,而Catholic的系数是NA。< / p>

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:5)

  

会有NA

是。添加这些列不会扩大列空间。由此产生的矩阵缺乏等级。

  

多少NA

这取决于数字等级。

number of NA = number of coefficients - rank of model matrix

在您的示例中,在介绍ec后,会有一个NA。更改模型公式中协变量的规范顺序基本上是对模型矩阵进行列重排。这不会改变矩阵等级,因此无论您的规范顺序如何,您始终只能获得一个NA

  

好的,但哪一个是NA

lm使用限制列旋转进行 LINPACK QR分解。协变量的顺序影响哪一个是NA。通常,“first come,first served”原则成立,NA的位置是可以预测的。以你的例子为例。在第一个规范中,这些共线项以ExaminationCatholicec顺序显示,因此第三个ec具有NA系数。在您的第二个规范中,这些字词以ecExaminationCatholic顺序显示,第三个Catholic具有NA系数。注意,系数估计对于规范顺序不是不变的,尽管拟合值是不变的。

如果 LAPACK 采用完整列旋转的QR分解,系数估计将对规范顺序不变。但是,NA的位置不像 LINPACK 那样可预测,并且纯粹是用数字决定的。

数值例子

基于LAPACK的QR分解在mgcv包中实现。当使用REML估计时检测数字秩,并且将不可识别的系数报告为0(不是NA)。因此,我们可以在线性模型估算中对lmgam / 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是否更改了gambam下的位置估计。

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.

最后,我们检查bambam对于像这里的小型数据集来说速度很慢。它专为大型或超大型数据集而设计。所以下面的速度明显变慢了。

test(fun = bam, gc.level = -1)

结果与我们对gam的结果相同。

答案 1 :(得分:3)

考试考试天主教是3个参数,您需要 至少2个变量来确定第三个 即可。 重要的是,总共需要3个中的2个。 现在当你将它传递给lm时,3个相关变量中的前两个将获得系数,第三个变量将以NA结束。变量的顺序很重要。我希望这能解释为什么考试和天主教都不是NA。只有ec,你无法确定考试和天主教