5 jul 2019

Interpretación y uso de dummys en los modelos de regresión (ejemplos en R)

Es común el uso de variables cualitativas en los modelos de regresión (sexo, sector de la economía, condición laboral, pobreza monetaria, ...), dado que estas permiten especificar diferencias en los modelos a lo interno de grupos específicos, especificar diferenciales de efecto de alguna variable en función de grupos puntuales, estudiar quiebres estructurales o inclusive estudiar el efecto de eventos puntuales como crisis o políticas públicas. En la siguiente entrada se utiliza la base wage1.txt (Wooldridge Source) para ilustrar algunos de los usos más frecuentes de estas variables, así como su interpretación, utilizando R.

Estas variables se suelen representar a partir de variables ficticias o binarias, que toman valores 1 o 0, siendo el valor de 1 el que corresponde al grupo indicado en el nombre de la variable. Pero dado que una variable puede representar más de una condición, existe además una infinidad de variables cualitativas multinomiales.

Caso 1. Usar una variable dummy (diferencial de intercepto)

R permite introducir información cualitativa en los modelos de regresión solo con agregarla en el argumento de fórmula de la función lm como cualquier otra variable. En tal sentido, verifique el siguiente ejemplo donde se incorpora una variable binaria (service) que asume el valor de 1 en el caso de que la persona pertenezca al sector servicios y 0 en caso contrario. 

library(wooldridge)
result1 <-  lm(wage~educ+exper+I(exper^2)+tenure+services, data=wage1)
summary(result1)

Residuals:
  Min      1Q  Median      3Q     Max 
-7.1447 -1.8437 -0.5241  1.1607 14.1117 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.2294757  0.7179771  -4.498 8.47e-06 ***
  educ         0.5503021  0.0503965  10.919  < 2e-16 ***
  exper        0.2051971  0.0358067   5.731 1.70e-08 ***
  I(exper^2)  -0.0041614  0.0007783  -5.347 1.34e-07 ***
  tenure       0.1568125  0.0211155   7.426 4.60e-13 ***
  services    -1.0904689  0.4362476  -2.500   0.0127 *  
  ---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.99 on 520 degrees of freedom
Multiple R-squared:  0.3506,    Adjusted R-squared:  0.3444 
F-statistic: 56.16 on 5 and 520 DF,  p-value: < 2.2e-16

La interpretación del coeficiente (-1.0904689) asociado a esta variable se realiza tomando esperanza condicional de la variable dependiente, y luego estableciendo diferencias entre estas esperanzas. Por lo que, este coeficiente se interpreta como un diferencial de intercepto, o la diferencia entre los salarios promedios condicionales de las personas en el sector servicio, respecto al grupo de referencia que en este caso corresponde a todas las personas que trabajan fuera de del sector servicios.
Puntualmente, se verifica un coeficiente estadísticamente significativo, que indica que existe evidencia de que estos promedios condicionales son estadísticamente diferente, siendo el salario promedio del sector servicios de 1.0904 dólares inferior respecto a los trabajadores de los sectores no servicio (grupo de referencia).

Por último, al ser un diferencial de intersectos, se tiene dos modelos, en función del sector de la economía:
  
  Servicio: b_0 + b_1 X + u
  No servicio: (b_0 + b_servises) + b_1 X + u
  
  b_servises es una diferencia lineal del salario entre personas del sector servicio y no, manteniendo contante, el resto de variables del modelo. 

Caso 1a. Usar una variable dummy (diferencial de intercepto) en el modelo log-nivel
  
En R, solo debemos anidar la variable y en la función log para obtener una semi-elasticidad. En este caso, el coeficiente asociado a la variable dummy indica una diferencia salarial porcentual entre ambos grupos. Es decir, las personas del sector servicio ganan en promedio 23.95% menos que los trabajadores de otros sectores, controlando por las variables del modelo y manteniendo constante los factores externos. 
  
  result1a <-  lm(log(wage)~educ+exper+I(exper^2)+tenure+services, data=wage1)
  summary(result1a)
  
  Call:
    lm(formula = log(wage) ~ educ + exper + I(exper^2) + tenure + 
         services, data = wage1)
  
  Residuals:
    Min       1Q   Median       3Q      Max 
  -1.75606 -0.28168 -0.04136  0.27468  1.26057 
  
  Coefficients:
    Estimate Std. Error t value Pr(>|t|)    
  (Intercept)  0.2401542  0.1011671   2.374 0.017967 *  
    educ         0.0839936  0.0071012  11.828  < 2e-16 ***
    exper        0.0328739  0.0050454   6.516 1.71e-10 ***
    I(exper^2)  -0.0006517  0.0001097  -5.942 5.16e-09 ***
    tenure       0.0198183  0.0029753   6.661 6.94e-11 ***
    services    -0.2394655  0.0614698  -3.896 0.000111 ***
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  
  Residual standard error: 0.4213 on 520 degrees of freedom
  Multiple R-squared:  0.3776,  Adjusted R-squared:  0.3716 
  F-statistic:  63.1 on 5 and 520 DF,  p-value: < 2.2e-16
  
Caso 2. Varias variables dummy

En el ejemplo anterior consideramos una variable que asumía dos valores (1 y 0, según perteneciera o no al sector servicios), sin embargo, muchas variables cualitativas incorporan más de dos categorías, por lo que pueden asumir más de dos valores. Para introducir este tipo de variables tenemos varias opciones, una de ellas es crear una variable binaria para cada categoría. Por ejemplo, considere una variable x que indique sectores de la economía: a, b y c. En tal caso se crearían tres variables binarias, una para cada sector, y se utilizarían dos de estas en el modelo de regresión, de la misma manera que se verificó en el caso 1 (una menos al total de categorías creadas). En el caso de varias variables dummy, la interpretación sigue el hilo anterior, pero con la precaución de que al tener varios grupos representados (digamos g grupos) en estas variables, debemos agregar g-1 grupos a nuestro modelo, o estimarlo sin constante, para evitar la trampa de la variable binaria asociada a la multicolinealidad. 

Para ilustrar un ejemplo en donde se creen las variables, vamos a crear tres variables binarias asociadas al nivel educativo. Una forma sencilla de recodificar variables en R se obtiene la función recode del paquete car:

library(car) # para recode

educR<-recode(wage1$educ,"0:5='Elementar';6:12='Media';else='High'")
educR<-factor(educR)
D1<-model.matrix(~educR-1)
D1<-data.frame(educR,D1)

Una vez creadas las variables, la combinamos con la base de dato anterior:

wage1_d <- cbind(wage1,D1)

Ahora estimamos el modelo de regresión, de forma tal que de estas tres variables (g=3), solo ingresamos 2 categorías (g-1). Ahora tenemos varias variables dummy con el objetivo de representar información ordinal, su interpretación continúa siendo análoga a la usada en el caso 1, los coeficientes asociados a las variables educRMedia y educRHigh indican diferencias en entre el promedio condicional del salario en los grupos indicados por las variables, respecto al grupo de referencia o categoría omitida. Como se verifica, el nivel educativo medio no presenta (en promedio) diferencias salariales significativa respecto al grupo de referencia, contrario al nivel máximo, que si muestra diferencias significativas.

result2 <-  lm(wage~educRMedia+educRHigh+exper+I(exper^2)+tenure+services, data=wage1_d )
summary(result2)

Call:
  lm(formula = wage ~ educRMedia + educRHigh + exper + I(exper^2) + 
       tenure + services, data = wage1_d)

Residuals:
  Min      1Q  Median      3Q     Max 
-8.1728 -1.8342 -0.4623  1.2335 14.8286 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.4193509  1.1892332   1.194  0.23322    
educRMedia   1.3399581  1.1491717   1.166  0.24414    
educRHigh    3.6804020  1.1696739   3.147  0.00175 ** 
  exper        0.2334177  0.0373467   6.250 8.57e-10 ***
  I(exper^2)  -0.0051251  0.0008066  -6.354 4.60e-10 ***
  tenure       0.1534251  0.0221193   6.936 1.20e-11 ***
  services    -1.1412360  0.4566512  -2.499  0.01276 *  
  ---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.117 on 519 degrees of freedom
Multiple R-squared:  0.2959,    Adjusted R-squared:  0.2878 
F-statistic: 36.36 on 6 and 519 DF,  p-value: < 2.2e-16

Una alternativa al procedimiento anterior, que evita tener que crear una dummy para cada categoría, se obtiene indicándole a R que la variable recodificada (educR) es un factor (en caso de no haberla convertido antes, en este caso, como la habíamos convertido en una factor con anterioridad, pudiésemos introducirla directamente en la ecuación y R la reconocería automáticamente), note que en este caso, R omite por default una de las categorías para evitar el problema de multicolinealidad perfecta en el modelo.

# alternativa de estimación
result2a <-  lm(wage~factor(educR)+exper+I(exper^2)+tenure+services, data=wage1_d )
summary(result2a)

Residuals:
  Min      1Q  Median      3Q     Max 
-8.1728 -1.8342 -0.4623  1.2335 14.8286 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
(Intercept)         1.4193509  1.1892332   1.194  0.23322    
factor(educR)High   3.6804020  1.1696739   3.147  0.00175 ** 
  factor(educR)Media  1.3399581  1.1491717   1.166  0.24414    
exper               0.2334177  0.0373467   6.250 8.57e-10 ***
  I(exper^2)         -0.0051251  0.0008066  -6.354 4.60e-10 ***
  tenure              0.1534251  0.0221193   6.936 1.20e-11 ***
  services           -1.1412360  0.4566512  -2.499  0.01276 *  
  ---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.117 on 519 degrees of freedom
Multiple R-squared:  0.2959,    Adjusted R-squared:  0.2878 
F-statistic: 36.36 on 6 and 519 DF,  p-value: < 2.2e-16

Aquí hago un paréntesis para mostrar cómo crear una dummy para cada categoría en los casos en donde deseamos combinar un grupo de variables. Por ejemplo, sectores de la economía según condición de formalidad. Donde se necesitarían crear dos dummys para cada sector, según sean formales o informales, de forma tal, que, de tener 12 sectores, necesitaríamos 24 variables, y en caso de combinar categorías adicionales, aumentaría la cantidad de variables.

sector<-c("a","b","c","a","b","c","a","b","c")
mujer<-c(1,1,1,0,0,0,1,0,1)

categorias<-factor(paste(sector,mujer,sep=""))
dummysNew <- model.matrix(~categorias-1)

Podemos crear una función propia que resuma esta tarea, para evitar tener que repetir los códigos.

Para evitar tener que repetir este procedimiento siempre, podemos crear una función propia que nos ayude a crear variable dummy para todas las categorías, independientemente al número de variables especificadas.

creadummy_cateroria <- function(...) {
  categorias <- factor(paste(..., sep=""))
 
  #Imprimir un mensaje y un resultado al usar la función
  print("Categorías creadas")
  print(table(categorias))
 
  # Crear una dummy por categoría
  dummysNew <- model.matrix(~categorias-1)
  return(dummysNew)
}

User-written Functions (tomado de Quick-R)

myfunction <- function(arg1, arg2, ... ){
  statements
  return(object)
}

Usar la función creada

sector<-c("a","b","c","a","b","c","a","b","c")
mujer<-c(1,1,1,0,0,0,1,0,1)
sangre<-c("a+","a-","o-")

creadummy<-creadummy_cateroria(sector,mujer,sangre)
creadummy

Caso 3: Interacciones entre dos variables binarias

Las formas funcionales de los modelos nos permiten especificar que el efecto de una determinada variable depende del nivel de otra, al ingresar en nuestro modelo interacciones entre variables. En el caso de variables binarias, al ingresarla en el modelo de regresión permite obtener una prima entre grupos. Por ejemplo, considere deseamos verificar si el efecto de trabajar en el sector servicio es el mismo para hombres que para mujeres (repitiendo el modelo del caso 2), para esto, incluimos una interacción entre servicios y female

Note que ahora el efecto derivado de estar en el sector servicio, depende de si la persona es mujer o no. En decir, a partir de las siguientes esperanzas condicionales, los coeficientes nos muestran promedios salariales para grupos específicos. Ahora, pese a que al parecer las mujeres de la muestra ganan menos que lo hombres, a lo interno del sector servicios estas verifican mejores salarios respecto, al comparar las siguientes esperanzas condicionales.

result3 <-  lm(wage~educ+exper+I(exper^2)+tenure+services+female+I(services*female), data=wage1)
summary(result3)

Call:
  lm(formula = wage ~ educ + exper + I(exper^2) + tenure + services + 
       female + I(services * female), data = wage1)

Residuals:
  Min     1Q Median     3Q    Max 
-7.037 -1.680 -0.443  1.148 13.505 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -2.0059036  0.7126790  -2.815  0.00507 ** 
  educ                  0.5286622  0.0486863  10.859  < 2e-16 ***
  exper                 0.2038801  0.0344153   5.924 5.73e-09 ***
  I(exper^2)           -0.0040753  0.0007481  -5.448 7.91e-08 ***
  tenure                0.1303410  0.0206478   6.313 5.90e-10 ***
  services             -1.1910660  0.6857128  -1.737  0.08299 .  
female               -1.7983762  0.2710137  -6.636 8.15e-11 ***
  I(services * female)  0.5687815  0.8693211   0.654  0.51322    
---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.871 on 518 degrees of freedom
Multiple R-squared:  0.4037,    Adjusted R-squared:  0.3956 
F-statistic:  50.1 on 7 and 518 DF,  p-value: < 2.2e-16

Note, que, al tomar esperanzas condicionales, los coeficientes asociados a las variables binarias y sus interacciones muestran información sobre los salarios promedios por grupos:

1) mujer en sector servicio: b_0+b_services+b_female+b_(services*female); 
2) mujer fuera del sector servicio: b_0+b_female; 
3) hombre en sector servicio: b_0+b_services;
4) hombre fuera del sector servicio: b_0.

Finalmente, debe quedar claro que pudo obtenerse este resultado generando una variable con cuatro grupos: 
  
1) mujer en sector servicio; 
2) mujer fuera del sector servicio; 
3) hombre en sector servicio; 
4) hombre fuera del sector servicio,

y comparar los resultados entre grupos.

Caso 4: Interacciones entre 1 dummy y una variable cualitativa (Diferencial de pendiente)

Consideremos ahora que el efecto de un año adicional de educación depende de si la persona es mujer o no.  Para esto utilizamos una interacción entre ambas variables [I(educ*female)]. 

result4 <-  lm(wage~educ+I(educ*female)+exper+I(exper^2)+tenure+services+female+I(services*female), data=wage1)
summary(result4)

Call:
  lm(formula = wage ~ educ + I(educ * female) + exper + I(exper^2) + 
       tenure + services + female + I(services * female), data = wage1)

Residuals:
  Min      1Q  Median      3Q     Max 
-7.0552 -1.6491 -0.4107  1.1146 13.9782 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -2.6979640  0.8511412  -3.170  0.00162 ** 
  educ                  0.5827240  0.0607731   9.589  < 2e-16 ***
  I(educ * female)     -0.1399881  0.0943800  -1.483  0.13862    
exper                 0.2023252  0.0343915   5.883 7.24e-09 ***
  I(exper^2)           -0.0040311  0.0007478  -5.390 1.07e-07 ***
  tenure                0.1315638  0.0206404   6.374 4.08e-10 ***
  services             -1.2136838  0.6850896  -1.772  0.07706 .  
female               -0.0325891  1.2208829  -0.027  0.97871    
I(services * female)  0.4850802  0.8701477   0.557  0.57745    
---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.868 on 517 degrees of freedom
Multiple R-squared:  0.4062,    Adjusted R-squared:  0.397 
F-statistic: 44.21 on 8 and 517 DF,  p-value: < 2.2e-16

Verifique que el coeficiente asociado a la interacción es un diferencial de pendiente respecto al efecto de la educación sobre el salario, en función del sexo de las personas. En el caso de los hombres, el efecto es b_educ, mientras que en el caso de las mujeres es b_educ+I(educ * female). Como este segundo coeficiente es negativo, estaría apuntando que el efecto asociado a las mujeres (de tener un año adicional de educación) es menor al de los hombres (considere que en este ejemplo el coeficiente es no significativo, lo que indica que no parece existir en el modelo evidencia de que el efecto de la educación dependa del sexo de las personas).

En el caso anterior, dado que las pendientes son iguales, se está afirmando que los hombres ganan un salario superior al de las mujeres, en una magnitud fija, independientemente al nivel educativo. En caso de un coeficiente significativo, indicaría que las diferencias salariales entre hombres y mujeres dependería del nivel de estudio.

Caso 5. Se crean dummy por cada categoría de variables de forma agrupada

categorias<-factor(paste(wage1_d$educR,wage1_d$services,sep=""))
table(categorias)

Elementar0 Elementar1      High0      High1     Media0     Media1
5          3        195         17        273         33

# puedo crear una dummy por categoría (solo por mostrar)
dummysNew <- model.matrix(~categorias-1)

wage1_d<-cbind(wage1_d,categorias)
result5 <-  lm(wage~factor(categorias), data=wage1_d)
summary(result5)

Call:
  lm(formula = wage ~ factor(categorias), data = wage1_d)

Residuals:
  Min     1Q Median     3Q    Max
-5.365 -2.077 -1.016  1.215 17.445

Coefficients:
  Estimate Std. Error t value Pr(>|t|)  
(Intercept)                   3.23200    1.54892   2.087  0.03741 *
  factor(categorias)Elementar1  0.09467    2.52938   0.037  0.97016  
factor(categorias)High0       4.30318    1.56865   2.743  0.00629 **
  factor(categorias)High1       2.52565    1.76204   1.433  0.15235  
factor(categorias)Media0      1.84518    1.56304   1.181  0.23834  
factor(categorias)Media1      0.46194    1.66213   0.278  0.78118  
---
  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.463 on 520 degrees of freedom
Multiple R-squared:  0.1288,    Adjusted R-squared:  0.1205
F-statistic: 15.38 on 5 and 520 DF,  p-value: 4.055e-14

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...