2013-09-28 52 views
2

我有一個與R代碼有關的問題,它調用了BUGS。我已經在WinBUGS中運行該模型,它運行良好,給我預期的結果。以下是當我有單個結果或Y的單變量數據時使用的自動化代碼。現在我想用它來獲得多個結果。我嘗試了一種閱讀數據的不同方式。有2個模擬測試,從csv文件中讀取。不確定在代碼中指定的位置,以便可以爲2個結果而不是1個結果重複相同的過程。 setwd( 「C://蒂娜/ USB_Backup_042213 /測試/ CSV」)R的WinBUGS自動化問題

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] < - 錯誤(數據=列表(Y = as.matrix (Y),Nf = 5,: 要替換的項目數不是替換長度的倍數 2:在bugs.output [sim] < - bugs(data = list(Y = as.matrix(Y),Nf = 5,:: 要替換的項目數不是替換長度的倍數

+0

它沒有正式禁止,但請考慮交叉張貼到SO和R-幫助HTTP ://article.gmane.org/gmane.comp.lang.r.general/300245 ...它浪費精力。 –

+2

我們可以看到BUGS模型嗎?我想它需要設置來處理多元數據(這很可能是你的問題所在)。 – gjabel

+0

@ Ben Bolker,下次再考慮。我不確定listservs和stackexchange是否具有相同的觀衆。 – user1560215

回答

3

當您從R運行BUGS模型時出現錯誤時,一個選項是嘗試在OpenBUGS或WinBUGS中模擬模型運行模型本身。它可以幫助你(在點擊檢查模型按鈕後通過光標放置)找到有問題的線。

我用你的BUGS模型做了這個。我在BUGS模型中發現了mn,precR的定義中的問題。您可以放棄這些數據,因爲它們已經在數據中定義(這看起來像是定義它們的適當位置)。一旦我從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)你可能有一些不必要的大括號。

要通過R您可以用下述R語法運行BUGS代碼...

#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,謝謝你的迴應。就像我剛纔提到的那樣,該模型甚至可以更早地運行BUGS。當我粘貼代碼時,此窗口中出現錯誤。我沒有在數據中列出mn,prec和R代碼。問題在於R如何讀取數據文件。我已經爲R編輯了我的代碼,如果我使用你的模型代碼,我仍然得到陷阱錯誤。我在R代碼中尋找一些指導,因爲我不太熟悉R調用WinBUGS。 – user1560215

+0

@ user1560215用R代碼更新了答案。這有幫助嗎? – gjabel

+0

它運行良好,1個數據集,我只是測試它。但是我怎麼能自動化這1000個數據。第一部分是我如何閱讀1000個模擬數據集?感謝所有的幫助。 – user1560215