9 votos

¿Cuál es el método más rápido para determinar el grado de colinealidad?

Dada una gran cantidad de datos, ¿cómo podría determinar el grado de colinealidad entre todas las variables? ¿Preferiblemente sin depender del cálculo de la regresión lineal entre una variable y todas las demás? Específicamente, necesito encontrar la colinealidad entre cualquier variable individual y cada una de las otras variables.

Para este caso, diremos que los datos tienen 10k variables y 100 millones de líneas. No necesito un paquete de software en sí, un enlace a un documento relevante está bien.

0 votos

¿Cuántos datos tienes? El mejor método, en mi opinión, son los índices de condición y la proporción de varianza explicada.

1 votos

Como escribió Peter, ¿qué tan grande es realmente? Puedes calcular el número de condición de tu matriz de diseño en un ordenador de sobremesa para hasta 20k variables en segundos.

0 votos

@PeterFlom A efectos de esta pregunta, diré que los datos tienen unas 10k variables, y unos 10 millones de puntos. Voy a actualizar mi pregunta. También revisaré los índices de condición.

9voto

Patrick Puntos 183

El número de condición es el estadístico que se quiere mirar. Es una medida exhaustiva de la colinealidad de su espacio de diseño y mucho más barata de calcular que el VIF. La fórmula es:

$$2\log\left(\frac{d_1(X_s)}{d_p(X_s)}\right) (1)$$

donde $d_p$ ( $d_1$ ) es el menor (mayor) valor singular de $X_s$ y $X_s$ son las variables centradas y reescaladas.

Leer su comentario : esto es lo que estaba sospechando. Para calcular la condición # no necesitas los 100e6 puntos de datos. Sólo muestras, al azar, del orden de 100e3 (experimentando con conjuntos de datos simulados puedes convencerte de que para obtener resultados fiables debes apuntar a unos 5*k, donde k es el # de variables no colineales por lo que incluso 100e3 ya es muy grande).

Eso ya debería darle una idea bastante clara de qué variables están causando la colinealidad.

Además, tiene un algoritmo especializado para calcular los primeros y últimos valores singulares y el último vector singular solamente. Hay algoritmos que obtienen estos valores sin calcular el SVD completo de $X$ (SVD-S). Sin embargo, no sé si están implementados en R, así que para que el ejemplo de abajo sea accesible me limitaré a usar un pequeño ejemplo y el clásico SVD de R.

Un número de condición alto (normalmente cuando la relación (1) es mayor que 10) le indica que $X_s'X_s$ está mal condicionada, que hay componentes que se pueden reescribir como combinación (casi) lineal de las otras variables. A continuación doy un breve ejemplo (a pequeña escala) de cómo se puede utilizar la SVD para descubrir esas relaciones.

n<-100
p<-20
#non-ill conditioned part of the dataset.
x<-matrix(rnorm(n*p),nc=p)
x<-scale(x)
#introduce a variable that causes x to be 
#ill conditioned.
y<-x%*%c(rnorm(3),rep(0,p))[1:p]
y<-scale(y)
x<-cbind(x,y)
p<-ncol(x)

A<-svd(x,nu=0)
#x is ill-conditioned: this ratio is larger 
#than 10. (step 1)
2*log(A$d[1]/A$d[p])

#check what is causing it: (step 2)
round(A$v[,ncol(A$v)],2)
#you can write the last variable as (.23*x_1+.5*x_2-.45*x_3)/(-.7) [1]
#here the relation is exact because:
min(A$d)
#is 0. if min(A$d)>0 then this gives you how much there is noise 
#there is arround [1].

#so I remove the last variable. (step 3)
x<-x[,-ncol(x)]
#no more ill-condition.
2*log(A$d[1]/A$d[p-1])

Esto es para el álgebra lineal del problema cuando hay una sola variable que causa la mala regresión. En la mayoría de los casos tendrá más de una relación (casi) exacta y tendrá que repetir los pasos 1 a 3. En la práctica, las especificidades computacionales dependerán de lo inteligente que sea el enfoque que utilices para resolver el problema SVD.

Puede hacerse una idea de cuántas relaciones exactas hay en su conjunto de datos calculando

$$2\log\left(\frac{d_1(X_s)}{d_j(X_s)}\right)$$

para todos $j$ 's. Para ello sólo se necesitan los valores singulares que se pueden obtener en el coste $O(p^2)$

0 votos

¿Puede enlazarme algo para leer más sobre la condición # y cómo ayudaría a determinar la colinealidad? Wikipedia parece indicar que no proporciona las respuestas que necesito, que es el grado de colinealidad entre cada variable. Estoy intentando simplemente agrupar las variables altamente colineales.

1 votos

Lea Belsley: Conditioning diagnostics, collinearity and weak data in regression. O bien, busque mi disertación Flom, Collinearity diagnostics for multiple regression: A Monte Carlo Study. Belsley también escribió otro libro que cubre esto, pero es más general.

0 votos

@user603 ¿Puedes explicar qué pasa en el paso 2? ¿Cómo sabes exactamente que la última variable está causando el problema? En concreto, ¿cómo has llegado a "round(A $v[,ncol(A$ v)],2)"? ¿Estás tomando la SVD singular derecha de la última variable? ¿Cómo sabías que tenías que buscar eso?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X