R mlogit 包:使用 LAPACK 而不是 LINPACK
Posted
技术标签:
【中文标题】R mlogit 包:使用 LAPACK 而不是 LINPACK【英文标题】:R mlogit package: use LAPACK instead of LINPACK 【发布时间】: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,而这正是它所需要的。不过,我可能会想出一些东西并编辑我的帖子。
【参考方案1】:
感谢 Julius 的评论和 R 中命名空间的 this post,我找到了答案。我在库语句之后添加了以下代码:
source("mymFormula.R")
tmpfun <- get("model.matrix.mFormula", envir = asNamespace("mlogit"))
environment(mymFormula) <- environment(tmpfun)
attributes(mymFormula) <- attributes(tmpfun) # don't know if this is really needed
assignInNamespace("model.matrix.mFormula", mymFormula, ns="mlogit")
mymFormula.R
是一个 R 脚本,我在其中复制/粘贴了mlogit:::model.matrix.mFormula
的内容,并在文件顶部的function
调用之前添加了mymFormula <-
。
我通过在 RStudio 中输入 trace(mlogit:::model.matrix.mFormula, edit=TRUE)
查看了 mlogit:::model.matrix.mFormula
的内容。 (感谢this answer 提供有关如何执行此操作的帮助。)
【讨论】:
以上是关于R mlogit 包:使用 LAPACK 而不是 LINPACK的主要内容,如果未能解决你的问题,请参考以下文章
期望 LAPACK 例程在两种不同的处理器架构上获得相同的结果是不是合理?
mlogit.data() 错误:分配的数据 `ids` 必须与现有数据兼容