Ошибки JAGS: "Разрешение необъявленных переменных" и "Недопустимый векторный аргумент в exp"
Я впервые использую JAGS, и при моделировании моих данных я столкнулся с некоторыми ошибками.
Вот краткое описание моих данных: в общей сложности n
человек (например, 2) каждый решил m
проблемы (например, 6). На все задачи есть 3 ответа, каждое из которых имеет определенную ценность V
,
Вот графическая модель (некоторые имена переменных отличаются: IG
а также y
такие же как V
а также answer
соответственно; x
не входит в мою модель).
Вероятность того, что человек i
выбирает каждый ответ для задачи j
следует "правилу принятия решения softmax": exp(V[j,]/tau[i])/sum(exp(V[j,]/tau[i]))
, Здесь тау - шум при принятии решения с гамма-распределением: тао → 0, человек выбирает ответ с наибольшим значением; Тао → ∞, человек выбирает случайным образом среди 3 ответов.
Это мой файл модели model.txt
:
model{
# data
for(i in 1:n) # for each person
{
for (j in 1:m) # for each problem
{
# answer chosen
answer[i,j] ~ dcat(exp(V[j,]/tau[i])/sum(exp(V[j,]/tau[i])))
}
}
# priors
for (i in 1:n)
{
tau[i] ~ dgamma(0.001,0.001)
}
}
Вот мой R скрипт:
library(R2jags)
m <- 6 # number of problems
n <- 2 # number of people
V <- matrix(c(0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), nrow=m, ncol=3, byrow = T)
answer <- matrix(c(2,3,1,1,2,3,1,1,1,1,3,2), nrow=n, ncol=m, byrow = T)
data <- list("m", "n", "V", "answer")
myinits <- list(list(tau = rep(1,n)))
parameters <- c("tau")
samples <- jags(data, inits=myinits, parameters,
model.file ="model.txt", n.chains=1, n.iter=1000,
n.burnin=1, n.thin=1, DIC=T)
После запуска скрипта на R я получил сообщение об ошибке ниже:
Составление графа модели Устранение необъявленных переменных Выделение узлов Удаление модели
Ошибка в jags.model(model.file, data = data, inits = init.values, n.chains = n.chains,: RUNTIME ERROR: неверный векторный аргумент для exp
В чем может быть проблема? Большое спасибо за вашу помощь!
1 ответ
Вы предоставляете вектор столбца из V
в exp
, В JAGS функциям обратной ссылки могут быть заданы только скалярные значения. По сути, для правильного кодирования регрессии softmax вам нужно будет перебирать каждый элемент V
, Дополнительно, V
должен быть трехмерный вектор (человек х субъект х 3 варианта).
model{
# data
for(i in 1:n) # for each person
{
for (j in 1:m) # for each problem
{
# answer chosen
answer[i,j] ~ dcat(mu[i,j,1:3])
mu[i,j,1:3] <- exp_v[i,j,1:3] / sum(exp_v[i,j,1:3])
for (k in 1:3) {
exp_v[i,j,k] <- exp(V[i,j,k]/tau[i])
}
}
# priors
for (i in 1:n)
{
tau[i] ~ dgamma(0.001,0.001)
}
}
В отличие от вашей модели, V
индексируется в i,j,k
вместо того, что я бы предположил, чтобы быть j
а также k
, Вы должны будете реструктурировать свой V
массив для того, чтобы соответствовать этому. Однако подобрав модель таким образом, вы можете ввести скаляр в exp
, который вы можете затем суммировать впоследствии.