如何使用mlogit函数中的字符列表作为自变量列表

时间:2014-07-28 02:07:44

标签: r mlogit

我在r中使用mlogit估算多项logit。 有没有办法在mlogit函数中使用变量列表,而不是枚举其中的所有变量?  这是一个可重复的例子。我的问题是如何避免在AGE + SEX函数中输入mlogit

zz <- "Choice AGE SEX
        1  42   2
        1   8   1
        1  37   1
        1   8   2
        1   7   2
        3  50   1
        3  69   1
        3  63   2
        3  37   2
        3  37   1
        3   9   1
        3   6   2
        3  32   2
        3  42   1
        2  62   1
        2  60   1
        2  68   2
        2  69   1
        2  60   2
        2  45   1"

data <- read.table(text = zz, header = TRUE)
Model <- mlogit(Choice ~ 0 | AGE + SEX | 0  , data, shape ="wide", choice = "Choice")

1 个答案:

答案 0 :(得分:1)

行。所以mlogit似乎有自己的自定义公式格式,它基于Formula包,这似乎使得难以使用通常在公式中使用的标准.符号来指定“所有其他变量。“我确实找到了一种扩展这些特殊公式的混乱方法。这是辅助函数

expandFormula <- function(object, data) {
    object<-Formula(object)
    nrhs<-lapply(sapply(lapply(attr(object, "rhs"), function(x)
        eval(as.call(
            list(quote(`~`), 
            attr(object, "lhs")[[1]], 
            x)
         )))), terms, data=data, simplify=T), 
    `[[`, 3)
    attr(object, "rhs")<-nrhs
    object
}

现在,就错误检查而言,此功能并不是非常防御。它假定一个响应并允许多个“右侧”并假设该公式的任何部分都不为空。我们将使用

对您的数据使用此功能
ff <- Choice ~ 0 | . | 0 
Model <- mlogit(expandFormula(ff, data) , data, shape ="wide", choice = "Choice")

这通常是使用公式的首选方式。但是,由于此函数不能很好地发挥,您还可以将公式构建为字符串。你可以做到

resp <- names(data)[1]
covar <- names(data)[-1]
ff <- as.formula(paste(resp, "~", "0","|", paste(covar, collapse="+"),"|","0"))
Model <- mlogit(ff, data, shape ="wide", choice = "Choice")

最终将运行相同的模型。