17 sept 2021

Creando variables dummy en R

- 1.1. Crear variables dummy 

Las variables dummy o vectores lógicos corresponden a variables que asumen, al menos en su versión más elemental, valores 0 y 1, siendo el valor de 1 el asumido por la variable en casos donde que el valor lógico sea positivo (es decir, se cumpla la condición que estamos imponiendo) y 0 en el caso contrario. Para el siguiente ejemplo vamos a simular una base de datos hipotética:

 provincia <- c("Ocoa", "Azua", "Bani", "Ocoa")

edad <- c(12,21,16,33)

my_data <- data.frame(provincia,edad)

attach(my_data)

 

my_data

provincia edad

1      Ocoa   12

2      Azua   21

3      Bani   16

4      Ocoa   33

 La manera más sencilla de generar una variable dummy (al menos para mí), es utilizando los operadores lógicos y relacionales. Note que al verificar si la edad de un grupo de individuos de mis datos supera los 18 años, vamos a obtener un vector lógico de valores TRUE y FALSE, correspondiente a las observaciones donde se cumple la observación y donde no.

 edad > 18

[1] FALSE  TRUE FALSE  TRUE

La representación numérica de dicho vector se obtiene mediante las funciones: if_else(), as.numeric() o multiplicando por 1 la operación lógica evaluada (esta es mi forma favorita).

 my_data$dummy1 <- (provincia == "Ocoa")*1

 my_data

  provincia edad dummy1

1      Ocoa   12      1

2      Azua   21      0

3      Bani   16      0

4      Ocoa   33      1

La ventaja de usar la función if_else() es que permite asignar categorías directamente sobre la variable creada, aunque a esto es preferible convertir la variable dummy1 en un vector. Los anterior porque si intentamos aplicar alguna operación matemática, como la suma de dicho vector, R nos va a regresar un error.

 if_else(provincia == "Ocoa", "ocoeno", "otro")

[1] "ocoeno" "otro"   "otro"   "ocoeno"

Entonces, en caso de querer colocar etiquetas sobre la variable que acabamos de crear debemos mejorar el nombre, es decir, dummy1 es un nombre poco descriptico, es siempre preferible colocar ocoeno como nombre, dado que hace referencia al grupo que asume el valor de 1. La segunda alternativa es crear un vector un vector tipo factor.

 factor(my_data$dummy1, labels = c("otros", "ocoa"))

[1] ocoa  otros otros ocoa

Levels: otros ocoa

 - 1.2. Crear variables dummy a partir de dos o más condiciones

También, podemos combinar las condiciones lógicas anidada, por ejemplo, identificar individuos de dos provincias. Note que lo siguiente es equivalente a usar el operador lógico o (|):

 my_data$dummy2 <- (provincia %in% c("Ocoa","Bani"))*1

 my_data

provincia edad dummy1 dummy2

1      Ocoa   12      1      1

2      Azua   21      0      0

3      Bani   16      0      1

4      Ocoa   33      1      1

También, podemos combinar operadores lógicos con operadores relacionales, para pedir condiciones asociadas a dos o más variables distintas. Por ejemplo, menores de edad nacidos en Ocoa:

 my_data$dummy3 <- (provincia %in% c("Ocoa","Bani") & edad > 18)*1

 my_data

  provincia edad dummy1 dummy2 dummy3

1      Ocoa   12      1      1      0

2      Azua   21      0      0      0

3      Bani   16      0      1      0

4      Ocoa   33      1      1      1

Aunque existen casos en donde las dos opciones están referidas a una misma variable, como es el ejemplo anterior, podemos tener casos donde las condiciones lógicas estén asociadas a mas de una variable, por ejemplo, personas con edades comprendidas entre 15 y 25:

 my_data$dummy4 <- (edad >= 15 & edad <= 25)*1

my_data

 provincia edad dummy1 dummy2 dummy3 dummy4

1      Ocoa   12      1      1      0      0

2      Azua   21      0      0      0      1

3      Bani   16      0      1      0      1

4      Ocoa   33      1      1      1      0

 - 1.3. Crear variables categóricas

Existen dos opciones que se repiten con mucha frecuencia cuando necesitamos trabajar con variables dummys, en primer lugar es usual estar interesados en crear una variable dummy para cada categoría. En el ejemplo que estamos usando, tenemos la variable provincia, por lo que, podemos estar interesados en generar una variable binaria que asuma el valor de 1 para el nacido en cada provincia, por lo que, crearemos tantas dummys como categorías en nuestra base de datos.

varsDummy <- model.matrix( ~provincia-1, data = my_data)

my_data <- cbind(my_data,varsDummy)

 my_data

provincia edad dummy1 dummy2 dummy3 dummy4 provinciaAzua provinciaBani provinciaOcoa

1      Ocoa   12      1      1      0      0             0             0             1

2      Azua   21      0      0      0      1             1             0             0

3      Bani   16      0      1      0      1             0             1             0

4      Ocoa   33      1      1      1      0             0             0             1

La segunda alternativa que nos suele interesar con frecuencia al trabajar con variables con diversas categorías, es colocar un id a cada una de las categorías expresadas como texto, sería una especie de recodificación de la variable:

library(dplyr)

my_data$id_new <- group_indices(my_data, provincia)

 

my_data

  provincia edad dummy1 dummy2 dummy3 dummy4 provinciaAzua provinciaBani provinciaOcoa id_new

1      Ocoa   12      1      1      0      0             0             0             1      3

2      Azua   21      0      0      0      1             1             0             0      1

3      Bani   16      0      1      0      1             0             1             0      2

4      Ocoa   33      1      1      1      0             0             0             1      3

#alternativa

my_data %>%

mutate(id = rownames(provincia))

Adicionalmente podemos asignar directamente dichas categorías, para asignar los números de forma arbitraria, esto usando la indexación lógica, el ejemplo que dejo es mejo chapucero, seguro en internet habrán mejores opciones:

id_manual <- c()

id_manual[provincia  == "Ocoa"] <- 1

id_manual[provincia  == "Bani"] <- 2

id_manual[provincia  == "Azua"] <- 3

id_manual

 #

# Obtener nombres de las categorías

names(table(provincia)) 

Recesión plot en R usando ggplot (recession plot in r)

En el siguiente ejemplo se simular y replica -parcialmente- un ejemplo usado por el FMI para ilustrar la importancia del uso de series de ti...