2013-09-28 6 views
2

У меня есть вопрос, связанный с R-кодом, который вызывает ОШИБКИ. Я запустил модель в WinBUGS, и она отлично работает, давая мне ожидаемые результаты. Ниже приведен код автоматизации, используемый, когда у меня был единственный результат или одномерные данные для Y. Теперь я хочу использовать его для нескольких результатов. Я попробовал другой способ чтения данных. Есть 2 моделирования для тестирования, которые считываются из файлов csv. Не уверен, где указывать в коде, чтобы один и тот же процесс можно было повторить для двух результатов вместо одного. setwd ("C: // Tina/USB_Backup_042213/Тестирование/CSV")Автоматизация WinBUGS от R

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 [сим] < - ошибки (данные = список (Y = as.matrix (Y), Nf = 5,: Количество элементов для замены не кратно замещающей длины 2: В bugs.output [sim] < - ошибки (данные = список (Y = as.matrix (Y), Nf = 5,: Количество элементов, подлежащих замене, не кратно замещающей длины

+0

это официально не запрещено, но, пожалуйста, пересмотреть кросс-постинг на SO и г-помощь HTTP : //article.gmane.org/gmane.comp.lang.r.general/300245 ... он тратит силы. –

+2

Можем ли мы увидеть модель BUGS? Я предполагаю, что его нужно будет настроить для обработки многомерных данных (и это наиболее вероятно, где ваша проблема). – gjabel

+0

@ Бен Болкер, передумает в следующий раз. Я не был уверен, что в listservs и stackexchange есть одна и та же аудитория. – user1560215

ответ

3

Когда вы получаете ошибку при запуске вашей модели BUGS из R, одним из вариантов является попытка макетного запуска модели в OpenBUGS или WinBUGS сам. Он может помочь вам (через размещение курсора после нажатия кнопки модели проверки), чтобы найти проблемные линии.

Я сделал это с вашей моделью BUGS. Я нашел проблемы в определении mn, prec и R в модели BUGS. Вы можете отказаться от них, поскольку они уже определены в данных (что, похоже, подходит для их определения). Как только я сбросил их с вашей модели 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))) 

, где данные и inits нужно немного работы, чтобы преобразовать из вашего R.

Несколько других моментов: 1) Я не уверен, что у вас есть правильный формат для Y, так как он имеет 3 столбца, в вашем распределении учитываются только первые два (X и Y1). 2) Вероятно, у вас был ненужный набор фигурных скобок.

Для запуска кода в BUGS с помощью R вы можете использовать следующий синтаксис 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")) 
} 
+0

@ gjable, спасибо за ваш ответ. Модель сработала с ошибками еще раньше, как я уже упоминал. В этом окне произошла ошибка при вставке кода. Я не упомянул mn, prec и R в коде, поскольку они были перечислены в данных. Проблема заключается в том, как R считывает файл данных.Я редактировал мой код выше для R, и если я использую ваш код модели, я все равно получаю ошибку ловушки. Я ищу некоторые рекомендации в коде R, поскольку я не очень хорошо знаком с R, вызывающим WinBUGS. – user1560215

+0

@ user1560215 обновленный ответ с кодом R. это помогло? – gjabel

+0

Он работает отлично с 1 набором данных, я только что протестировал его. Но как я могу автоматизировать это для 1000 данных. Первая часть заключается в том, как я могу читать в 1000 симулированных наборах данных? Спасибо за помощь. – user1560215

Смежные вопросы