r - 带有 R 的 JAGS:模拟数据并一次拟合多个模型
问题描述
我有三个非常相似的模型,我想通过 LOO 和 WAIC 比较哪个模型具有更高的预测准确性。我想多次模拟数据并取它们的对数似然的平均值。手动执行此操作将花费很长时间,因为我需要为每个模拟执行以下步骤: 1. 通过一个模型模拟数据;2. 保存第一个模型的数据和可能性;3.将数据拟合到第二个模型并保存第二个模型的可能性;3. 将数据拟合到第三个模型并保存对数似然。然后运行第二个模拟并重复所有四个步骤。
有什么方法可以同时模拟数据,例如多次模拟数据,每次都将数据拟合到所有三个模型并保存它们的对数似然?或者,至少,对于每个模拟,将数据拟合到所有三个模型一次?(比如将 1 个数据块和 2 个模型块放在一个 txt 文件中?)
以下是我的三个模型中的两个(两个模型共享相同的数据列表)。
loglik
是计算对数似然。
注意:我使用 R2jags
模型1:例如,使用这个模型来模拟数据
# simulated data
data{
for (i in 1:Nsubjects)
{
for (m in 1:Ntrials)
{
expectancy [i,m] ~ dnorm (b_true [i] * v_true[i,m] + (10 - b_true [i]),tau_true[i]) T(0,10)
}
for (j in 2: Ntrials)
{
v_true [i,j] <- v_true [i,j-1] + alpha_true [i] * pe_true [i,j-1]
pe_true [i,j-1] <- shock [i,j-1] - v_true[i,j-1]
}
sigma_true [i] ~ dunif (0,1)
tau_true [i] <- 1/pow(sigma_true [i],2)
alpha_true [i] ~ dbeta(1,1)
b_true [i] ~ dunif (0,10)
}
}
# model
model{
# data
for (i in 1:Nsubjects)
{
for (m in 1:Ntrials)
{
expectancy [i,m] ~ dnorm (b [i] * v[i,m] + (10 - b[i]),tau[i])
predk [i,m] ~ dnorm (b [i] * v[i,m] + (10 - b[i]),tau[i])
# log-likelihood
loglik[i,m] <- logdensity.norm(expectancy [i,m], b [i] * v[i,m] + (10 - b[i]),tau[i])
}
for (j in 2:Ntrials)
{
v [i,j] <- v [i,j-1] + alpha [i] * pe [i,j-1]
pe [i,j-1] <- shock [i,j-1] - v [i,j-1]
# priors
}
sigma[i] ~ dunif (0,5)
tau [i] <- 1/pow(sigma [i],2)
b [i] ~ dnorm (b_mu,b_tau) T(0,10)
alpha [i] ~ dnorm (alpha_mu,alpha_tau) T(0,1)
}
# hyperpriors
alpha_mu ~ dbeta (1,1)
alpha_tau ~ dscaled.gamma (2,1)
alpha_sd <- 1/sqrt (alpha_tau)
b_mu ~ dunif (0,10)
b_tau ~ dscaled.gamma (2,1)
b_sd <- 1/sqrt (b_tau)
}
模型 2
model{
for (i in 1:Nsubjects)
{
for (m in 1:Ntrials)
{
expectancy [i,m] ~ dnorm (b [i] * v [i,m] + (10 - b [i]),tau[i])
# posteiror predictive
predk [i,m] ~ dnorm (b [i] * v [i,m] + (10 - b [i]),tau[i])
# log-likelihood
loglik[i,m] <- logdensity.norm (expectancy [i,m],b [i] * v [i,m] + (10 - b [i]),tau[i])
}
for (j in 2:Ntrials)
{
v [i,j] <- v [i,j-1] + alpha [i,j-1] * pe [i,j-1]
alpha [i,j] <- gamma [i] * abs (pe [i,j-1]) + (1-gamma [i]) * alpha [i,j-1]
pe [i,j-1] <- shock [i,j-1] - v [i,j-1]
}
# priors
sigma[i] ~ dunif (0,5)
tau [i] <- 1/pow(sigma [i],2)
b [i] ~ dnorm (b_mu,b_tau) T(0,10)
gamma [i] ~ dnorm (gamma_mu,gamma_tau) T(0,1)
alpha [i,1] ~ dnorm (alpha_mu,alpha_tau) T(0,1)
}
# hyperpriors
alpha_mu ~ dbeta (1,1)
alpha_tau ~ dscaled.gamma (2,1)
alpha_sd <- 1/sqrt (alpha_tau)
b_mu ~ dunif (0,10)
b_tau ~ dscaled.gamma (2,1)
b_sd <- 1/sqrt (b_tau)
gamma_mu ~ dbeta(1,1)
gamma_tau ~ dscaled.gamma (2,1)
gamma_sd <- 1/sqrt (gamma_tau)
}
解决方案
推荐阅读
- angular - 如何创建新部分,单击angular2中的新按钮
- python - 如何使用 python、cx_oracle 将查询的结果集作为字典获取?
- vba - VBA - 如何将不同的范围复制到新的工作表
- sonarqube - Sonarqube 数据迁移
- java - 用 \n 替换换行符,用 \t 替换制表符
- python - 在循环中连续调用函数并打印不同的结果
- http - 不完全 HTTPS webapp 上的服务工作者
- mql5 - 无法通过指标 MQL5 返回值
- java - 将接口和对象中的设置器放入数组
- javascript - 根据angularjs中的键和最新的时间戳键过滤json