错误:尝试在线性回归中重新定义节点

问题描述

我已使用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]

有人可以帮我解决这个问题吗? 这是由于引入预测变量作为矩阵吗?

解决方法

有几种方法可以做到这一点,有两种:

  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],.01)
    sigma_tau1 = 1/tau1 
 }"

每次循环时,尽管参数索引for(j in 1:3){ mu1[i] = beta1[j]* x1[i,j] }覆盖了j,但您收到mu1[i]的错误。它也不会总结各个术语。您也许还可以先将mu1索引到j,然后再将sum索引,但未经测试……

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...