R mlogit 包:使用 LAPACK 而不是 LINPACK

R mlogit package: use LAPACK instead of LINPACK

我正在使用一个非常大的数据集(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.Rsource code,很明显我的设计矩阵中的元素数量相对于 2,147,483,647 的 LINPACK 限制来说太大了。但是,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 被创建时,可能在 时被调用。但是我不知道是否有办法将 LAPACK = TRUE 传递给 mlogit,或者是否有办法跳过 NA 检查。

我希望 @YvesCroissant 能看到这个。

正如我提到的,我可以在 Stata 中很好地估计这个模型,所以这不是资源问题。但是,我的 Stata 许可证不可移植,这就是我想使用 R 的原因。

感谢 Julius 的评论和 this post 关于 R 中命名空间的评论,我找到了答案。我在库语句之后添加了以下代码:

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 脚本,其中我 copy/pasted mlogit:::model.matrix.mFormula 的内容并在文件顶部的 function 调用之前添加了 mymFormula <- .

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