Calculé la matriz de covarianza de la muestra de una muestra y obtuve una matriz simétrica. Con , me gustaría crear -variate rn distribuido normal, pero por lo tanto necesito la descomposición de Cholesky de . ¿Qué debo hacer si no es definitivo positivo?
15
Respuestas:
Las preocupaciones de interrogación cómo generar variables aleatorias al azar de una distribución normal multivariante con una (posiblemente) singular matriz de covarianzaC . Esta respuesta explica una forma que funcionará para cualquier matriz de covarianza. Proporciona una
R
implementación que prueba su precisión.Análisis algebraico de la matriz de covarianza.
ComoC es una matriz de covarianza, es necesariamente simétrica y semidefinida positiva. Para completar la información de fondo, dejemos que μ sea el vector de los medios deseados.
Debido a que es simétrica, su descomposición de valor singular (SVD) y su descomposición propia tendrán automáticamente la formaC
para alguna matriz ortogonal y matriz diagonal D 2 . En general, los elementos diagonales de D 2 no son negativos (lo que implica que todos tienen raíces cuadradas reales: elija los positivos para formar la matriz diagonal D ). La información que tenemos sobre C dice que uno o más de esos elementos diagonales son cero, pero eso no afectará ninguna de las operaciones posteriores ni impedirá que se calcule la SVD.V re2 re2 re C
Generando valores aleatorios multivariados
Let tiene una distribución normal multivariante estándar: cada componente tiene media cero, varianza unitaria, y todas las covarianzas son cero: su matriz de covarianza es la identidad I . Entonces la variable aleatoria Y = V D X tiene una matriz de covarianzaX yo Y= V D X
En consecuencia, la variable aleatoria tiene una distribución normal multivariante con media μ y matriz de covarianza C .μ+Y μ C
Cálculo y código de ejemplo
El siguienteY 0 10,000 Y 100 C 50
R
código genera una matriz de covarianza de dimensiones y rangos dados, la analiza con la SVD (o, en el código comentado, con una descomposición propia), usa ese análisis para generar un número específico de realizaciones de (con el vector medio 0 ) , y luego compara la matriz de covarianza de esos datos con la matriz de covarianza prevista, tanto numérica como gráficamente. Como se muestra, genera 10 , 000 realizaciones donde la dimensión de Y es 100 y el rango de C es 50 . La salida esEs decir, el rango de los datos también es y la matriz de covarianza estimada a partir de los datos se encuentra a una distancia de 8 × 10 - 5 de C --que está cerca. Como una verificación más detallada, los coeficientes de C se grafican contra los de su estimación. Todos se encuentran cerca de la línea de igualdad:50 8×10−5 C C
El código es exactamente paralelo al análisis anterior y, por lo tanto, debe explicarse por sí mismo (incluso para los noD2 D
R
usuarios, que podrían emularlo en su entorno de aplicación favorito). Una cosa que revela es la necesidad de precaución cuando se utilizan algoritmos de punto flotante: las entradas de pueden ser fácilmente negativas (pero pequeñas) debido a la imprecisión. Dichas entradas deben ponerse a cero antes de calcular la raíz cuadrada para encontrar D en sí.fuente
Método de solución A :
En MATLAB, el código sería
Método de solución B : Formule y resuelva un SDP convexo (Programa semidefinido) para encontrar la matriz D a C más cercana de acuerdo con la norma frobenius de su diferencia, de modo que D sea positivo definido, habiendo especificado un valor propio mínimo m.
Usando CVX bajo MATLAB, el código sería:
Comparación de los métodos de solución : además de simular la matriz inicial, el método de solución A ajusta (aumenta) solo los elementos diagonales en una cantidad común y deja los elementos fuera de la diagonal sin cambios. El método de solución B encuentra la matriz definida positiva más cercana (a la matriz original) que tiene el valor propio mínimo especificado, en el sentido de la norma mínima de frobenio de la diferencia de la matriz definida positiva D y la matriz original C, que se basa en las sumas de diferencias al cuadrado de todos los elementos de D - C, para incluir los elementos fuera de la diagonal. Por lo tanto, al ajustar los elementos fuera de la diagonal, puede reducir la cantidad en la que los elementos diagonales deben aumentarse, y los elementos de diagoan no necesariamente se incrementan en la misma cantidad.
fuente
Comenzaría por pensar en el modelo que está estimando.
Si una matriz de covarianza no es semi-definida positiva, puede indicar que tiene un problema de colinealidad en sus variables que indicaría un problema con el modelo y no necesariamente debe resolverse mediante métodos numéricos.
Si la matriz no es positiva semidefinida por razones numéricas, entonces hay algunas soluciones que se pueden leer aquí.
fuente
Una forma sería calcular la matriz a partir de una descomposición de valores propios. Ahora admitiré que no sé demasiado de las matemáticas detrás de estos procesos, pero de mi investigación parece fructífero mirar este archivo de ayuda:
http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html
y algunos otros comandos relacionados en R.
Además, consulte 'nearPD' en el paquete Matrix.
Lo siento, no podría ser de más ayuda, pero espero que mi búsqueda pueda ayudarlo a tomar la dirección correcta.
fuente
Puede obtener los resultados de la función nearPD en el paquete Matrix en R. Esto le devolverá una matriz valorada real.
fuente