Tengo una matriz de correlación de retornos de seguridad cuyo determinante es cero. (Esto es un poco sorprendente ya que la matriz de correlación de la muestra y la matriz de covarianza correspondiente deberían ser teóricamente definitivas positivas).
Mi hipótesis es que al menos un valor depende linealmente de otros valores. ¿Existe una función en R que pruebe secuencialmente cada columna una matriz para la dependencia lineal?
Por ejemplo, un enfoque sería construir una matriz de correlación una seguridad a la vez y calcular el determinante en cada paso. Cuando el determinante = 0, deténgase cuando haya identificado el valor que es una combinación lineal de otros valores.
Se aprecia cualquier otra técnica para identificar la dependencia lineal en dicha matriz.
fuente
Respuestas:
Parece hacer una pregunta realmente provocativa: cómo detectar, dada una matriz de correlación singular (o covarianza, o suma de cuadrados y productos cruzados), qué columna depende linealmente de cuál. Supongo tentativamente que la operación de barrido podría ayudar. Aquí está mi sonda en SPSS (no R) para ilustrar.
Generemos algunos datos:
Creemos una dependencia lineal entre V2, V4 y V5:
Entonces, modificamos nuestra columna V4.
Las impresiones de M en 5 iteraciones:
Observe que finalmente la columna 5 se llenó de ceros. Esto significa (según tengo entendido) que V5 está ligado linealmente con algunas de las columnas anteriores . Que columnas Mire la iteración donde la columna 5 no está llena de ceros - iteración 4. Vemos que V5 está vinculado con V2 y V4 con coeficientes -.3333 y .8333: V5 = -.3333 * V2 + .8333 * V4, que corresponde a lo que hemos hecho con los datos: V4 = .4 * V2 + 1.2 * V5.
Así es como supimos qué columna está ligada linealmente con qué otra. No verifiqué cuán útil es el enfoque anterior en un caso más general con muchos grupos de interdependencias en los datos. Sin embargo, en el ejemplo anterior parecía útil.
fuente
Aquí hay un enfoque sencillo: calcule el rango de la matriz que resulta de eliminar cada una de las columnas. Las columnas que, cuando se eliminan, dan como resultado el rango más alto son las linealmente dependientes (ya que eliminarlas no disminuye el rango, mientras que eliminar una columna linealmente independiente sí lo hace).
En R:
fuente
system is exactly singular: U[5,5] = 0
, que ahora sé que significa que la columna 5 fue el problema (¡parece obvio en retrospectiva ya que es una columna de ceros!)your.matrix = matrix(1:4, 2)
?La pregunta se refiere a "identificar relaciones subyacentes [lineales]" entre variables.
La manera rápida y fácil de detectar relaciones es hacer retroceder cualquier otra variable (use una constante, incluso) contra esas variables usando su software favorito: cualquier buen procedimiento de regresión detectará y diagnosticará colinealidad. (Ni siquiera se molestará en mirar los resultados de la regresión: solo confiamos en un efecto secundario útil de configurar y analizar la matriz de regresión).
Sin embargo, suponiendo que se detecte la colinealidad, ¿qué sigue? El análisis de componentes principales (PCA) es exactamente lo que se necesita: sus componentes más pequeños corresponden a relaciones casi lineales. Estas relaciones se pueden leer directamente de las "cargas", que son combinaciones lineales de las variables originales. Las pequeñas cargas (es decir, las asociadas con pequeños valores propios) corresponden a casi colinealidades. Un valor propio de correspondería a una relación lineal perfecta. Valores propios ligeramente más grandes que todavía son mucho más pequeños que los más grandes corresponderían a relaciones lineales aproximadas.0 0
(Existe un arte y bastante literatura asociada con la identificación de lo que es una carga "pequeña". Para modelar una variable dependiente, sugeriría incluirla dentro de las variables independientes en el PCA para identificar los componentes, independientemente de sus tamaños, en los que la variable dependiente juega un papel importante. Desde este punto de vista, "pequeño" significa mucho más pequeño que cualquiera de esos componentes).
Veamos algunos ejemplos. (Estos se usan
R
para los cálculos y el trazado). Comience con una función para realizar PCA, busque componentes pequeños, grábelos y devuelva las relaciones lineales entre ellos.sweep
El resultado asociado con el panel superior izquierdo fue
La salida para el panel central superior fue
En la práctica, a menudo no es el caso que una variable se destaque como una combinación obvia de las otras: todos los coeficientes pueden ser de tamaños comparables y de signos variables. Además, cuando hay más de una dimensión de las relaciones, no hay una forma única de especificarlas: se necesita un análisis adicional (como la reducción de filas) para identificar una base útil para esas relaciones. Así es como funciona el mundo: todo lo que puede decir es que estas combinaciones particulares producidas por PCA corresponden a casi ninguna variación en los datos. Para hacer frente a esto, algunas personas usan los componentes más grandes ("principales") directamente como variables independientes en la regresión o el análisis posterior, cualquiera sea la forma que pueda tomar. Si hace esto, ¡no olvide primero eliminar la variable dependiente del conjunto de variables y rehacer la PCA!
Aquí está el código para reproducir esta figura:
(Tuve que jugar con el umbral en los casos de error grande para mostrar solo un componente: esa es la razón para suministrar este valor como parámetro
process
).El usuario ttnphns ha dirigido amablemente nuestra atención a un hilo estrechamente relacionado. Una de sus respuestas (por JM) sugiere el enfoque descrito aquí.
fuente
"loadings," which are linear combinations of the original variables
princomp
fuente
Me encontré con este problema hace aproximadamente dos semanas y decidí que necesitaba volver a visitarlo porque cuando se trata de conjuntos de datos masivos, es imposible hacer estas cosas manualmente.
Creé un bucle for () que calcula el rango de la matriz columna por columna. Entonces, para la primera iteración, el rango será 1. El segundo, 2. Esto ocurre hasta que el rango sea MENOR que el número de columna que está utilizando.
Muy sencillo:
para () desglose del bucle
Estoy seguro de que puede agregar una declaración if, aún no la necesito porque solo estoy tratando con columnas 50ish.
¡Espero que esto ayude!
fuente
Rango, r de una matriz = número de columnas linealmente independientes (o filas) de una matriz. Para una matriz n por n A , el rango (A) = n => todas las columnas (o filas) son linealmente independientes.
fuente
No es que la respuesta que dio @Whuber realmente deba ampliarse, pero pensé en proporcionar una breve descripción de las matemáticas.
Citas
Montgomery, D. (2012). Introducción al análisis de regresión lineal, 5ª edición. John Wiley & Sons Inc.
fuente