Прогнозирование результатов с использованием JAGS от 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(модель, data = dataenv, n.chains = длина (runjags.object$end.state),: RUNTIME ERROR: ошибка компиляции в строке 39. beta1[2,1] является логическим узлом и его нельзя наблюдать
beta1
в этом случае матрица оценок коэффициента 2x2.
- Как JAGS предсказывает
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]
}
}
}
1 ответ
TL;DR: я думаю, что вы просто упускаете вероятность.
Ваша модель сложна, поэтому, возможно, я что-то упустил, но, насколько я могу судить, вероятности нет. Вы поставляете предикторы x1
, x2
, а также x3
как данные, но вы не даете никаких наблюдений m
, Итак, в каком смысле JAGS может "соответствовать" модели?
Чтобы ответить на ваши вопросы:
Да, похоже что
m
выбирается случайным образом из категориального распределения, обусловленного остальной частью модели. Так как нетm
Если данные представлены в виде данных, ни у одного из распределений параметров нет причин для обновления, поэтому ваш результат дляm
ничем не отличается от того, что вы получили бы, если бы вы просто делали случайные ничьи со всех априоров и распространяли их через модель в R или как угодно.Хотя это все равно не будет соответствовать модели в любом смысле, вы могли бы предоставить значения для
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. Это общая схема, включающая как наблюдаемый отклик, так и желаемый прогнозируемый отклик в модели зазубрин, например что-то вроде этого:
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 знает, как просто рисовать pred_y
образцы кондиционированы на b
и поставляется pred_x
, Значения pred_x
обычно определяются как наблюдаемые x
давая прогнозный интервал для каждой наблюдаемой точки данных или в виде регулярной последовательности значений вдоль оси x, чтобы сгенерировать плавный прогнозный интервал.