- 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
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
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
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
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)
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))