我使用嵌套循環在R中執行MCMCglmm的多次運行,將後驗分佈輸出到數據框中。外部循環執行MCMC過程,生成後驗分佈,然後內部循環將其中的每一個提升爲單獨的數據框(其中F是鏈的每個運行的固定效果中的後驗分佈的數量,並且n是要執行的隨機數);因此,將會有F(在這種情況下,4個)數據幀,每個數據幀具有n列。將數據添加到R中的變量數據幀的變量列for循環
for(i in 1:n){
# Randomise
MortR = data.frame(Year, Mortalities)
MortR[,2] = sample(MortR[,2], replace = F)
DF1 = merge(DF1, MortR, by = "Year")
DF1$Mort_R = DF1[,9]
DF1[,9] = NULL
prior1 = list(G = list( G1 = list(V = 1, nu = 1, alpha.mu = 0, alpha.V = 1000)
),
R = list(V = 1, nu = 0.002))
# Chain
assign("chainX",paste0("chain",i))
chainX = MCMCglmm(Life ~ Sex*Mort_R - 1,
random = ~Pop:Year,
rcov = ~units,
nitt = nitt,
burnin = burn,
thin = thin,
prior = prior1,
pr = T,
family = "gaussian",
start = list(QUASI = FALSE),
data = DF1)
for(j in 1:F){
assign(paste0("chainSol",j), chainX$Sol[,j])
A = as.vector(get(paste0("chainSol",j)))
assign(paste0("F",j), A)
# Aim: get vector F*j* (or A) in to column *i* of dataframe chainSolDF_*j*
# ie.: chainSolDF_*j*[,*i*] = F*j*
#chainSolDF_1[,i] = as.vector(get(paste0("chainSol",j))) # Puts it in the columns of DF_1
#assign(paste0("chainSolDF_",j)[,i], A) # Incorrect number of dimensions
#assign(paste0("chainSolDF_",j)[,i], paste0("F",j)) # Error in paste0("chainSolDF_", j)[, i] : incorrect number of dimensions
#assign(paste0("chainSolDF_",j,"[,",i,"]"), paste0("F",j)) # Does not assign to the data frame
#paste0("chainSolDF_",j,"[,",i,"]") = get(paste0("F",j)) # Invalid first argument
}
#B = matrix(c(F1,F2,F3,F4), ncol = 4)
print(paste0("Randomisation ",i, " Complete"))
}
你可以看到一些(這僅僅是一個「亮點」)的我試過的東西(#),與他們產生錯誤的描述 - 一切都是徒勞!一般來說,我一直在尋找get()
,assign()
和$<-
的解決方案。花了三天的時間試圖自己解決這個問題,我轉向了這個社區。
如何一個分配一個矢量到特定柱和特定數據幀,這兩者的內部嵌套循環內同時指定?
「目的:通過使用相同的兩個獲得矢量
Fj
(或A)中i
列數據幀的chainSolDF_j
你是從'sapply' /'設計lapply'迴避了嗎?由於沒有並行性發生,這將是非常合適的。 –
在編寫適當的R代碼時,很少使用'get()'或'assign()'。在指定列表中收集結果要好得多。這個例子太複雜了,不能提供完整的我們寫。簡化它會更好(特別是,它似乎與'MCMCglmm'沒有任何關係)。編輯你的問題來隔離和簡化你真正想要解決的問題。此外,該示例應該是[樣本輸入數據]的[reproducible](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以便我們也可以運行它。 – MrFlick
@romanlustrik沒有理由,還沒有到轉換自己呢(需要真正花時間),我所做的大部分循環沒有足夠的計算強度,以使任何時間差異明智.. – Ell