簡體   English   中英

jags.model中的錯誤

[英]Error in jags.model

我是R和JAGS的新手,甚至沒有編程經驗。

我正在嘗試為某些數據建立分層模型,但出現此錯誤:

####error in line above:
Error in jags.model(file = "modelControl.txt", data = dataList, inits = 
initsList,  : 
  RUNTIME ERROR:
Cannot insert node into beta1[1:158]. Dimension mismatch

在下面的代碼運行結束時。 我究竟做錯了什么? 如何避免該錯誤?

#declaration
y=as.numeric(PANSS[treat == 0]) #treat == 0 indicates control group
x=as.numeric(time[treat == 0])
meanYcontrol = mean(PANSS[treat == 0])
sdYcontrol = sd(PANSS[treat == 0])
s = pp[treat==0]

#data list
dataList = list(
  y = y,
  x = x,
  Ntotal = length(y),
  Nsubj = length(y)/6 , #each subject had 6 test moments
  s = s
)
#model
modelString = "
model {
for ( i in 1:Ntotal ) {
y[i] ~ dnorm( beta0[s[i]] + beta1[s[i]] * x[i,1], 1/sigma^2 ) 
}
for ( j in 1:Nsubj ) {
beta0[j] ~ dnorm( beta0mu , 1/(beta0sigma)^2 ) 
beta1[j] ~ dnorm( beta1mu , 1/(beta1sigma)^2 )
}
#vague priors
beta0 ~ dnorm( 0, 1/(10)^5 )  
beta1 ~ dt( 0, 1, 1 ) #Cauchy distribution
beta0sigma ~ dunif( 1.0E-5, 1.0E+5 )
beta1sigma ~ dunif( 1.0E-5, 1.0E+5 )
sigma ~ dunif( 1.0E-5, 1.0E+5 )
nu = nuMinusOne+1
nuMinusOne ~ dexp(1/29)
}
"

 #write model to text file
writeLines(modelString, con="modelControl.txt")

#initialization chains
beta0Init = meanYcontrol
beta1Init = 0
sigmaInit = sdYcontrol
initsList = list(beta0=beta0Init, beta1=beta1Init, sigma=sigmaInit)

#run chains
parameters = c("beta0", "beta1", "sigma") #parameters to be monitored
numSavedSteps = 7500 #number of steps in chain to save
adaptSteps = 1000  #number of steps to tune the samplers
burnInSteps = 500 #number of steps to burn-in the samplers
thinSteps = 1 #number of steps to keep (1=keep every step)
nChains = 3 #number of chains to run
nIter = ceiling(numSavedSteps / nChains) #number of steps per chain

jagsModel = jags.model(file="modelControl.txt", data=dataList, inits = 
initsList, n.chains=nChains, n.adapt=adaptSteps)

您的評論暗示您已更改了模型中的某些內容,但問題中的模型定義未更改(或可能已部分編輯)。 我認為這是您現在正在使用的:

model {
for ( i in 1:Ntotal ) {
y[i] ~ dnorm( beta0[s[i]] + beta1[s[i]] * x[i,1], 1/sigma^2 ) 
}
for ( j in 1:Nsubj ) {
beta0[j] ~ dnorm( beta0mu , 1/(beta0sigma)^2 ) 
beta1[j] ~ dnorm( beta1mu , 1/(beta1sigma)^2 )
}
#vague priors
beta0mu ~ dnorm( 0, 1/(10)^5 )  
beta1mu ~ dt( 0, 1, 1 ) #Cauchy distribution
beta0sigma ~ dunif( 1.0E-5, 1.0E+5 )
beta1sigma ~ dunif( 1.0E-5, 1.0E+5 )
sigma ~ dunif( 1.0E-5, 1.0E+5 )
nu = nuMinusOne+1
nuMinusOne ~ dexp(1/29)
}

# In R:
meanYcontrol = mean(PANSS[treat == 0])
sdYcontrol = sd(PANSS[treat == 0])
beta0Init = meanYcontrol
beta1Init = 0
sigmaInit = sdYcontrol
initsList = list(beta0=beta0Init, beta1=beta1Init, sigma=sigmaInit)

因此,您提供了beta0和beta1的初始值,但我認為它們打算用於beta0mu和beta1mu。 不過,可能還會有其他錯誤-很難檢查,因為目前我們無法運行模型,因為我們沒有您的數據。 將來,最好提供一個最小的可復制示例,包括所需的任何數據等,因為這將有助於為您生成更快,更完整的答案。

避免這種錯誤的一種方法是在runjags包中使用#inits#和#data#標記,這可以使使用的數據和初始值更加明顯,例如:

model {
    for ( i in 1:Ntotal ) {   #data# Ntotal
        y[i] ~ dnorm( beta0[s[i]] + beta1[s[i]] * x[i,1], 1/sigma^2 ) 
            #data# y, x, s
    }
    for ( j in 1:Nsubj ) {  #data# Nsubj
        beta0[j] ~ dnorm( beta0mu , 1/(beta0sigma)^2 ) 
        beta1[j] ~ dnorm( beta1mu , 1/(beta1sigma)^2 )
            #inits# beta0mu, beta1mu
    }
    #vague priors
    beta0mu ~ dnorm( 0, 1/(10)^5 )  
    beta1mu ~ dt( 0, 1, 1 ) #Cauchy distribution
    beta0sigma ~ dunif( 1.0E-5, 1.0E+5 )
    beta1sigma ~ dunif( 1.0E-5, 1.0E+5 )
    sigma ~ dunif( 1.0E-5, 1.0E+5 )
        #inits# sigma
    nu = nuMinusOne+1
    nuMinusOne ~ dexp(1/29)
}

[注意,我也使用縮進使模型更易於閱讀-這通常有助於識別錯誤,甚至無需發布模型。

然后在R中,您只需要指定要在您的工作環境中使用的數據和初始化,然后使用:

results <- runjags::run.jags("modelControl.txt", monitor=...)

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM