2011-07-04 15 views
16

Resuelvo un problema de optimización simple. El conjunto de datos tiene 26 columnas y más de 3000 filas. El código fuente se pareceR resolver: el sistema es exactamente singular

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

Y todo funciona perfecto, pero entonces yo quiero hacer lo mismo para el período más corto (sólo 261 filas) y la función de resolver escribe el siguiente error:

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

su raro porque cuando lo haga lo mismo con algunos números aleatorios:

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

se produce ningún error en absoluto. ¿Podría alguien explicarme dónde podría estar el problema y cómo tratarlo? Muchas gracias, Alex

Respuesta

10

supongo que el código utiliza algún lugar en el segundo caso una matriz singular (es decir, no invertible), y la función de resolver las necesidades para invertirlo. Esto no tiene nada que ver con el tamaño, pero con el hecho de que algunos de sus vectores son (probablemente) colineales.

+0

El conjunto de datos contiene devoluciones diarias de 26 devoluciones de activos, debe ser invertible, ¿no? Estoy confundido por qué no hay ningún problema cuando tengo todo el conjunto de datos, mientras que acortar produce un error. ¿Alguna idea de cómo lidiar con eso? – Alex

+4

@Alex Check 'det (Sigma)': Si es cero, entonces es imposible invertirlo. – James

+0

De hecho, es 0. ¿Cuál es el problema cuando acorto el conjunto de datos? – Alex

16

El uso de solve con un solo parámetro es una solicitud para invertir una matriz. El mensaje de error te dice que tu matriz es singular y no puede invertirse.

+0

The La siguiente página, cerca de la parte inferior, me ayudó a entender los conceptos de inversión y el problema de la singularidad: [enlace] (https://www.mathsisfun.com/algebra/matrix-inverse.html) – Jacksonsox

5

Lapack es un paquete de Algebra lineal que es usado por R (en realidad se usa en todas partes) debajo de solve(), dgesv escupe este tipo de error cuando la matriz que pasó como parámetro es singular.

Como una adición: dgesv realiza la descomposición LU, que, al utilizar su matriz, fuerza una división por 0, ya que está mal definida, arroja este error. Esto solo ocurre cuando la matriz es singular o cuando es singular en su máquina (debido a la aproximación puede tener un número realmente pequeño)

Le sugiero que compruebe su determinante si la matriz que está utilizando contiene principalmente enteros y no es grande. Si es grande, eche un vistazo a this link.