首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R总是返回NA作为一个系数,作为线性回归与不必要的变量的结果?

R总是返回NA作为一个系数,作为线性回归与不必要的变量的结果?
EN

Stack Overflow用户
提问于 2017-06-23 12:22:16
回答 2查看 3.3K关注 0票数 5

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

代码语言:javascript
复制
library(swiss)
names(swiss)
# "Fertility"        "Agriculture"      "Examination"      "Education"        
# "Catholic"      "Infant.Mortality"

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

代码语言:javascript
复制
ec <- swiss$Examination + swiss$Catholic

当我们运行一个带有不必要变量的线性回归时,R会删除其他项的线性组合,并返回NA作为它们的系数。下面的命令完美地说明了这一点。

代码语言:javascript
复制
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上回归时,然后所有的回归器,如下所示,

代码语言:javascript
复制
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系数不是NACatholic系数是NA

有人能解释一下原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 12:27:34

会有NA吗?

是。添加这些列不会扩大列空间。得到的矩阵是秩亏的.

多少NA

这取决于数字的等级。

代码语言:javascript
复制
number of NA = number of coefficients - rank of model matrix

在您的示例中,在引入ec之后,将有一个NA。更改模型公式中协变量的规格顺序实质上是对模型矩阵进行列改组。这不会改变矩阵的排序,因此无论您的规范顺序如何,您总是只得到一个NA

好的,但是哪一个是NA

lm使用限制的列旋转进行LINPACK QR分解。协变量的顺序影响到哪一个是NA。一般来说,“先到先得”的原则是成立的,NA的地位是相当可预测的。以你的例子为例。在第一个规范中,这些协线性项以ExaminationCatholicec顺序出现,因此第三个ec具有NA系数。在第二个规范中,这些术语以ecExaminationCatholic顺序显示,第三个Catholic具有NA系数。请注意,系数估计并不是不变量的规格顺序,虽然拟合的值是不变的。

如果采用完全列旋转的LAPACK分解,则系数估计将不受规范阶的影响。然而,NA的位置并不像在LINPACK情况下那样可预测,它完全是由数字决定的。

数值算例

mgcv包中实现了基于LAPACK的QR分解。当使用REML估计时,检测数值秩,不可识别系数报告为0(而不是NA)。因此,我们可以比较lmgam / bam在线性模型估计中的应用。让我们首先构建一个玩具数据集。

代码语言:javascript
复制
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的列进行洗牌,看看NAlm估计下是否改变了它的位置,或者0是否改变了它在gambam估计下的位置。

代码语言:javascript
复制
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

代码语言:javascript
复制
test(fun = lm)

我们看到NA随着X的列洗牌而改变它的位置。估计系数也不同。

现在我们来检查一下gam

代码语言:javascript
复制
library(mgcv)
test(fun = gam, method = "REML")

我们发现,估计对X的列改组是不变的,而X5的系数总是0。

最后,我们检查bam (对于像这里这样的小数据集,bam是慢的。它是为大型或超大型数据集设计的。因此,以下内容明显较慢)。

代码语言:javascript
复制
test(fun = bam, gc.level = -1)

其结果与我们对gam的看法相同。

票数 5
EN

Stack Overflow用户

发布于 2017-06-23 12:36:29

ec检测和是3个参数,需要至少2个变量来确定第三个。重要的是,每三个中有2个是必需的。现在,当你把这个传递给lm时,3个相关变量中的前两个将得到系数,第三个变量将以NA结束。变量的顺序很重要。我希望这解释了考试和天主教两者都不是NA的原因。只有电子商务,你不能同时决定考试和天主教。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44721341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档