[英]Outcome prediction using JAGS from R
[代碼已更新,不再與錯誤消息相對應]
我試圖了解JAGS如何預測結果值(對於混合馬爾可夫模型)。 我已經在包含結果m
和協變量x1
, x2
和x3
的數據集上訓練了模型。
在不固定參數值的情況下預測結果在R中有效,但是輸出似乎完全是隨機的:
preds <- run.jags("model.txt",
data=list(x1=x1, x2=x2, x3=x3, m=m,
statealpha=rep(1,times=M), M=M, T=T, N=N), monitor=c("m_pred"),
n.chains=1, inits = NA, sample=1)
編譯rjags模型...使用rjags方法調用仿真...注意:該模型不需要適應性正在模型中燃燒4000次迭代... | *************** *********************************** | 100%運行模型1次迭代...模擬完成完成模擬運行
但是,一旦我嘗試修正參數(即使用模型估計來預測結果m
,我就會得到錯誤:
preds <- run.jags("model.txt",
data=list(x1=x1, x2=x2, x3=x3,
statealpha=rep(1,times=M), M=M, T=T, N=N, beta1=beta1), monitor=c("m"),
n.chains=1, inits = NA, sample=1)
編譯rjags模型...錯誤:使用rjags編譯和調整模型時發生以下錯誤:rjags :: jags.model(model,data = dataenv,n.chains = length(runjags.object $ end.state)中的錯誤,::RUNTIME ERROR:第39行出現編譯錯誤。beta1 [2,1]是邏輯節點,無法觀察到
beta1
在這種情況下是系數估算值的2x2矩陣。
m
(無固定參數)? 只是完全隨機地選擇m
? 該模型是:
model{
for (i in 1:N)
{
for (t in 1:T)
{
m[t,i] ~ dcat(ps[i,t,])
}
for (state in 1:M)
{
ps[i,1,state] <- probs1[state]
for (t in 2:T)
{
ps[i,t,state] <- probs[m[(t-1),i], state, i,t]
}
for (prev in 1:M){
for (t in 1:T) {
probs[prev,state,i,t] <- odds[prev,state,i,t]/totalodds[prev,i,t]
odds[prev,state,i,t] <- exp(alpha[prev,state,i] +
beta1[prev,state]*x1[t,i]
+ beta2[prev,state]*x2[t,i]
+ beta3[prev,state]*x3[t,i])
}}
alpha[state,state,i] <- 0
for (t in 1:T) {
totalodds[state,i,t] <- odds[state,1,i,t] + odds[state,2,i,t]
}
}
alpha[1,2,i] <- raneffs[i,1]
alpha[2,1,i] <- raneffs[i,2]
raneffs[i,1:2] ~ dmnorm(alpha.means[1:2],alpha.prec[1:2, 1:2])
}
for (state in 1:M)
{
beta1[state,state] <- 0
beta2[state,state] <- 0
beta3[state,state] <- 0
}
beta1[1,2] <- rcoeff[1]
beta1[2,1] <- rcoeff[2]
beta2[1,2] <- rcoeff[3]
beta2[2,1] <- rcoeff[4]
beta3[1,2] <- rcoeff[5]
beta3[2,1] <- rcoeff[6]
alpha.Sigma[1:2,1:2] <- inverse(alpha.prec[1:2,1:2])
probs1[1:M] ~ ddirich(statealpha[1:M])
for (par in 1:6)
{
alpha.means[par] ~ dt(T.constant.mu,T.constant.tau,T.constant.k)
rcoeff[par] ~ dt(T.mu, T.tau, T.k)
}
T.constant.mu <- 0
T.mu <- 0
T.constant.tau <- 1/T.constant.scale.squared
T.tau <- 1/T.scale.squared
T.constant.scale.squared <- T.constant.scale*T.constant.scale
T.scale.squared <- T.scale*T.scale
T.scale <- 2.5
T.constant.scale <- 10
T.constant.k <- 1
T.k <- 1
alpha.prec[1:2,1:2] ~ dwish(Om[1:2,1:2],2)
Om[1,1] <- 1
Om[1,2] <- 0
Om[2,1] <- 0
Om[2,2] <- 1
## Prediction
for (i in 1:N)
{
m_pred[1,i] <- m[1,i]
for (t in 2:T)
{
m_pred[t,i] ~ dcat(ps_pred[i,t,])
}
for (state in 1:M)
{
ps_pred[i,1,state] <- probs1[state]
for (t in 2:T)
{
ps_pred[i,t,state] <- probs_pred[m_pred[(t-1),i], state, i,t]
}
for (prev in 1:M)
{
for (t in 1:T)
{
probs_pred[prev,state,i,t] <- odds_pred[prev,state,i,t]/totalodds_pred[prev,i,t]
odds_pred[prev,state,i,t] <- exp(alpha[prev,state,i] +
beta1[prev,state]*x1[t,i]
+ beta2[prev,state]*x2[t,i]
+ beta3[prev,state]*x3[t,i])
}}
for (t in 1:T) {
totalodds_pred[state,i,t] <- odds_pred[state,1,i,t] + odds_pred[state,2,i,t]
}
}
}
TL; DR:我認為您只是想念一個可能性。
您的模型很復雜,所以也許我遺漏了一些東西,但是據我所知,這是不可能的。 您正在提供預測變量x1
, x2
和x3
作為數據,但沒有提供任何觀察到的m
。 那么JAGS可以在什么意義上“擬合”模型?
要回答您的問題:
是的,看來m
是從以模型其余部分為條件的分類分布中隨機抽取的。 由於沒有提供m
作為數據,因此沒有任何參數分布會導致更新,因此,對於m
的結果與從所有先驗中隨機抽取並通過R中的模型傳播它們所得的結果沒有什么不同。管他呢。
盡管從某種意義上說它仍然不能構成擬合模型,但是如果尚未在模型中完全定義beta1
值,您可以自由提供。 JAGS抱怨是因為當前beta1[i] = rcoeff[i] ~ dt(T.mu, T.tau, Tk)
,並且T分布的參數都是固定的。 如果(T.mu, T.tau, Tk)
中的任何一個被(T.mu, T.tau, Tk)
給予(將它們標識為隨機的),則可以將beta1
作為數據提供,JAGS將處理rcoeff[i] ~ dt(T.mu, T.tau, Tk)
作為可能性。 但是在模型的當前形式中,就JAGS而言,如果您提供beta1
作為數據,則與模型中已經存在的固定定義相沖突。
我在這里延伸,但我猜想是,如果您正在使用JAGS,那么您也已經(或希望)將該模型適合JAGS。 在尖齒模型中既包含觀察到的響應又包含預期的預期響應是一種常見的模式,例如:
model {
b ~ dnorm(0, 1) # prior on b
for(i in 1:N) {
y[i] ~ dnorm(b * x[i], 1) # Likelihood of y | b (and fixed precision = 1 for the example)
}
for(i in 1:N_pred) {
pred_y[i] ~ dnorm(b * pred_x[i], 1) # Prediction
}
}
在此示例模型中, x
, y
和pred_x
作為數據提供,未知參數b
將被估計,並且我們希望在pred_y
的每個值處進行后驗預測pred_x
。 JAGS知道第一個for
循環中的分布是可能的,因為y
作為數據提供。 b
后驗樣本將受到這種可能性的限制。 第二個for
循環看起來很相似,但是由於pred_y
沒有作為數據提供,因此它無法約束b
。 相反,JAGS知道可以簡單地繪制以b
和提供的pred_x
條件的pred_y
樣本。 通常將pred_x
的值定義為與觀察到的x
相同,為每個觀察到的數據點提供一個預測間隔,或者作為沿x軸的規則值序列以生成平滑的預測間隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.