【问题标题】:Automation of WinBUGS from R来自 R 的 WinBUGS 自动化
【发布时间】:2013-09-28 15:23:04
【问题描述】:

我有一个与调用 BUGS 的 R 代码相关的问题。我已经在 WinBUGS 中运行了模型,它运行良好,给了我预期的结果。下面是当我有 Y 的单一结果或单变量数据时使用的自动化代码。现在我想将它用于多种结果。我尝试了另一种读取数据的方式。有 2 个从 csv 文件中读取的用于测试的模拟。不确定在代码中的何处指定,以便可以针对 2 个结果而不是一个结果重复相同的过程。 setwd("C://Tina/USB_Backup_042213/Testing/CSV")

  matrix=NULL
  csvs <- paste("MVN", 1:2, ".csv", sep="")
 for(i in 1:length(csvs)){
 matrix[[i]] <- read.csv(file=csvs[i], header=T)
 print(matrix[[i]])
  }
   Y1 Y2
 1 11  6
 2  8  5
 3 25 13
 4  1 13
 5  8 22
   Y1 Y2
 1  9  1
 2  7  9
 3 25 13
 4  1 18
 5  9 12
library("R2WinBUGS")

bugs.output <- list()
for(sim in 1:2){
    Y <-(matrix[[sim]])
    bugs.output[sim] <- bugs(
    data=list(Y=as.matrix(Y), Nf=5, n=60, mn=c(-1.59, -2.44), prec=matrix(c(.0001,0,0,.0001),nrow=2,ncol=2), R=matrix(c(.001,0,0,.001),nrow=2,ncol=2)), 
   inits=list(list(gamma=c(0,0), T=matrix(c(0.9,0,0,0.9),nrow=2,ncol=2))),
    model.file="M-LN_model_trial.txt",
    parameters.to.save = c("p","rho","sigma2"),
  n.chains=1, n.iter=12000, n.burnin=5000, debug=TRUE,
  bugs.directory="C://Tina/USB_Backup_042213/winbugs14/WinBUGS14",
  working.directory=NULL)
   }

警告信息: 1: 在 bugs.output[sim]

【问题讨论】:

  • 这不是官方禁止的,但请重新考虑交叉发布到 SO 和 r-help article.gmane.org/gmane.comp.lang.r.general/300245 ...这会浪费精力。
  • 我们能看到BUGS模型吗?我想需要设置它来处理多变量数据(这很可能是您的问题所在)。
  • @Ben Bolker,下次会重新考虑。我不确定 listservs 和 stackexchange 是否有相同的受众。
  • 不是很相关,但是……你的代码真的是这样缩进的吗?

标签: r winbugs winbugs14


【解决方案1】:

当您从 R 运行 BUGS 模型时出错,一种选择是尝试在 OpenBUGS 或 WinBUGS 本身中模拟运行模型。它可以帮助您(通过点击检查模型按钮后的光标位置)定位有问题的行。

我用你的 BUGS 模型做了这个。我发现BUGS模型中mnprecR的定义存在问题。您可以删除它们,因为它们已经在数据中定义(看起来像是定义它们的适当位置)。一旦我从你的 BUGS 模型中删除了这些,一切都运行良好。

注意,要在 OpenBUGS 中运行模型,您必须编辑数据格式,例如我运行的脚本是:

model{
#likelihood
for(j in 1 : Nf){
    p1[j, 1:2 ] ~ dmnorm(gamma[1:2], T[1:2 ,1:2])  
    for (i in 1:2){
        logit(p[j,i]) <- p1[j,i]
        Y[j,i] ~ dbin(p[j,i],n) 
    }
}   

#priors
gamma[1:2] ~ dmnorm(mn[1:2],prec[1:2 ,1:2])
expit[1] <- exp(gamma[1])/(1+exp(gamma[1]))
expit[2] <- exp(gamma[2])/(1+exp(gamma[2]))
T[1:2 ,1:2] ~ dwish(R[1:2 ,1:2], 2)
sigma2[1:2, 1:2]  <- inverse(T[,])
rho  <-  sigma2[1,2]/sqrt(sigma2[1,1]*sigma2[2,2])
}

#data
list(Y=structure(.Data=c(1,11,6,1,8,5,1,25,13,1,1,13,1,8,22),.Dim=c(5,3)),
Nf=5, n=60, mn=c(-1.59,-2.44),
prec=structure(.Data=c(0.0001,0,0,0.0001),.Dim=c(2,2)),
R=structure(.Data=c(0.001,0,0,0.001),.Dim=c(2,2)))

#inits
list(gamma=c(0,0), T=structure(.Data=c(0.9,0,0,0.9),.Dim=c(2,2)))

数据和初始化需要一些工作才能从您的 R 脚本转换。

其他几点:1) 我不确定 Y 的格式是否正确,因为它有 3 列,您的分布只考虑前两个(X 和 Y1)。 2)您可能有一组不必要的大括号。

要通过 R 在 BUGS 中运行代码,您可以使用以下 R 语法...

#BUGS code as a character string
bugs1<-
"model{
  #likelihood
  for(j in 1 : Nf){
    p1[j, 1:2 ] ~ dmnorm(gamma[1:2], T[1:2 ,1:2])  
    for (i in 1:2){
      logit(p[j,i]) <- p1[j,i]
      Y[j,i] ~ dbin(p[j,i],n) 
    }
  }   

  #priors
  gamma[1:2] ~ dmnorm(mn[1:2],prec[1:2 ,1:2])
  expit[1] <- exp(gamma[1])/(1+exp(gamma[1]))
  expit[2] <- exp(gamma[2])/(1+exp(gamma[2]))
  T[1:2 ,1:2] ~ dwish(R[1:2 ,1:2], 2)
  sigma2[1:2, 1:2]  <- inverse(T[,])
  rho  <-  sigma2[1,2]/sqrt(sigma2[1,1]*sigma2[2,2])
}"
#write the BUGS code to a txt file in current working directory
writeLines(bugs1, "bugs1.txt")
#create data
Y<-data.frame(X=1,Y1=c(11,8,25,1,8),Y2=c(6,5,13,13,22))

#run BUGS from R
library("R2OpenBUGS")
mcmc1 <- bugs(data = list(Y=as.matrix(Y), Nf=5, n=60, mn=c(-1.59, -2.44), 
                          prec=matrix(c(.0001,0,0,.0001),nrow=2,ncol=2),
                          R=matrix(c(.001,0,0,.001),nrow=2,ncol=2)),
              inits = list(list(gamma=c(0,0), T=matrix(c(0.9,0,0,0.9),nrow=2,ncol=2))),
              param = c("gamma", "sigma2"), 
              model = "bugs1.txt", 
              n.iter = 11000, n.burnin = 1000, n.chains = 1)

这里有几点需要注意。 1) 这使用 OpenBUGS 而不是 WinBUGS。 2) 如果您使用 R2WinBUGS,如果您没有以管理员身份运行 R(或 Rstudio,或任何您正在使用的东西),您可能会遇到陷阱。

要将上面的代码运行 1000 次,您可以将它放在一个循环中,例如......

#create and write the BUGS code to a txt file in current working directory (outside the loop)
bugs1<-...

#loop
for(i in 1:1000){
    Y <- read.csv(file=paste0("MVN",i,".csv"))
    #run BUGS from R
    library("R2OpenBUGS")
    mcmc1 <- bugs(data = list(Y=as.matrix(Y), Nf=5, n=60, mn=c(-1.59, -2.44), 
                              prec=matrix(c(.0001,0,0,.0001),nrow=2,ncol=2),
                              R=matrix(c(.001,0,0,.001),nrow=2,ncol=2)),
                  inits = list(list(gamma=c(0,0), T=matrix(c(0.9,0,0,0.9),nrow=2,ncol=2))),
                  param = c("gamma", "sigma2"), 
                  model = "bugs1.txt", 
                  n.iter = 11000, n.burnin = 1000, n.chains = 1)
    #save mcmc
    write.csv(mcmc1$sims.matrix,paste0("mcmc",i,".csv"))
}

【讨论】:

  • @gjable,谢谢您的回复。正如我所提到的,该模型甚至更早地在 BUGS 上运行良好。粘贴代码时,此窗口出现错误。我没有在代码中提到 mn、prec 和 R,因为它们列在 data 下。问题在于 R 如何读取数据文件。我已经为 R 编辑了上面的代码,如果我使用你的模型代码,我仍然会收到陷阱错误。我正在寻找 R 代码中的一些指导,因为我对 R 调用 WinBUGS 不太熟悉。
  • 使用 1 个数据集运行良好,我刚刚对其进行了测试。但是我怎样才能为 1000 个数据集自动执行此操作。第一部分是我如何读取 1000 个模拟数据集?感谢所有帮助。
  • @user1560215 用 R 代码更新了答案。我认为您有某种明智的命名模拟数据集,例如 MVN1.csv、MVN2.csv、...、MVN1000.csv
  • 我确实有名为 MVN1.csv、MVN2.csv 的数据集......其中第一列表示模拟编号,第二列和第三列是 Y1 和 Y2 的数据。在上面的代码中,不是保存 mcmc1,而是如何为 mcmc1 下标,以便我可以通过键入 mcmc1[1] 来检索每次运行的输出,依此类推。现在,如果我只执行 mcmc1,我会得到第二次运行的输出。谢谢
  • @user1560215 这是个坏主意。如果您查看str(mcmc1) 的结构,您会发现它有很多组件,因此保留其中的 1000 个组件会淹没您的记忆。如果您真的想这样做,尽管您需要设置一个空列表,然后将其填充到循环中.... stackoverflow.com/questions/18534526/…
猜你喜欢
  • 2018-04-04
  • 2013-06-25
  • 1970-01-01
  • 2011-03-17
  • 2015-04-30
  • 2019-01-21
  • 2018-09-02
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多