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() 似乎在mlogitmFormula 方法中被调用,当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 &lt;-

我通过在 RStudio 中输入 trace(mlogit:::model.matrix.mFormula, edit=TRUE) 查看了 mlogit:::model.matrix.mFormula 的内容。 (感谢this answer 提供有关如何执行此操作的帮助。)

【讨论】:

以上是关于R mlogit 包:使用 LAPACK 而不是 LINPACK的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu科学计算包blas和lapack的安装

期望 LAPACK 例程在两种不同的处理器架构上获得相同的结果是不是合理?

R中混合logit模型的估计时间问题

mlogit.data() 错误:分配的数据 `ids` 必须与现有数据兼容

使用 LAPACK 的 Fortran2003 中的动态内存分配错误

有没有办法使用 read.csv 从字符串值而不是 R 中的文件读取?