多项混合Logit模型mlogit R包

6
我在寻找估计多项混合Logit模型的过程中发现了mlogit-package,它用于多项式Logit模型。阅读了优秀的vignette之后,我发现无法将我的数据应用于任何描述的示例中。
现在我希望能得到帮助解决我的问题,并创建了一个最小化的示例来说明我的情况。
问题如下: 有一些包含辅音“Q”的单词。现在进行了实验,让人们听这些单词并说出他们是否听到了Q、U或其他辅音。这必须根据一些因素(如音节位置或真实/非真实单词)建模。
在我创建的最小示例中,有4个人和他们的答案以及音节位置。
library(mlogit)
library(nnet)
set.seed(1234)
data <- data.frame(personID = as.factor(sample(1:4, 40, replace=TRUE)),
               decision = as.factor(sample(c("Q","U", "other"), 40, replace=TRUE)),
               syllable = as.factor(sample(1:4, 40, replace=TRUE)))
summary(data)
 personID  decision  syllable
 1:11     other:10   1:18    
 2:10     Q    :18   2: 9    
 3:10     U    :12   3: 5    
 4: 9                4: 8 

据我所知,nnetmultinom函数不支持混合模型。
modNnet1 <- multinom(decision ~ syllable, data=data)

首先,我使用了mlogit.data函数来重新排列文件。在与同事讨论后,我们得出结论,没有替代的特定变量。

 dataMod <- mlogit.data(data, shape="wide", choice="decision", id.var="personID")

 mod1 <- mlogit(formula = decision ~ 0|syllable,
           data = dataMod,
           reflevel="Q", rpar=c(personID="n"), panel=TRUE)
  Error in names(sup.coef) <- names.sup.coef : 
    'names' attribute [1] must be the same length as the vector [0]

 mod2 <- mlogit(formula = decision ~ personID|syllable,
           data = dataMod,
           reflevel="Q", rpar=c(personID="n"), panel=TRUE)
  Error in solve.default(H, g[!fixed]) : 
     Lapack routine dgesv: system is exactly singular: U[3,3] = 0

我不知道该怎么做,所以在这里寻求帮助。但我相信这种问题可以通过 mlogit 来解决,只是我还没有看到它的方法 ;)

1个回答

5

rpar参数仅接受特定于备选项的变量。在模型公式中不需要指定个人特定id--这是通过在mlogit.data命令中包含id.var = something来处理的。例如,如果你有一个备选项特定的协变量acov,你可以允许面板上acov的随机斜率:

N = 200
dat <- data.frame(personID = as.factor(sample(1:4, N, replace=TRUE)),
               decision = as.factor(sample(c("Q","U", "other"), N, replace=TRUE)),
               syllable = as.factor(sample(1:4, N, replace=TRUE)),
               acov.Q = rnorm(N), acov.U = rnorm(N), acov.other = rnorm(N))
dataMod <- mlogit.data(dat, shape="wide", choice="decision", id.var="personID", varying = 4:6)
mlogit(formula = decision ~ acov|syllable, rpar = c(acov = "n"), panel = T, data = dataMod)

看起来你正在尝试为每个替代方案拟合具有随机的个人特定截距的模型(没有随机斜率)。不幸的是,我认为你不能在 mlogit 中这样做(但请参见此帖子)。
在没有特定于备选方案的协变量的情况下适用于拟合随机截距的一种选项是 MCMCglmm
library(MCMCglmm)
priors = list(R = list(fix = 1, V = 0.5 * diag(2), n = 2),
              G = list(G1 = list(V = diag(2), n = 2)))
m <- MCMCglmm(decision ~ -1 + trait + syllable,
              random = ~ idh(trait):personID,
              rcov = ~ us(trait):units,
              prior = priors,
              nitt = 30000, thin = 20, burnin = 10000,
              family = "categorical",
              data = dat)

相关问题包括先前选择、马尔科夫链的收敛等。 Florian Jaeger 实验室的博客通过 MCMCglmm 提供了关于多项式模型的简短教程,您可能会觉得有所帮助,此外还可以参考 MCMCglmm 的文档。


你是否知道如何实现音节(syllable)变量的效应编码?我尝试过使用dat$syllableEff <- C(dat$syllable, sum,3)的代码,并使用公式decision ~ -1 + trait + syllableEff,但好像没有起作用。如果你不知道的话,我会发一个新主题。 - schlusie
1
@schlusie 您可以手动构建对比。在定义 syllableEff 如您的评论中所述之后:mmC <- model.matrix(decision ~ 0 + syllable, data = dat) %*% contrasts(dat$syllableEff); colnames(mmC) <- c("s1", "s2", "s3"); dat <- data.frame(dat, mmC) 然后使用公式 decision ~ -1 + trait + s1 + s2 + s3,并将 data = dat - Nate Pope
1
@schlusie 只是为了跟进一个(希望)更清晰的例子,请考虑基于上述模拟数据的以下线性模型:dat$y <- rnorm(N); dat$trait <- factor(sample(1:3, N, replace = T)); mod1 <- lm(y ~ 0+trait+syllableEff, data = dat); mod2 <- lm(y ~ 0+trait+mmC, data = dat)。这些模型是相同的:coef(mod1) == coef(mod2)。因此,手动创建虚拟变量只是绕过了自动化步骤。显然,在您的情况下,响应是多项式的,但是相同的线性模型描述了潜在变量(多项式响应下的线性预测器)。 - Nate Pope
非常感谢你,Nate。第一条评论帮助我解决了我的问题,第二条评论帮助我理解了背后的原理。(甚至更好地理解了特征是什么;)) - schlusie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接