簡體   English   中英

使用R中的JAGS進行結果預測

[英]Outcome prediction using JAGS from R

[代碼已更新,不再與錯誤消息相對應]

我試圖了解JAGS如何預測結果值(對於混合馬​​爾可夫模型)。 我已經在包含結果m和協變量x1x2x3的數據集上訓練了模型。

在不固定參數值的情況下預測結果在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矩陣。

  1. JAGS如何在第一個示例中預測m (無固定參數)? 只是完全隨機地選擇m
  2. 如何包含早期獲得的模型估計值以模擬新的結果值?

該模型是:

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:我認為您只是想念一個可能性。

您的模型很復雜,所以也許我遺漏了一些東西,但是據我所知,這是不可能的。 您正在提供預測變量x1x2x3作為數據,但沒有提供任何觀察到的m 那么JAGS可以在什么意義上“擬合”模型?

要回答您的問題:

  1. 是的,看來m是從以模型其余部分為條件的分類分布中隨機抽取的。 由於沒有提供m作為數據,因此沒有任何參數分布會導致更新,因此,對於m的結果與從所有先驗中隨機抽取並通過R中的模型傳播它們所得的結果沒有什么不同。管他呢。

  2. 盡管從某種意義上說它仍然不能構成擬合模型,但是如果尚未在模型中完全定義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
  }
}

在此示例模型中, xypred_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.

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