Error: Attempt to redefine node in linear regression
Error: Attempt to redefine node in linear regression
我使用 rjags
安装了以下 simple linear regression
Bayesian
模型。
我能够通过单独指定所有预测变量来 运行 模型(比如 lm
对象)。现在我想学习如何通过将预测变量作为矩阵引入而不是单独指定它们来指定预测变量。
所以我运行下面的代码,但是它给出了一些错误。
我使用 rrr
包中的 tobbaco
数据集来提供可重现的示例。
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
之后,我得到了以下错误。
Error in jags.model(textConnection(bayes_model_mul1), data = list(Y1.BurnRate = tobacco$Y1.BurnRate, :
RUNTIME ERROR:
Compilation error on line 6.
Attempt to redefine node 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], 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]
。它也没有总结各个条款。您也可以使用 j
索引 mu1
然后 sum
但未经测试 ...
我使用 rjags
安装了以下 simple linear regression
Bayesian
模型。
我能够通过单独指定所有预测变量来 运行 模型(比如 lm
对象)。现在我想学习如何通过将预测变量作为矩阵引入而不是单独指定它们来指定预测变量。
所以我运行下面的代码,但是它给出了一些错误。
我使用 rrr
包中的 tobbaco
数据集来提供可重现的示例。
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
之后,我得到了以下错误。
Error in jags.model(textConnection(bayes_model_mul1), data = list(Y1.BurnRate = tobacco$Y1.BurnRate, :
RUNTIME ERROR:
Compilation error on line 6.
Attempt to redefine node 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], 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]
。它也没有总结各个条款。您也可以使用 j
索引 mu1
然后 sum
但未经测试 ...