#r #linear-regression #bayesian #rjags
#r #линейная регрессия #байесовский #rjags
Вопрос:
Я установил следующую simple linear regression
Bayesian
модель, используя rjags
. Я смог запустить модель, указав все предикторы отдельно (например, для lm
объекта). Теперь я хочу узнать, как указать предсказатели, введя их в виде матрицы вместо того, чтобы указывать их по отдельности.
Итак, я запустил следующий код, но он выдал несколько ошибок.
Я использовал tobbaco
набор данных в rrr
пакете, чтобы предоставить воспроизводимый пример.
library(rrr)
require(dplyr)
library(rjags)
tobacco <- as_data_frame(tobacco)
N1 = length(tobacco$Y1.BurnRate)
x1 = model.matrix(Y1.BurnRate~X2.PercentChlorine X3.PercentPotassium ,data = tobacco)
bayes_model_mul1=
"model {
for(i in 1:N1){
Y1.BurnRate[i]~dnorm(mu1[i],tau1)
for(j in 1:3){
mu1[i]=beta1[j]*x1[i,j]
}
}
for (l in 1:3) { beta1[l] ~dnorm(0, 0.001) }
tau1 ~ dgamma(.01,.01)
sigma_tau1 = 1/tau1
}"
model3 <- jags.model(textConnection(bayes_model_mul1),
data = list(Y1.BurnRate=tobacco$Y1.BurnRate, x1=x1, N1=N1),
n.chains=1)
После запуска model3
я получил следующую ошибку.
Ошибка в jags.model(textConnection(bayes_model_mul1), data = list(Y1.BurnRate = tobacco $Y1.BurnRate, :
ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ:
ошибка компиляции в строке 6.
Попытка переопределить узел mu1[1]
Кто-нибудь может помочь мне разобраться в этом? Связано ли это с введением предикторов в виде матрицы?
Ответ №1:
Есть несколько способов сделать это, вот два:
- Используйте умножение матрицы вне цикла правдоподобия
m1 =
"model {
mu1 = x1 %*% beta1 # ---> this
for(i in 1:N1){
Y1.BurnRate[i] ~ dnorm(mu1[i], tau1)
}
for (l in 1:3) { beta1[l] ~ dnorm(0, 0.001) }
tau1 ~ dgamma(.01,.01)
sigma_tau1 = 1/tau1
}"
- Используйте
inprod
для умножения параметров на матрицу проектирования
m2 =
"model {
for(i in 1:N1){
mu1[i] = inprod(beta1, x1[i,]) #----> this
Y1.BurnRate[i] ~ dnorm(mu1[i], tau1)
}
for (l in 1:3) { beta1[l] ~ dnorm(0, 0.001) }
tau1 ~ dgamma(.01,.01)
sigma_tau1 = 1/tau1
}"
Вы получали ошибку с for(j in 1:3){ mu1[i] = beta1[j]* x1[i,j] }
тем, что каждый раз, когда вы выполняете цикл, хотя индекс параметра j
вы перезаписываете mu1[i]
. Это также не суммирует отдельные термины. Возможно, вы также сможете индексировать mu1
с помощью j
, а затем sum
но не протестированы…
Комментарии:
1. Привет, спасибо за ваш ответ. У меня есть еще один вопрос, и было бы здорово, если бы вы могли прокомментировать и это тоже. После получения образцов MCMC из приведенного выше кода я получаю следующее предупреждающее сообщение «Предупреждающее сообщение: получил это предупреждение ранее также для разных байесовских моделей. Итак, мне любопытно об этом. Сможете ли вы прокомментировать и это тоже?
2. Привет @student_R123; что это за предупреждающее сообщение, пожалуйста? И какой код его генерирует?
3. Спасибо. Это из
window
функции. При повторном запуске,coda.samples
не запустивjags.model
снова, вы можете получить это предупреждение / иногда ошибку. Ie никогда особо не изучал это и просто перезапускалjags.model
4. … если вы посмотрите на
str(samps.1)
, вы увидите атрибутattr(samps.1[[1]], "mcpar")
, который увеличивается при каждом запускеcoda.samples
без повторного запускаjags.model
. Это выбрасывает времяstart
иend
дляwindow
функции, я не уверен, почему это значение увеличивается … это может быть обновление модели и запуск с конца предыдущего запуска??5. Спасибо за комментарий. Честно говоря, я не имею ни малейшего представления об этом. Я изучаю байесовский язык с нуля.