问题描述
我已使用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]
有人可以帮我解决这个问题吗? 这是由于引入预测变量作为矩阵吗?
解决方法
有几种方法可以做到这一点,有两种:
- 在似然环之外使用矩阵乘法
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],.01)
sigma_tau1 = 1/tau1
}"
每次循环时,尽管参数索引for(j in 1:3){ mu1[i] = beta1[j]* x1[i,j] }
覆盖了j
,但您收到mu1[i]
的错误。它也不会总结各个术语。您也许还可以先将mu1
索引到j
,然后再将sum
索引,但未经测试……