2017-09-07 19 views
0

아래의 로지스틱 회귀 모델에 대해 n (y)에 대한 정수가 아닌 값을 사용하여 사후에서 샘플을 추출 할 수 있기를 원합니다. 이것은 부분 데이터가 가능하거나 다운 웨이트가 바람직 할 때 이러한 종류의 모델에서 발생할 수 있습니다.비 정수 가중치가있는 JAGS 로지스틱 회귀 모델

model <- function() { 
    ## Specify likelihood 
    for (i in 1:N1) { 
     y[i] ~ dbin(p[i], n[i]) 
     logit(p[i]) <- log.alpha[1] + alpha[2] * d[i] 
    } 
    ## Specify priors 
    alpha[1] <- exp(log.alpha[1]) 
    alpha[2] <- exp(log.alpha[2]) 
    Omega[1:2, 1:2] <- inverse(p2[, ]) 
    log.alpha[1:2] ~ dmnorm(p1[], Omega[, ]) 
} 

dbin에는 n에 정수 값이 필요하므로 정수가 아닌 n의 경우 오류를 반환합니다.

나는 트릭을 사용하여이를 수행 할 수 있어야하지만 제대로 작동하지는 못한다고 읽었습니다. 도움말 감사.

답변

1

당신이 말했듯이, 당신은 그들 트릭과 함께 할 수 있어야합니다. JAGS는 이항 계수 함수가 없기 때문에 어려운 부분은 이항 우도를 정확하게 코딩합니다. 그러나 there are ways to do this. 아래의 모델은 당신이 원하는 것을 할 수 있어야합니다. 트릭에 대한 자세한 설명은 see my answer here입니다.

data{ 
    C <- 10000 
    for(i in 1:N1){ 
    ones[i] <- 1 
    } 
} 
model{ 
for(i in 1:N1){ 
# calculate a binomial coefficient 
bin_co[i] <- exp(logfact(n[i]) - (logfact(y[i]) + logfact(n[i] - y[i]))) 
# logit p 
logit(p[i]) <- log.alpha[1] + alpha[2] * d[i] 
# calculate a binomial likelihood using ones trick 
prob[i] <- (bin_co[i]*(p[i]^y[i])) * ((1-p[i])^(n[i] - y[i])) 
# put prob in Bernoulli trial and divide by large constant 
ones[i] ~ dbern(prob[i]/C) 
} 
## Specify priors 
alpha[1] <- exp(log.alpha[1]) 
alpha[2] <- exp(log.alpha[2]) 
Omega[1:2, 1:2] <- inverse(p2[, ]) 
log.alpha[1:2] ~ dmnorm(p1[], Omega[, ]) 
} 
+0

위대한 작품입니다! 고맙습니다. 알파에서 상수이기 때문에 bin_co가 불필요하다고 생각하는 것이 맞습니까? –

+0

아니요, 'bin_co'는 각 데이터 포인트 (즉, 이항 계수)에 따라 변경되므로 매우 필요합니다. 'n'과'y'가 각 데이터 포인트마다 바뀌기 때문에'bin_co'도 마찬가지입니다. 두 번째 이유는 이항 계수가 이항 우도의 일부이기 때문입니다. 이를 제거하면 더 이상 분석에서 이항 확률을 사용하지 않습니다. –