我会建议下一种方法。首先,需要训练贝叶斯模型。所以你的步骤很好。考虑到您在系数上定义了极低的先验。因此,当您将初始值设置得太高时,可能会出现与链中收敛相关的问题。模型链很好。我只是稍微改进了初始值函数。这里是代码。为了完成 ANOVA,您必须处理您感兴趣的参数的所有结果。这意味着计算后验可信区间等。这样,您的主要输入将是来自链的参数。这里是获取你想要的参数的代码:
library(rjags)
set.seed(82)
#Model string
mod_string = " model {
for (i in 1:length(y)) {
y[i] ~ dnorm(mu[grp[i]], sig[grp[i]])
}
for (j in 1:3) {
mu[j] ~ dnorm(0.0, 1.0/1.0e6)
}
for (j in 1:3) {
sig[j] ~ dnorm(0.0, 1.0/1.0e6)
}
} "
#Data
data(PlantGrowth)
#Jags inputs
data_jags = list(y=PlantGrowth$weight,
grp=as.numeric(PlantGrowth$group))
params = c("mu", "sig")
#Initial values
inits = function() {
inits = list("mu"=runif(3,0,1), "sig"=runif(3,0,1))
}
#Train the model
#jags model
results.model <- jags.model(file=textConnection(mod_string),
data=data_jags, inits=inits(),
n.chains=3,quiet = T)
#Update
update(results.model, n.iter=10000,progress.bar = 'none')
#Sampling
results.model.1 <- coda.samples(results.model,
variable.names=params,n.iter=10000,
progress.bar = 'none')
#Extract a sample
d1 <- as.data.frame(do.call(rbind,results.model.1))
输出将存储在d1
. 这里有一些行:
head(d1)
mu[1] mu[2] mu[3] sig[1] sig[2] sig[3]
1 5.121681 4.725264 5.601421 3.625515 3.096606 9.499369
2 5.399050 4.746094 5.551337 1.260319 3.055592 7.548953
3 4.904069 4.816449 5.655899 1.414513 2.555520 4.303972
4 4.538518 4.730499 5.481598 1.297098 1.597760 5.643879
5 4.908547 4.339875 5.452959 3.710132 1.062263 5.865650
6 5.250289 4.845275 5.554499 2.238207 2.382826 6.492258
使用该值,您必须计算后验均值和后验可信区间,以便与 ANOVA 方法进行对比。