mcmcglmm循环创建多个链

时间:2015-07-28 10:34:52

标签: r loops mcmc

this question跟进(参见可重现的数据框)我想运行MCMCGLMM n 次,其中 n 是随机数。我试图构建一个运行所有链的循环,并保存它们(以便稍后检索随机变量的后验分布)但我遇到了问题。

这是数据框的样子(当 n = 5,因此R1-R5时),A =响应变量,L和V是随机效应变量,B是固定效应,R1 -R5是L的随机分配,维持V的结构:

  ID    L B V    A R1 R2 R3 R4 R5
1 1_1_1 1 1 1 11.1  6 19 21  1 31
2 1_1_1 1 1 1  6.9  6 19 21  1 31
3 1_1_4 1 1 4  7.7  2 24  8 22 22
4 1_1_4 1 1 4 10.5  2 24  8 22 22
5 1_1_5 1 1 5  8.5 11 27 14 17 22
6 1_1_7 1 1 7 11.2  5 24 13 18 25

我可以创建我想要分配给我的链的名称,以及随着MCMC链的每次运行而变化的变量名称(R1-R n ):

n = 5
Rs = as.vector(rep(NA,n))

for(i in 1:n){
 Rs[i] =     paste("R",i, sep = "")
 }
Rs

输出:

> Rs
[1] "R1" "R2" "R3" "R4" "R5"

然后我尝试了这个循环来产生5个链:

for(i in 1:n){
chains[i] =     MCMCglmm(A ~1 + B,
                random = as.formula(paste0("~" ,Rs[i], " + Vial")),
                rcov = ~units,
                nitt = 500,
                thin = 2,
                burnin = 50,
                prior = prior2,
                family = "gaussian",
                start = list(QUASI = FALSE),
                data = df)
}
  • 感谢Roland帮助让随机效果正常调用,之前我收到错误Error in buildZ(rmodel.terms[r] ... object Rs[i] not found - 由as.formula修复

但是这会将所有数据存储在chains中,而且看似只有$Sol个组件,但我需要能够访问VCV中的值,特别是的后验分布R 变量(例如summary(chainR1$VCV)

总结:似乎我在如何分配链名称时犯了错误,是否有人建议如何执行此操作,并保存后验分布甚至整个链?

2 个答案:

答案 0 :(得分:0)

好像你想在循环中运行许多不同的MCMCglmm公式。 @Roland帮助你找到了解决方案(尽管我个人会在循环之前创建公式)。 @Roland还指出,为了保存每个模型的结果,您应该将它们保存在列表中 - 而不是像您当前所做的那样保存链。您还可以将每个模型保存为.RData文件,如问题末尾所示。为了正式回答这个问题,我将通过以下方式执行此操作:

Rs = paste0("~R", 1:5, " + V") ## Create all model formulae
chainNames = paste0("chainR", 1:5) ## Names for each model 
chains = list() ## Initialize list
## Loop over models
for(i in 1:length(Rs)){
chains[[i]] =   MCMCglmm(A ~1 + B,
                random = formula(Rs[i]),
                rcov = ~units,
                nitt = 500,
                thin = 2,
                burnin = 50,
                prior = prior2,
                family = "gaussian",
                start = list(QUASI = FALSE),
                data = df)
}
names(chains) = chainNames ## Name each model
save(chains, "chainsR1-R5.Rdata") ## Save all model output 

附注,paste0与粘贴相同,但默认情况下使用参数sep=""

答案 1 :(得分:0)

使用assign是关键点:

n = 10 #Number of chains to run
chainVCVdf = matrix(rep(NA, times = ((nitt-burnin)/thin)*n), ncol = n)
colnames(chainVCVdf)=c(rep("X", times = n))

for(i in 1:n){
assign("chainX",paste0("chain",Rs[i]))
chainX =    MCMCglmm(A ~1 + B,
                random = as.formula(paste0("~" ,Rs[i], " + V")),
                rcov = ~units,
                nitt = nitt,
                thin = thin,
                burnin = burnin,
                prior = prior1,
                family = "gaussian",
                start = list(QUASI = FALSE),
                data = df)
assign("chainVCV",  chainX$VCV[,1]) 
chainVCVdf[,i]=(chainVCV)   
colnames(chainVCVdf)[i] = colnames(chainX$VCV)[1]
                }

然后可以构建我感兴趣的VCV组件矩阵(即R1-R n 列中的随机L分配)