Archivo de la etiqueta: car

El problema de la multicolinealidad, intuirlo y detectarlo

El modelo líneal se puede escribir de forma matricial como Y = X • Beta + Error. Donde Y es el vector con nuestra variable dependiente, X la matriz con las variables regresoras, Beta el vector de parámetros y el error esa parte aleatoria que tiene que tener todo modelo. La matriz con nuestras variables regresoras X ha de tener rango completo es decir, todas sus columnas tienen que ser linealmente independientes. Eso nos garantiza que a la hora de estimar por mínimos cuadrados ordinarios X’ X es invertible. Si no es invertible la estimación por mínimos cuadrados ordinarios “se vuelve inestable” ya que X’X =0 y 1/ X’X será muy complicado de calcular ya que los Beta son inversa(X’ X) •X’Y; por ello los resultados que arroja el modelo tienen una alta variabilidad. Cuando esto nos pasa tenemos colinealidad.

Hay varias formas de intuir si hay relación lineal entre nuestras variables independientes. La primera es analizar el coeficiente de correlación. Si tenemos variables altamente correladas es muy probable que el modelo pueda tener colinealidad entre esas variables. Otro de los síntomas se produce cuando nuestro modelo tiene un alto coeficiente de correlación y muchas variables no son significativas. En estos casos es muy probable la existencia de colinealidad.

Cuando hemos intuido que tenemos multicolinealidad pero hemos de detectarla, disponemos de tres métodos:

  • Determinante de la matriz de correlaciones. Si hay dos variables que son linealmente dependientes el determinante de la matriz de correlaciones será muy parecido a 0. Lo ideal si no hay correlación entre las variables dependientes es una matriz de correlaciones con unos en su diagonal y valores muy próximos a 0 en el resto de valores.
  • El coeficiente entre el autovalor más grande de X’ X entre el autovalor más pequeño no nulo de X’X. Si la raíz de esta división es superior a 10 podríamos tener multicolinealidad, si es superior a 30 hay multicolinealidad. Y esto por qué, pues porque si hay mucha diferencia entre estos autovalores esto implica una mayor inestabilidad en la matriz invertida.
  • El VIF, el variance inflation factor. ¿Cuánto se me “hincha” la varianza si elimino esa variable del modelo? ¿Cuánta inestabilidad aporta a mi modelo? Yo recomiendo emplear este método. Y va a ser sobre el que vamos a trabajar.

Para ilustrar el problema vamos a trabajar con R Seguir leyendo El problema de la multicolinealidad, intuirlo y detectarlo

Trabajando con factores en R. Attach frente a within

Un ejemplo de trabajo con datos en R. Transformamos factores de dos formas distintas. Por un lado empleamos within con recode de la librería car y por otro lado empleamos el mítico attach.

Manejo de datos con within:

datos library(car)
datos prog id reconocimientos reconocimientos2 = recode(num_awards,"0='Sin renococimiento';1='1 reconocimiento';
else='Más de un reconocimiento'")
})

Manejo de datos con attach/detach:

attach(datos)
datos$math_cat[math < 50 ] <- "D" datos$math_cat[math >= 50 & math < 60] <- "C" datos$math_cat[math >= 60 & math < 75] <- "B" datos$math_cat[math >= 75] <- "A"
datos$math_cat detach(datos)

No voy a entrar en que es más óptimo, tarda menos y demás. En mi opinión es mejor utilizar within pacece más “pulcro” y la verdad es que la función recode nos facilita mucho el trabajo pero como siempre tenemos múltiples posibilidades con R, por eso es R. Saludos.

Recodificar el valor de un factor en R

Tras leer una duda planteada en la lista de R-Help en español me he animado a crear una entrada acerca de la recodificación de factores en R. Así dejo recogido algún código/truco que puede serviros en vuestro trabajo con R y que este pequeño problema no afecte a vuestra productividad. Además os acerco a la función recode del paquete car. Pero en primer lugar os planteo como recodificar factores empleando IF/ELSE:


#Datos de ejemplo:
dt = rpois(200,3)
#Empleamos el bucle for
for (i in 1:length(dt)){
if (dt[i]<=1) {dt0[i]='Tipo 1'} else
if (dt[i]==2) {dt0[i]='Tipo 2'} else
if (dt[i]==3) {dt0[i]='Tipo 3'} else
{dt0[i]='Tipo 4'}}
table(dt0)

Realizamos un bucle FOR con R que recoge el objeto dt que hace de ejemplo. Este sería el método más habitual junto con el uso de la función ifelse. Pero el paquete car contiene una función muy interesante y que nos permite ahorrar complicaciones y líneas de código:

library(car)
dt1 = recode(dt,"c(0,1)='Tipo 1';2='Tipo 2';3='Tipo 3';else='Tipo 4'")
table(dt1)

Fácil de recordar. Podemos recodificar un factor (NA=0), un vector (c(0,1)=’Tipo 1′) o un rango de valores (4:max(dt)=’Tipo 4). Bajo mi punto de vista es la opción más recomendable cuando queremos reagrupar factores. También tenemos la función as.item del paquete memisc, no estoy acostumbrado a usarla pero os planteo el mismo ejemplo con ella:

library(memisc)
dt2 = as.item(dt,labels=c( 'Tipo 1'=0, 'Tipo 1'=1, 'Tipo 2'=2, 'Tipo 3'=3,
'Tipo 4'=4, 'Tipo 4'=5,'Tipo 4'=6,'Tipo 4'=7,'Tipo 4'=8,'Tipo 4'=9,'Tipo 4'=10))
table(dt2)
summary(dt2)

Tras ejecutar el código entenderéis porque no la uso. Espero que haya respuestas a esta entrada con otras posibilidades o que alguien me justifique el empleo del as.item, saludos.