Ошибка: попытка переопределить узел в линейной регрессии

Я установил следующую модель 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 = табак $ Y1.BurnRate,:
ОШИБКА РАБОТЫ:
Ошибка компиляции в строке 6.
Попытка переопределить узел mu1 [1]

Может ли кто-нибудь помочь мне разобраться в этом? Связано ли это с введением предикторов в виде матрицы?


person student_R123    schedule 17.08.2020    source источник


Ответы (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 
 }"
  1. Используйте 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, но не проверено ...

person user20650    schedule 17.08.2020
comment
Привет, Спасибо за ответ. У меня есть еще один вопрос, и было бы здорово, если вы также можете прокомментировать его. После получения образцов MCMC из приведенного выше кода я получаю следующее предупреждающее сообщение Предупреждение: это предупреждение получено ранее также для разных байесовских моделей. Так что мне любопытно об этом. Сможете ли вы прокомментировать и это? - person student_R123; 18.08.2020
comment
Привет, @ student_R123; какое предупреждающее сообщение, пожалуйста? И какой код его генерирует? - person user20650; 18.08.2020
comment
Привет, еще раз спасибо. Предупреждающее сообщение было Предупреждение: В FUN (X [[i]], ...): начальное значение не изменено. Однако сейчас я этого не понимаю. Раньше я получал это, когда извлекал образцы MCMC (model3 ‹- jags.model (textConnection (bayes_model_mul1), data = list (Y1.BurnRate = табак $ Y1.BurnRate, x1 = x1, N1 = N1), n.chains = 1) ) params ‹- c ('beta1', 'sigma_tau1') samps.1‹ - coda.samples (model3, params, n.iter = 10000) burn.in = 1000 summary.model.1 = summary (window (samps. 1, start = burn.in))). Но раньше я получал эту ошибку пару раз для разных моделей. - person student_R123; 18.08.2020
comment
Спасибо. Это из функции window. Если вы перезапустите coda.samples, не запустив снова jags.model, вы можете получить это предупреждение / иногда сообщение об ошибке. Т.е. особо не заглядывал и просто перезапускаю jags.model - person user20650; 18.08.2020
comment
... если вы посмотрите на str(samps.1), вы увидите атрибут attr(samps.1[[1]], "mcpar"), который увеличивается каждый раз, когда вы запускаете coda.samples без повторного запуска jags.model. Это выбрасывает start и end раз для функции window, я не уверен, почему это значение увеличивается ... это могло быть обновление модели и начало с конца предыдущего запуска ?? - person user20650; 18.08.2020
comment
Спасибо за комментарий. Честно говоря, я понятия не имею об этом. Я изучаю байесовский с нуля. - person student_R123; 18.08.2020