2014-02-25 68 views
0

讓我們說我有這種形式的一個非常大的相關性矩陣:有效的方法來反轉大相關矩陣

t1.rep1 = rnorm(n=100,mean=10,sd=) 
t2.rep1 = t1.rep1 + rnorm(n=100,mean=3,sd=2) 
t3.rep1 = t1.rep1 + rnorm(n=100,mean=2,sd=2) 
t1.rep2 = rnorm(n=100,mean=2,sd=1) 
t2.rep2 = t1.rep2 + rnorm(n=100,mean=0.5,sd=0.5) 
t3.rep2 = t1.rep2 + rnorm(n=100,mean=0.7,sd=0.9) 
t1.rep3 = rnorm(n=100,mean=2,sd=1) 
t2.rep3 = t1.rep3 + rnorm(n=100,mean=0.5,sd=0.5) 
t3.rep3 = t1.rep3 + rnorm(n=100,mean=0.7,sd=0.9) 
Sigma = matrix(
    c(cov(t1.rep1, t1.rep1), 0, 0, cov(t1.rep1, t2.rep1), 0, 0, cov(t1.rep1, t3.rep1), 0, 0, 
    0, cov(t1.rep2, t1.rep2), 0, 0, cov(t1.rep2, t2.rep2), 0, 0, cov(t1.rep2, t3.rep2), 0, 
    0, 0, cov(t1.rep3, t1.rep3), 0, 0, cov(t1.rep3, t2.rep3), 0, 0, cov(t1.rep3, t3.rep3), 
    cov(t2.rep1, t1.rep1), 0, 0, cov(t2.rep1, t2.rep1), 0, 0, cov(t2.rep1, t3.rep1), 0, 0, 
    0, cov(t2.rep2, t1.rep2), 0, 0, cov(t2.rep2, t2.rep2), 0, 0, cov(t2.rep2, t3.rep2), 0, 
    0, 0, cov(t2.rep3, t1.rep3), 0, 0, cov(t2.rep3, t2.rep3), 0, 0, cov(t2.rep3, t3.rep3), 
    cov(t3.rep1, t1.rep1), 0, 0, cov(t3.rep1, t2.rep1), 0, 0, cov(t3.rep1, t3.rep1), 0, 0, 
    0, cov(t3.rep2, t1.rep2), 0, 0, cov(t3.rep2, t2.rep2), 0, 0, cov(t3.rep2, t3.rep2), 0, 
    0, 0, cov(t3.rep3, t1.rep3), 0, 0, cov(t3.rep3, t2.rep3), 0, 0, cov(t3.rep3, t3.rep3)), 
    nrow = 9, ncol = 9) 

我的相關矩陣西格瑪。

我要計算它的倒數,即

Sigma.inv = solve(Sigma) 

在現實中我西格瑪是非常非常大,並採取逆它採取了很長時間。

是否有反正使用矩陣的稀疏性和結構來以更快更有效的方式計算Sigma的逆?

我需要迭代計算這個逆,所以計算逆的快速方法將幫助我的算法顯着提高速度。該Sigma您提供

回答

1

實際上是塊對角:

x = c(1,4,7,2,5,8,3,6,9) 
Sigma[x,x] 

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6] ... 
[1,] 0.9494388 1.130673 0.9825316 0.000000 0.000000 0.000000 ... 
[2,] 1.1306727 4.983144 1.2112634 0.000000 0.000000 0.000000 ... 
[3,] 0.9825316 1.211263 5.0771423 0.000000 0.000000 0.000000 ... 
[4,] 0.0000000 0.000000 0.0000000 1.211892 1.223293 1.328587 ... 
[5,] 0.0000000 0.000000 0.0000000 1.223293 1.469146 1.242400 ... 
[6,] 0.0000000 0.000000 0.0000000 1.328587 1.242400 2.377406 ... 
... 

和塊對角矩陣,可以更快地逐塊的反轉。只需用它的反轉代替每個塊。

+0

@Shabalin,非常感謝,看起來像一個偉大的建議。任何訣竅在R中快速執行每個塊的反轉?只需對每個塊應用函數?或做一個for循環?對於循環往往是相當緩慢的R ... – Dnaiel

+0

也許你可以存儲在矩陣塊開始。 –

+0

另外,看看http://stats.stackexchange.com/questions/14951/efficient-calculation-of-matrix-inverse-in-r –