0

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

我试图了解 JAGS 如何预测结果值(对于混合马​​尔可夫模型)。m我已经在包含结果和协变量的数据集上训练了模型x1x2并且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 矩阵。

  1. JAGSm在第一个示例中如何预测(无固定参数)?它只是完全随机选择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]
       }
      }
  }
4

1 回答 1

1

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

你的模型很复杂,所以也许我遗漏了一些东西,但据我所知,不可能。您正在提供预测变量x1x2x3作为数据,但您没有提供任何观察到m的 。那么 JAGS 在什么意义上可以“拟合”模型呢?

要回答您的问题:

  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作为数据提供,这与模型中已有的固定定义相冲突。

我在这里伸展一下,但我的猜测是,如果您使用的是 JAGS,那么您也已经(或想要)将模型拟合到 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
  }
}

在这个示例模型中,xy, 和pred_x作为数据提供,未知参数b将被估计,我们希望pred_y在每个 的值处进行后验预测pred_x。JAGS 知道第一个for循环中的分布是一种可能性,因为y它是作为数据提供的。的后验样本b将受到这种可能性的限制。第二个for循环看起来很相似,但由于pred_y不是作为数据提供的,它不能做任何约束b。相反,JAGS 知道简单地pred_y根据b提供的pred_x. 的值pred_x通常定义为与观察到的相同x,给出每个观察到的数据点的预测区间,或者作为沿 x 轴的规则值序列以生成平滑的预测区间。

于 2018-02-22T17:56:23.857 回答