R mlogit包:使用LAPACK而不是LINPACK

b1zrtrql  于 11个月前  发布在  Git
关注(0)|答案(1)|浏览(76)

我正在使用一个非常大的数据集(1.016亿个单位替代)来估计一个相当简单的McFadden选择模型。我可以在Stata中使用asclogit命令来估计这个模型,但是当我尝试在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,很明显,相对于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中很好地估计这个模型,所以这不是资源的问题。

2w2cym1i

2w2cym1i1#

感谢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提供了如何做到这一点的帮助)。

相关问题