使用R

时间:2018-02-20 13:29:59

标签: r jags runjags rjags

[代码已更新,不再对应错误消息]

我试图了解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),:        运行时错误:      第39行的编译错误。      beta1 [2,1]是一个逻辑节点,无法观察

在这种情况下,

beta1是系数估计的2x2矩阵。

  1. JAGS如何在第一个示例中预测m(没有固定参数)?是完全随机选择m吗?
  2. 如何将先前获得的模型估算值包括在内以模拟新的结果值?
  3. 模型是:

    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]
           }
          }
      }
    

1 个答案:

答案 0 :(得分:1)

TL; DR:我认为您只是错过了可能性。

你的模型很复杂,所以也许我错过了一些东西,但据我所知,这是不可能的。您提供的是预测变量x1x2x3作为数据,但您并未提供任何观察到的m。那么JAGS在什么意义上可以适应&#34;模特?

回答你的问题:

  1. 是的,似乎m是从模型其余部分的分类分布中随机抽取的。由于没有m作为数据提供,因此没有任何参数分布具有更新的原因,因此m的结果与您获得的结果没有什么不同之处先验并通过R或其他任何模型传播它们。

  2. 虽然在任何意义上它仍然不能构成拟合模型,但如果它们尚未在模型中完全定义,您可以自由地提供beta1的值。 JAGS抱怨是因为当前beta1[i] = rcoeff[i] ~ dt(T.mu, T.tau, T.k),并且T分布的参数都是固定的。如果(T.mu, T.tau, T.k)中的任何一个被赋予先验(将其标识为随机),那么beta1可以作为数据提供,JAGS会将rcoeff[i] ~ dt(T.mu, T.tau, T.k)视为可能性。但是在模型的当前形式中,就JAGS而言,如果您提供beta1作为数据,那么这与模型中已有的固定定义相冲突。

  3. 我在这里伸展,但我的猜测是,如果你正在使用JAGS,你也有(或者想)在JAGS中使用该模型。在jag模型中包括观察到的响应和期望的预测响应的常见模式,例如,像这样的东西:

    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知道只需绘制pred_y条件b和提供的pred_x条件。 pred_x的值通常被定义为与观察到的x相同,为每个观察到的数据点提供预测间隔,或者作为沿x轴的常规值序列以生成平滑的预测间隔