2015-10-01 63 views
2

我是一名學習貝葉斯統計學的學生,剛剛開始使用JAGS,使用我的講師編寫的簡介腳本,與我們(學生)只需輸入數據和迭代次數。以下是加入到它與我的數據的腳本:JAGS分析簡介

setwd("C:\\Users\\JohnSmith\\Downloads") 

rawdata = read.table("bwt.txt",header=TRUE) 
Birthweight = rawdata$Birthweight 
Age = rawdata$Age 

model = "model 
{ 
    beta0 ~ dnorm(0, 1/1000^2) 
    beta1 ~ dnorm(0, 1/1000^2) 

    log_sigma ~ dunif(-10, 10) 
    sigma <- exp(log_sigma) 

for(i in 1:N) 
{ 
    mu[i] <- beta0 + beta1 * Age[i] 
    Birthweight[i] ~ dnorm(mu[i], 1/sigma^2) 
} 
} 
" 

data = list(x=Birthweight, y=Age, N=24) 

# Variables to monitor 
variable_names = c('beta0','beta1') 

# How many burn-in steps? 
burn_in = 1000 

# How many proper steps? 
steps = 100000 

# Thinning? 
thin = 10 

# Random number seed 
seed = 2693795 


    # NO NEED TO EDIT PAST HERE!!! 
    # Just run it all and use the results list. 

library('rjags') 

# Write model out to file 
fileConn=file("model.temp") 
writeLines(model, fileConn) 
close(fileConn) 

if(all(is.na(data))) 
{ 
    m = jags.model(file="model.temp", inits=list(.RNG.seed=seed,    .RNG.name="base::Mersenne-Twister")) 
} else 
{ 
m = jags.model(file="model.temp", data=data, inits=list(.RNG.seed=seed,  .RNG.name="base::Mersenne-Twister")) 
} 
update(m, burn_in) 
draw = jags.samples(m, steps, thin=thin, variable.names = variable_names) 
# Convert to a list 
make_list <- function(draw) 
{ 
    results = list() 
    for(name in names(draw)) 
    { 
     # Extract "chain 1" 
     results[[name]] = as.array(draw[[name]][,,1]) 

     # Transpose 2D arrays 
     if(length(dim(results[[name]])) == 2) 
      results[[name]] = t(results[[name]]) 
    } 
    return(results) 
} 
results = make_list(draw) 

然而,當我運行下面的代碼我收到以下錯誤信息:

Error in jags.model(file = "model.temp", data = data, inits = list(.RNG.seed = seed, : 
    RUNTIME ERROR: 
Compilation error on line 11. 
Unknown parameter Age 

In addition: Warning messages: 
1: In jags.model(file = "model.temp", data = data, inits = list(.RNG.seed =  seed, : 
    Unused variable "x" in data 
2: In jags.model(file = "model.temp", data = data, inits = list(.RNG.seed = seed, : 
    Unused variable "y" in data 

但就我所看到的,行11是空白的,這讓我難以理解錯誤來自何處。如果任何人都可以給我一些技巧來解決這個問題,將不勝感激。

回答

2

數據列表元素的名稱(data)應該與模型中變量的名稱相匹配。

您有:

data = list(x=Birthweight, y=Age, N=24) 

所以JAGS正在尋找變量調用模型xy。然而,在你的模型,你必須:

mu[i] <- beta0 + beta1 * Age[i] 
Birthweight[i] ~ dnorm(mu[i], 1/sigma^2) 

也就是說,你的變量被稱爲AgeBirthweight

所以,要麼改變你的列表:

data <- list(Birthweight=Birthweight, Age=Age, N=24) 

或更改你的模型:

mu[i] <- beta0 + beta1 * y[i] 
x[i] ~ dnorm(mu[i], 1/sigma^2) 

假如你做了readLines('model.temp')(或在文本編輯器中打開model.temp),你會已經看到該文件的第11行指向包含mu[i] <- beta0 + beta1 * Age[i]的行,這是由於引用了Age而導致JAGS遇到的第一個錯誤,其中既沒有提供數據也沒有提供事先說明。

+0

ohhhh,謝謝!正如你可以告訴我,這仍然是非常新的,再次感謝您的幫助。 – jokesOnMe