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.R
的 source 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()
似乎在 mlogit
的 mFormula
方法中被调用,当 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 提供有关如何执行此操作的帮助。)
我正在使用一个非常大的数据集(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,很明显我的设计矩阵中的元素数量相对于 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()
似乎在 mlogit
的 mFormula
方法中被调用,当 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 提供有关如何执行此操作的帮助。)