您的模型估计将是一个有用的先验。
我在LeBauer et al 2013中应用了以下方法,并从下面的priors_demo.Rmd中改编了代码。
要使用模拟参数化此先验,请考虑您的模型
logLC50=b0X+b1
假设和;是已知的(一个固定的参数;例如,物理常数通常相对于其他参数非常精确地已知)。b0∼N(0.94,0.03)b1∼N(1.33,0.1)Lkow
此外,还有一些模型不确定性,我会做这个,但应该是您信息的准确表示,例如模型的 RMSE 可用于告知标准的规模偏差。我故意将其作为“信息”之前。ϵ∼N(0,1)
b0 <- rnorm(1000, -0.94, 0.03)
b1 <- rnorm(1000, -1.33, 0.1)
e <- rnorm(1000, 0, 1)
lkow <- 3.8
theprior <- b0 * lkow + b1 + e
现在想象theprior
是你的先前和
thedata <- log10(epa/ (mw * 1000000))
是你的数据:
library(ggplot2)
ggplot() + geom_density(aes(theprior)) + theme_bw() + geom_rug(aes(thedata))
使用先验的最简单方法是参数化 JAGS 将识别的分布。
这可以通过多种方式完成。由于数据不必是正常的,您可以考虑使用 package 查找分布fitdistrplus
。为简单起见,让我们假设您的先验是N(mean(theprior), sd(theprior))
或大约。如果您想扩大方差(以使数据更具强度),您可以使用N(−4.9,1.04)N(−4.9,2)
然后我们可以使用 JAGS 拟合模型
writeLines(con = "mymodel.bug",
text = "
model{
for(k in 1:length(Y)) {
Y[k] ~ dnorm(mu, tau)
}
# informative prior on mu
mu ~ dnorm(-4.9, 0.25) # precision tau = 1/variance
# weak prior
tau ~ dgamma(0.01, 0.01)
sd <- 1 / sqrt(tau)
}")
require(rjags)
j.model <- jags.model(file = "mymodel.bug",
data = data.frame(Y = thedata),
n.adapt = 500,
n.chains = 4)
mcmc.object <- coda.samples(model = j.model, variable.names = c('mu', 'tau'),
n.iter = 10000)
library(ggmcmc)
## look at diagnostics
ggmcmc(ggs(mcmc.object), file = NULL)
## good convergence, but can start half-way through the simulation
mcmc.o <- window(mcmc.object, start = 10000/2)
summary(mcmc.o)
最后,一个情节:
ggplot() + theme_bw() + xlab("mu") +
geom_density(aes(theprior), color = "grey") +
geom_rug(aes(thedata)) +
geom_density(aes(unlist(mcmc.o[,"mu"])), color = "pink") +
geom_density(aes(unlist(mcmc.o[,"pred"])), color = "red")
并且您可以考虑mu=5.08
是您对平均参数值(粉红色)sd = 0.8
及其标准差的估计;logLC_50(您从中获取样本的位置)的后验预测估计为红色。
参考
LeBauer、DS、D. Wang、K. Richter、C. Davidson 和 MC Dietze。(2013)。促进现场测量和生态系统模型之间的反馈。生态专着八十三:133—154。doi:10.1890/12-0137.1