2017-03-21 1 views
1

저는 JAGS에 비교적 익숙하며 R 패키지 jagsUI를 통해 실행합니다. 점유 모델을 구축하고 있지만 결과를 요약하고 싶습니다. 그래서 0과 1의 행렬이 있습니다JAGS 게시물 계산 및 ifelse/step

# Bundle data and summarize data bundle 
str(win.data <- list(y = mat1, M = nrow(mat1), T = ncol(mat1))) 

# Specify model in BUGS language 
sink("model.txt") 
cat(" 
model { 
# Priors 
    psi0 ~ dunif(0, 1) 
    p ~ dunif(0, 1) 
for(t in 1:(T-1)){ 
    rho[t] ~ dunif(-1,1) 
} 
beta0 ~ dnorm(0, 0.1) 
# Likelihood 
    for (i in 1:M) { # Loop over sites 
     z[i,1] ~ dbern(psi0)   # State model 

     y[i,1] ~ dbern(z[i,1]*p) 
     for (j in 2:T) { # Loop over replicate surveys 
      logit(psi[i,j])<- beta0 + rho[j-1]*z[i,j-1] 
      z[i,j] ~ dbern(psi[i,j]) 
      y[i,j] ~ dbern(z[i,j]*p) # Observation model 
     } 
    } 
# Derived quantities 
    coln[i,j] <- ifelse(z[i,j]-z[i,j-1]==1,1,0) # colonized 
    ext[i,j] <- ifelse(z[i,j-1]-z[i,j]==1,1,0) # went extinct 
    tot.coln[,j] <- sum(coln[,j]) # sum of colonized each survey 
    tot.ext[,j] <- sum(ext[,j]) # sum of extinctions each survey 
    Nocc[,j] <- sum(z[,j]) # total sites occupied each survey 
    coln.rate[,j] <- tot.coln[,j]/Nocc[,j] 
    ext.rate[,j] <- tot.ext[,j]/Nocc[,j] 

} 
",fill = TRUE) 
sink() 

# Initial values 
zst <- apply(y, 1, max, na.rm=TRUE)  # Avoid data/model/inits conflict 

y<- as.matrix(y) 
zst<- y 

inits <- function(){list(z = zst)} 

# Parameters monitored 
params <- c("psi0", "p", "beta0", "coln.rate", "ext.rate") 

# MCMC settings 
ni <- 2000 ; nt <- 1 ; nb <- 1000 ; nc <- 3 

# Call JAGS and summarize posteriors 
library(jagsUI) 
fm <- jags(win.data, inits, params, "model.txt", n.chains = nc, 
      n.thin = nt, n.iter = ni, n.burnin = nb) 
print(fm, dig = 3) 

모델은 "# 유도 량"후 조각을 제외하고 실행 : 나는 다음과 같은 모델을 통해 실행하려는

mat1 <- matrix(rbinom(10*10,1,.5),10,10) 
y=mat1 

. 기본적으로 각 조사에서 0에서 1까지 그리고 1에서 0까지의 변화율을 계산하려고합니다. 왜 그것이 작동하지 않는지에 대한 내 생각의 몇 가지. 1) z [i, j]는 실제로 0과 1이 아닙니다. 2) 계산은 유도 된 양으로 진행해서는 안됩니다. 3) JAGS 매뉴얼의 ifelse는 내가 생각하는대로하지 않습니다.

coln[i,j] <- step(z[i,j]-z[i,j-1]-0.5) # colonized 
ext[i,j] <- step(z[i,j-1]-z[i,j]-0.5) # went extinct 

그러나이 행운 :

는 또한 이후로 수량을 파생 처음 두 줄을 교체 "단계"기능을 사용했습니다. 어떤 아이디어?

답변

1

여기를 반복하지 않고 ij의 색인을 생성하고 있습니다. 이 작업을하려면 다른 for 중첩 루프 내에서이 작업을 설정해야합니다. 또한 소멸 계산이 잘못되었습니다.

for(j in 2:T){ 
    for(i in 1:M){ 
    coln[i,j-1] <- ifelse(z[i,j]-z[i,j-1]==1,1,0) # colonized 
    ext[i,j-1] <- ifelse(z[i,j]-z[i,j-1]==-1,1,0) # went extinct 
} 
    tot.coln[j-1] <- sum(coln[,j-1]) # sum of colonized each survey 
    tot.ext[j-1] <- sum(ext[,j-1]) # sum of extinctions each survey 
    Nocc[j-1] <- sum(z[,j-1]) # total sites occupied each survey 
    coln.rate[j-1] <- tot.coln[j-1]/Nocc[j-1] 
    ext.rate[j-1] <- tot.ext[j-1]/Nocc[j-1] 
} 
+0

답장을 보내 주셔서 감사합니다. "# 유도 된 수량"행 다음에 코드를 삽입했는데 작동하지 않았습니다. 또한 'for (i in 1 : M)'루프를 기존 '(j in 2 : T)'루프 내에 배치하려고 시도했지만 실패했습니다. 오류가 "ext.rate의 하위 집합 표현식을 평가할 수 없습니다"때마다. 당신의 대답을 잘못 활용하고 있습니까? – tjr

+0

아. 그건 의미가 있습니다. 'tot.coln','tot.ext','Nocc','coln.rate','ext.rate'는 모두 행렬이 아닌 벡터이어야합니다. 코드가 업데이트되었습니다. 작동하는지 알려주세요. –

+0

위대한 작품, 정말 고마워! # 파생 된 수량 선 다음에 코드를 배치했습니다. – tjr