【发布时间】:2019-06-13 18:13:51
【问题描述】:
我正在使用一个非常大的数据集(1.016 亿单位替代方案)来估计一个相当简单的 McFadden 选择模型。我可以使用 asclogit 命令在 Stata 中很好地估计这个模型,但是当我尝试在 R 中使用 mlogit 包时,我收到以下错误:
region1 <- mlogit(chosen ~ mean_log.wage + mean_log.rent + bornNear + Dim.1 + regionFE | 0,
shape= "long", chid.var = "chid", alt.var = "alternatives", data = ready)
Error in qr.default(na.omit(X)) : too large a matrix for LINPACK
Calls: mlogit ... model.matrix -> model.matrix.mFormula -> qr -> qr.default
如果我查看qr.R 的source code,很明显我的设计矩阵中的元素数量相对于LINPACK 的限制2,147,483,647 来说太大了。但是,LAPACK 不存在这样的限制(至少我可以说)。
来自qr.R:
qr.default <- function(x, tol = 1e-07, LAPACK = FALSE, ...)
{
x <- as.matrix(x)
if(is.complex(x))
return(structure(.Internal(La_qr_cmplx(x)), class = "qr"))
## otherwise :
if(LAPACK)
return(structure(.Internal(La_qr(x)), useLAPACK = TRUE, class = "qr"))
## else "Linpack" case:
p <- as.integer(ncol(x))
if(is.na(p)) stop("invalid ncol(x)")
n <- as.integer(nrow(x))
if(is.na(n)) stop("invalid nrow(x)")
if(1.0 * n * p > 2147483647) stop("too large a matrix for LINPACK")
...
qr() 似乎在mlogit 的mFormula 方法中被调用,当model.matrix 被创建时,可能同时checking NAs。但我不知道是否有办法将LAPACK = TRUE 传递给mlogit,或者是否有办法跳过NA 检查。
我希望@YvesCroissant 会看到这个。
正如我所提到的,我可以在 Stata 中很好地估计这个模型,所以这不是资源问题。但是,我的 Stata 许可证不可移植,这就是我想使用 R 的原因。
【问题讨论】:
-
我想你的意思是通过
LAPACK = TRUE。在无法重现问题的情况下有点难以帮助(我们可以简单地为此生成大量数据吗?)。几件事:1)您可能想要查看 RStata 包,允许将 Stata 的输出获取到 R,2)您可以定义自己的函数,与mlogit:::model.matrix.mFormula相同,除了最后的qr(na.omit(X))调用,您可以添加LAPACK = TRUE,然后assignInNamespace("model.matrix.mFormula", myfun, ns = "mlogit")应该覆盖它。 -
@JuliusVainora 我也曾想过在
LAPACK = TRUE的适当位置进行硬编码,但不知道从哪里开始。你的评论很有帮助!不确定生成大量数据来重现此问题是否有用,因为没有多少人可以访问 50+GB 的 RAM,而这正是它所需要的。不过,我可能会想出一些东西并编辑我的帖子。