2011-07-04 8 views
16

Rozwiązuję prosty problem optymalizacji. Zbiór danych ma 26 kolumn i ponad 3000 wierszy. Kod źródłowy wyglądaR rozwiązać: system jest dokładnie pojedynczy

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

I wszystko działa idealne-ale chcę zrobić to samo dla krótszego okresu (tylko 261 wierszy), a funkcja rozwiązać pisze się następujący błąd:

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

To dziwne, ponieważ gdy robię to samo z pewnymi liczbami losowymi:

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

Brak błędu w ogóle. Czy ktoś mógłby mi wytłumaczyć, gdzie może być problem i jak go leczyć? Dziękuję bardzo, Alex

Odpowiedz

10

Domyślam się, że twój kod używa gdzieś w drugim przypadku pojedynczej matrycy (tj. Nieodwracalnej), a funkcja rozwiązania musi ją odwrócić. Nie ma to nic wspólnego z rozmiarem, ale z tym, że niektóre z twoich wektorów są (prawdopodobnie) współliniowe.

+0

Zestaw danych zawiera codziennie zwroty 26 zwrotów aktywów, powinien być odwracalny, nie? Jestem zdezorientowany, dlaczego nie ma problemu, gdy mam cały zestaw danych, podczas gdy skrócenie powoduje błąd. Jakieś pomysły, jak sobie z tym poradzić? – Alex

+4

@Alex Sprawdź 'det (Sigma)': Jeśli jest zero, to niemożliwe jest odwrócenie. – James

+0

Rzeczywiście jest to 0. Jaki jest problem, gdy skracam zestaw danych? – Alex

16

Za pomocą pojedynczego parametru jest żądanie odwrócenia macierzy. Komunikat o błędzie mówi, że twoja macierz jest pojedyncza i nie można jej odwrócić.

+0

The następna strona, u dołu, pomogła mi zrozumieć pojęcia inwersji i problemu osobliwości: [link] (https://www.mathsisfun.com/algebra/matrix-inverse.html) – Jacksonsox

5

Lapack jest pakietem Algebra liniowa, który jest używany przez R (w rzeczywistości jest używany wszędzie) pod solve(), dgesv pluje tego rodzaju błędem, gdy macierz, którą przekazałeś jako parametr, jest pojedyncza.

Jako załącznik: dgesv wykonuje dekompozycję LU, która przy użyciu macierzy wymusza dzielenie przez 0, ponieważ jest to niezdefiniowane, powoduje to błąd. Dzieje się tak tylko wtedy, gdy macierz jest pojedyncza lub gdy jest pojedyncza na twoim komputerze (z powodu aproksymacji można uznać naprawdę małą liczbę) 0)

Proponuję sprawdzić jego wyznacznik, jeśli używana macierz zawiera głównie liczby całkowite i nie jest duży. Jeśli jest duży, spójrz na this link.