我有一个与R代码有关的问题,它叫BUGS。我已经在WinBUGS中运行了这个模型,它运行得很好,给了我预期的结果。下面是Y的单一结果或单变量数据时使用的自动化代码,现在我想将它用于多个结果。我尝试了另一种读取数据的方法。有两个测试模拟,从csv files.Not读取,确定在代码中指定的位置,这样相同的过程就可以重复两个结果,而不是一个。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.outputsim <- bug中(data= list(Y = as.matrix(Y),Nf = 5 ),:要替换的项数不是替换长度的倍数2:在bugs.outputsim <- bug中(data= list(Y = as.matrix(Y),Nf = 5 ):要替换的项数不是替换长度的倍数。
发布于 2013-10-04 09:10:52
当您从R中运行错误模型时,一种选择是在OpenBUGS或WinBUGS本身中模拟运行模型。它可以帮助您(在单击check model按钮后通过光标放置)找到有问题的行。
我是用你的虫子模型做的。我在BUGS模型中发现了mn、prec和R定义中的问题。您可以删除它们,因为它们已经在数据中定义了(这看起来是定义它们的合适位置)。一旦我把这些从你的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)))在那里,数据和init需要一些工作才能从您的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"))
}https://stackoverflow.com/questions/19068493
复制相似问题