2013-02-02 106 views
2

我有列表中給定矩陣的列之間的所有可能的組合。我想計算每個組合的cov並最終計算每個協方差矩陣的行列式。do.call cbind和sapply在R

的問題是,我需要計算行列式之前計算平方矩陣,我試圖用do.call與cbind和sapply都在一起,但不工作:

matrices.sq=do.call("cbind",lapply(list.of.matrices,get)) 

的代碼如下:

myarray=matrix(rexp(200),50,5) 
list.of.matrices <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(myarray))), 
           1, function(j)myarray[, j, drop = FALSE]) 
list.of.cov.matrices=sapply(list.of.matrices, cov) 
list.of.cov.matrices.2=list.of.cov.matrices[-(1:ncol(myarray))] #so get those with more than one column 
list.of.det<- sapply(list.of.cov.matrices.2, det) 
+0

不應該是'sapply(list.of.cov.matrices.2,det)'? – plannapus

+0

@plannapus謝謝,但不幸的是一個列表不是一個平方矩陣我認爲這是問題。 – nopeva

+0

當我使用你的代碼,但用'list.of.det <-sapply(list.of.cov.matrices.2,det)'替換最後一行時,它可以工作。 'list.of.matrices'不是由平方矩陣組成,而是'list.of.cov.matrices.2'。 – plannapus

回答

1

我不認爲你需要存儲所有這些矩陣。首先,計算你的協方差矩陣,然後用同樣的apply叫你必須創建子矩陣,但它不是用來存放他們只計算其決定因素:

cov.mat <- cov(myarray) 
# is a 5-by-5 matrix 

dets <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))), 
       1, function(j) det(cov.mat[j, j, drop = FALSE])) 
# is a vector of length 32 

但如果你真的有這樣做的很長的路要走:

list.of.cov.mat <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))), 
         1, function(j) cov.mat[j, j, drop = FALSE]) 
# is a list of 32 covariance matrices 
dets <- sapply(list.of.cov.mat, det) 
# is a vector of length 32 

或者超級長的路要走:

list.of.mat <- apply(expand.grid(rep(list(c(FALSE, TRUE)), ncol(cov.mat))), 
         1, function(j) myarray[, j, drop = FALSE]) 
# is a list of 32 matrices 
list.of.cov.mat <- lapply(list.of.mat, cov) 
# is a list of 32 covariance matrices 
dets <- sapply(list.of.cov.mat, det) 
# is a vector of length 32 

他們都應該給予同樣的結果,但一個在頂部將更快,更打字是顯著。

+0

再次感謝您的幫助 – nopeva