2014-11-17 7 views
1

JAGS 설명서를 읽었으나 JAGS/R2JAGS 모델의 여러 매개 변수에 동일한 이전 배포를 할당하는 방법을 찾지 못했습니다.for 루프를 사용하여 여러 매개 변수에 대한 사전 분포 할당

예를 들어, 현재 나는 다음과 같은 코드를 많이 반복해야 :

reg.model <- function() { 
    # Model structure 
    for(i in 1:N){ 
    Y[i] ~ dnorm(mu[i], phi) 
    mu[i] <- beta0 + beta1*x1[i] + beta2*x2[i] 
    } 
    sigma2 <- 1/phi 

    # Priors (Lots of re-typing here for beta0, beta1, beta2) 
    phi ~ dgamma(1,1) 
    beta0 ~ dnorm(0, 0.01*phi) 
    beta1 ~ dnorm(0, 0.01*phi) 
    beta2 ~ dnorm(0, 0.01*phi) 
} 

방법이 코드를 건조?

답변

2

독립 변수를 행렬로 전달하고 계수를 벡터에 넣고 행렬 곱셈 (inprod 또는 %*%)을 사용하여 선형 예측자를 계산하면이 작업을 수행 할 수 있습니다.

M <- function() { 
    for (i in 1:n) { 
    y[i] ~ dnorm(mu[i], sd^-2) 
    mu[i] <- X[i, ] %*% beta 
    } 

    sd ~ dunif(0, 100) 
    for (j in 1:J) { 
    beta[j] ~ dnorm(0, 0.0001) 
    } 
} 

우리는 아래 몇 가지 더미 데이터를 생성 :

set.seed(1) 
n <- 1000 
J <- 3 
X <- cbind(1, matrix(runif(n * J), ncol=J)) 

head(X) 
#  [,1]  [,2]  [,3]  [,4] 
# [1,] 1 0.2655087 0.53080879 0.8718050 
# [2,] 1 0.3721239 0.68486090 0.9671970 
# [3,] 1 0.5728534 0.38328339 0.8669163 
# [4,] 1 0.9082078 0.95498800 0.4377153 
# [5,] 1 0.2016819 0.11835658 0.1919378 
# [6,] 1 0.8983897 0.03910006 0.0822944 

b <- rnorm(J + 1, 0, 10) 
sigma <- runif(1) 
y <- c(X %*% b) + rnorm(n, 0, sigma) 

그리고 모델에 맞게 :

library(R2jags) 
out <- jags(list(y=y, X=X, n=n, J=ncol(X)), NULL, c('beta', 'sd'), M) 

지금 추정 계수 및 표준 편차를 비교를 예를 들어

그들의 실제 값 :

out$BUGSoutput$summary[, '50%'] 
#  beta[1]  beta[2]  beta[3]  beta[4]  deviance   sd 
# 8.5783315 -9.3849277 8.9632598 -9.4242272 2196.1535645 0.7264754 

b # True betas 
# [1] 8.500435 -9.253130 8.935812 -9.410097 

sigma # True sd 
# [1] 0.70504 
+0

@Heisenberg - 글을 올린 후, 여러분은 for 루프가없는 해결책을 원한다는 것을 깨달았습니다. 나는 이것이 가능할 것이라고 생각하지 않는다. 루핑은 당신이 얻는 것만큼이나 우아 할 것이다. – jbaums

+1

For 루프가 완벽하게 좋습니다! R을 사용하면 for 루프를 사용하지 않는 방법이 있는지 궁금해 할 것입니다. – Heisenberg