Tengo varias observaciones multivariadas y me gustaría evaluar la densidad de probabilidad en todas las variables. Se supone que los datos se distribuyen normalmente. Con un número bajo de variables, todo funciona como cabría esperar, pero pasar a números mayores da como resultado que la matriz de covarianza se vuelva no positiva definida.
He reducido el problema en Matlab a:
load raw_data.mat; % matrix number-of-values x number of variables
Sigma = cov(data);
[R,err] = cholcov(Sigma, 0); % Test for pos-def done in mvnpdf.
Si err> 0, entonces Sigma no es definitivo positivo.
¿Hay algo que pueda hacer para evaluar mis datos experimentales en dimensiones superiores? ¿Me dice algo útil sobre mis datos?
Soy un poco principiante en esta área, así que me disculpo si me he perdido algo obvio.
Respuestas:
La matriz de covarianza no es positiva definida porque es singular. Eso significa que al menos una de sus variables se puede expresar como una combinación lineal de las otras. No necesita todas las variables, ya que el valor de al menos una puede determinarse a partir de un subconjunto de las otras. Sugeriría agregar variables secuencialmente y verificar la matriz de covarianza en cada paso. Si una nueva variable crea una singularidad, suéltela y continúe con la siguiente. Finalmente, debe tener un subconjunto de variables con una matriz de covarianza definida positiva.
fuente
regress
comando de Stata eliminará automáticamente variables adicionales cuando algunas sean colineales (y su salida se puede guardar en una forma que identifique estas variables y marque un subconjunto no colineal para uso futuro). Sin embargo, una complicación probable es que las variables pueden no ser necesariamente colineales, pero pueden estar lo suficientemente cerca como para que la propagación del error de coma flotante en la descomposición de Cholesky produzca estimaciones negativas del valor propio, haciendo que las variables sean colineales para todos los fines prácticos.R
: los modelos de regresión eliminan automáticamente las variables del predictor lineal si existe una colinealidad exacta.g
es su modelo lineal,colnames(model.matrix(g))[-which(is.na(coef(g))==TRUE)][-1]
debería devolver los nombres de los predictores ingresados en el modelo que no son exactamente colineales. Esto funciona comprobando qué coeficientes eranNA
(así es comoR
indica que se eliminó una variable) y encontrando los nombres de columna correspondientes de la matriz modelo (eliminando la columna de intercepción). Por cierto, eso no funcionará si no hay términos colineales, por lo quewhich(is.na(coef(g))==TRUE)
se requiere una declaración if para verificar que no esté vacía :)Es un resultado válido. La estimación para ese componente de la matriz de covarianza es cero, ¡lo cual puede muy bien ser cierto! Puede conducir a dificultades de cálculo, pero algunos algoritmos en R (no sé sobre Matlab) pueden manejar esto. No entiendo por qué la gente se molesta por esto e insiste en adaptar modelos más parsimoniosos.
fuente
Un punto que no creo que se aborde anteriormente es que ES posible calcular una matriz de covarianza definida no positiva a partir de datos empíricos, incluso si sus variables no están perfectamente relacionadas linealmente. Si no tiene suficientes datos (particularmente si está tratando de construir una matriz de covarianza de alta dimensión a partir de un grupo de comparaciones por pares) o si sus datos no siguen una distribución normal multivariada, entonces puede terminar con relaciones paradójicas entre variables, como cov (A, B)> 0; cov (A, C)> 0; cov (B, C) <0.
En tal caso, no se puede ajustar un PDF normal multivariado, ya que no hay una distribución normal multivariada que cumpla con estos criterios: cov (A, B)> 0 y cov (A, C)> 0 necesariamente implica que cov (B, C )> 0.
Todo esto quiere decir que una matriz definida no positiva no siempre significa que se incluyen variables colineales. También podría sugerir que está intentando modelar una relación que es imposible dada la estructura paramétrica que ha elegido.
fuente