2014-02-25 118 views
5

我發現mlogit-package爲多項logit模型尋找估計多項混合logit模型。在閱讀完美的小插圖後,我發現我無法將數據應用於任何描述的示例。多項式混合logit模型mlogit r-package

我現在寫的希望對我的問題有幫助,並創建了一個最小的例子來說明我的情況。

問題如下: 在某處有輔音「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解決,但我還沒有看到它;)

回答

3

rpar參數只接受替代特定的變量。沒有必要在模型公式中指定特定於人員的標識 - 這是通過在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這樣做(但請參閱this post)。

在沒有替代特定協變量的情況下適用於隨機截取的一個選項是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) 

有關問題事先選擇,馬爾可夫鏈的收斂,等弗洛裏安Jaeger的實驗室的博客有一個short tutorial on multinomial models via MCMCglmm,你可能會發現有用的,除了MCMCglmm文檔。

+0

你偶然知道如何實現'syllable'變量的效果編碼嗎?我試過'dat $ syllableEff < - C(dat $ syllable,sum,3)',並使用公式'decision〜-1 + trait + syllableEff',但它似乎沒有工作。如果您不知道,我會發佈一個新主題 – schlusie

+1

@schlusie您可以手動構建對比度。在你的評論中定義了'syllableEff'後:'mmC < - model.matrix(決定〜0 +音節,data = dat)%*%對比(dat $ syllableEff); (mmC)< - c(「s1」,「s2」,「s3」); dat < - data.frame(dat,mmC)'然後用'data = dat'使用公式'decision〜-1 + trait + s1 + s2 + s3'。 –

+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)'。因此,手工創建虛擬變量只是繞過自動化步驟。顯然,對於您的情況,響應是多項式的,但同一個線性模型描述了多項式響應背後的潛在變量(線性預測變量)。 –