【问题标题】:Applying fixed effects factor in R breaks the regression在 R 中应用固定效应因子会破坏回归
【发布时间】:2013-07-11 05:20:49
【问题描述】:

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

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

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

【问题讨论】:

  • 这种错误通常意味着您的工作内存不足。看来 R 正试图在您的实例中分配一个包含 10 亿个值的向量。
  • 我应该将用户 ID 变量重新编码为字符串吗?那会有什么不同吗?我的数据集只有大约 3 万个观测值。
  • 您将不得不提供有关您正在使用的代码的更多信息,以便我们找出问题所在。什么是你的回归调用有效,什么是无效的?例如glm(y ~ x)。您是否还能够提供数据样本:?例如,dput(head(putdatanamehere))
  • 在进行任何建模之前,您应该考虑用户 ID 变量代表什么,以及它是否会真正向模型添加任何内容。
  • reg_lm = lm(Y~ X1 + X2 + X3 + X4 + X5 + X6 + X7 +factor(user_id), data=input_reg)

标签: r linear-regression


【解决方案1】:

我认为这是更多的统计问题和更少的编程问题,原因有两个:

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

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

【讨论】:

  • 是的,你是对的。我花了一夜时间挖掘数据(样本是提供给我的),我现在意识到,虽然我认为个人用户 ID 是被抽样的(所以会有 1000 个用户占 30K 的观察结果),结果是我有接近 30,000 个人,所以是的,数据结果是横截面的。我目前正在尝试返回源数据并对其进行正确采样,我认为它应该在那之后运行干净。
  • 为什么不接受这个答案,以便对未来的用户有用?
  • 哦,对不起!我想我已经清理了我们的数据样本,现在 plm 正在工作。 :)
【解决方案2】:

一个例子:

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)

这需要近 2.5 GB RAM 用于 R 会话(如果您添加操作系统所需的 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 中实现线性混合效果模型,包 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。

【讨论】:

  • 原来提供的样本并不是真正随机的,我们每个用户只有一个观察结果,必须解决这个问题,我们现在可以运行 FE 模型,尽管我会阅读ME 模型也是如此。
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 2021-07-04
  • 2015-04-22
  • 2021-06-16
  • 2015-12-13
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多