2014-02-25 10 views
5

다항식 혼합로 짓 모델 추정을 위해 다항로 짓 모델에 mlogit - package을 발견했습니다. 훌륭한 비녜 트를 읽은 후에 필자는 설명 된 예제에 내 데이터를 적용 할 수 없음을 발견했습니다.다항식 혼합 로짓 모델 mlogit r- 패키지

나는 이제 내 문제에 도움이되기를 바라고 내 상황을 설명하기위한 최소한의 예를 만들었습니다.

문제는 다음과 같습니다. 자음이 '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 인수는 대체 특정 변수 만 허용합니다. 모델 수식에 개인별 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에서 그렇게 할 수 있다고 생각하지 않습니다 (단 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) 

관련 문제는 사전 선택, 마르코프 체인의 융합 등 플로리안 저격병의 실험실의 블로그 당신이 MCMCglmm 문서뿐만 아니라, 도움 수있는 short tutorial on multinomial models via MCMCglmm 가지고 있습니다.

+0

'syllable' 변수의 효과 코딩을 구현하는 방법을 알고 계십니까? 'dat $ syllableEff <- C (dat $ syllable, sum, 3)'을 시도하고'decision ~ -1 + trait + syllableEff'라는 공식을 사용했지만 작동하지 않았습니다. 모르는 사람은 새로운 토픽을 게시하겠습니다. – schlusie

+1

@schlusie 명암을 수동으로 만들 수 있습니다. 주석에'syllableEff'를 정의한 후,'mmC

+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)'. 따라서 손으로 더미 변수를 생성하면 자동화 된 단계를 건너 뜁니다. 분명히 응답은 귀하의 경우 다항식이지만 동일한 선형 모델은 다항식 응답의 기본 잠재 변수 (선형 예측 변수)를 설명합니다. –