R mlogit package: используйте LAPACK вместо LINPACK - PullRequest
1 голос
/ 13 июня 2019

Я оцениваю довольно простую модель выбора Макфаддена, используя очень большой набор данных (101,6 миллиона единиц-альтернатив). Я могу точно оценить эту модель в Stata, используя команду asclogit, но когда я пытаюсь использовать пакет mlogit в R, я получаю следующую ошибку:

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, становится ясно, что количество элементов в моей матрице дизайна слишком велико по сравнению с пределом 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(), кажется, вызывается в методе mFormula из mlogit, когда создается model.matrix и, вероятно, при проверке NA . Но я не могу сказать, есть ли способ передать LAPACK = TRUE в mlogit или есть способ пропустить проверку NA.

Я надеюсь @ YvesCroissant увидит это.

Как я уже говорил, я могу точно оценить эту модель в Stata, так что это не вопрос ресурсов. Моя лицензия Stata не переносима, поэтому я хотел бы использовать R.

1 Ответ

1 голос
/ 14 июня 2019

Благодаря комментариям Юлиуса и этой записи о пространствах имен в 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-скрипт, в который я копирую / вставляю содержимое mlogit:::model.matrix.mFormula и добавляю mymFormula <- перед вызовом function в верхней части файла.

Я просмотрел содержимое mlogit:::model.matrix.mFormula, набрав trace(mlogit:::model.matrix.mFormula, edit=TRUE) в RStudio. (Спасибо этому ответу за помощь в том, как это сделать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...