2

我已经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, :
RUNTIME ERROR:
Compilation error on line 6.
尝试重新定义节点 mu1[1]) 中的错误

谁能帮我解决这个问题?这是因为将预测变量作为矩阵引入吗?

4

1 回答 1

2

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

  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但未经测试...jsum

于 2020-08-17T21:36:41.797 回答