2011-07-04 46 views
16

我解決簡單的優化問題。該數據集有26列和3000多行。 源代碼看起來像[R解決:系統正是奇異

Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma1 <- solve(Sigma) 

,一切工作perfect-但後來我想這樣做同樣的時間較短(只有261行)和解決功能寫入以下錯誤:

solve(Sigma) 
Error in solve.default(Sigma) : 
    Lapack routine dgesv: system is exactly singular 

它的奇怪,因爲當我做同樣的一些隨機數字:

Returns<-matrix(runif(6786,-1,1), nrow=261) 
Means <- colMeans(Returns) 
Sigma <- cov(Returns) 
invSigma <- solve(Sigma) 

根本不會發生錯誤。有人可以解釋我在哪裏可以解決問題以及如何對待它。 非常感謝, 亞歷克斯

回答

10

我想你的代碼在第二種情況下使用奇異矩陣(即不可逆),解決函數需要反轉它。這與尺寸沒有任何關係,但事實上有些矢量(可能)是共線的。

+0

該數據集包含26資產收益的日收益率,應該是可逆的,不是嗎?我很困惑,爲什麼當我有了整個數據集,而縮短產生錯誤時沒有問題。任何想法如何處理它? – Alex

+4

@Alex檢查'det(Sigma)':如果它爲零則不可能反轉。 – James

+0

事實上,它是0.當我縮短數據集時,有什麼問題? – Alex

16

使用solve與單個參數是反轉的矩陣的請求。錯誤信息告訴你,你的矩陣是單數的,不能倒置。

+0

的接近底部的下一頁幫助我理解反演和奇點問題的概念:[鏈接](https://www.mathsisfun.com/algebra/matrix-inverse.html) – Jacksonsox

5

Lapack是一個線性代數包,它被R(實際上在任何地方使用)在solve()之下使用,當你作爲參數傳遞的矩陣是單數時,dgesv吐出這種錯誤。

作爲附錄:dgesv執行LU分解,其中,使用矩陣時,通過強制0的分割,因爲這是不明確的,它引發此錯誤。僅當矩陣是奇異的或當它是你的機器上奇異(由於逼近你可以有一個非常小的數字被視爲0)發生

我建議你檢查它的決定因素,如果你使用的基質主要含有整數並不大。如果它很大,那麼看看this link