在R中应用固定效应因子打破了回归

时间:2013-07-11 05:20:50

标签: r linear-regression

我正在尝试在R中运行固定效果回归。当我运行线性模型而没有应用固定效果因子时,模型工作得很好。但是当我应用因子 - 这是用户ID的数字代码时,我收到以下错误:

Error in rep.int(c(1, numeric(n)), n - 1L) : cannot allocate vector of length 1055470143

我不确定错误意味着什么,但我担心这可能是在R中正确编码变量的问题。

2 个答案:

答案 0 :(得分:1)

我认为这更具统计性和编程问题,原因有两个:

首先,我不确定您是使用横截面数据还是面板数据。如果你使用横截面数据,控制30000个人是没有意义的(当然,他们会增加变化)。

其次,如果您正在使用面板数据,那么R中有一个很好的包,例如plm包,可以进行这种计算。

答案 1 :(得分:0)

一个例子:

set.seed(42)
DF <- data.frame(x=rnorm(1e5),id=factor(sample(seq_len(1e3),1e5,TRUE)))
DF$y <- 100*DF$x + 5 + rnorm(1e5,sd=0.01) + as.numeric(DF$id)^2

fit <- lm(y~x+id,data=DF)

对于R会话,这需要几乎2.5 GB的RAM(如果您添加操作系统所需的RAM,这比许多PC可用的更多)并且需要一些时间才能完成。结果很无用。

如果您没有遇到RAM限制,您可能会受到矢量长度限制(例如,如果您有更多因子级别),特别是如果您使用较旧版本的R。

会发生什么?

lm的第一步是使用函数model.matrix创建设计矩阵。以下是因素的一个较小的例子:

model.matrix(b~a,data=data.frame(a=factor(1:5),b=2))

#   (Intercept) a2 a3 a4 a5
# 1           1  0  0  0  0
# 2           1  1  0  0  0
# 3           1  0  1  0  0
# 4           1  0  0  1  0
# 5           1  0  0  0  1
# attr(,"assign")
# [1] 0 1 1 1 1
# attr(,"contrasts")
# attr(,"contrasts")$a
# [1] "contr.treatment"

了解n因子水平如何产生n-1个虚拟变量?如果你有很多因子水平和许多观察结果,这个矩阵会变得很大。

你应该怎么做?

我很确定,你应该使用混合效果模型。有两个重要的软件包在R,package nlme和更新的软件包lme4中实现了线性混合效果模型。

library(lme4)

fit.mixed <- lmer(y~x+(1|id),data=DF)
summary(fit.mixed)

Linear mixed model fit by REML 
Formula: y ~ x + (1 | id) 
Data: DF 
    AIC     BIC  logLik deviance REMLdev
1025277 1025315 -512634  1025282 1025269
Random effects:
  Groups   Name        Variance   Std.Dev. 
id       (Intercept) 8.9057e+08 29842.472
Residual             1.3875e+03    37.249
Number of obs: 100000, groups: id, 1000

Fixed effects:
             Estimate Std. Error t value
(Intercept) 3.338e+05  9.437e+02   353.8
x           1.000e+02  1.180e-01   847.3

Correlation of Fixed Effects:
  (Intr)
x 0.000

这需要非常少的RAM,快速计算,并且是更正确的模型。

了解随机拦截如何解释大部分差异?

因此,您需要研究混合效果模型。有一些很好的出版物,例如Baayen, Davidson, Bates (2008),解释如何使用lme4。