Relación entre variables numéricas

En este apartado aprenderemos a analizar la asociación entre dos variables numéricas. Hay cuatro tipos de asociaciones y cada una se analiza con una técnica diferente:

  • Tabla de contingencia: Entre dos variables categóricas.
  • Diferencia de medias: Entre una variable categórica independiente y una numérica dependiente.
  • Regresión logística: Entre una variable numérica independiente y una categórica dependiente.
  • Regresión: Entre dos variables numéricas.

Este apartado se construye a partir de los apartados anteriores, donde hemos explorado los paquetes unvotes (Voeten 2017) y la Democracy Dataset (DD) (Cheibub, Gandhi, and Vreeland 2010). A continuación añadiremos indicadores de World Development Indicators (WDI) y el paquete gapminder.

#recordad que los paquetes deben estar previamente instalados
library(dplyr)
library(tidyr)
library(ggplot2)
library(readr)
library(gapminder)
library(wbstats)
library(unvotes)

Cuando queramos mirar la asociacion entre dos variables numéricas utilizaremos la regresión. En primer Lugar explicaremos una regresión simple y más adelante veremos la regresión múltiple.

Regresión simple

Hay cinco aspectos principales que nos pueden interesar de la relación entre dos variables numéricas:

  • Forma: El dibujo que hace la relación entre x e y.
  • Fuerza: Como de perfecto es el dibujo formado por puntos.
  • Dirección: Si las variables se mueven en la misma dirección (relación positiva) o en dirección opuesta (negativa).
  • Significación: La probabilidad de que realmente la relación sea inexistente.
  • Casos extremos: Si algunas observaciones están muy alejadas del resto.

En este apartado queremos mirar cómo es la asociación entre el PIB per capita y la esperanza de vida después de la Guerra Fría. Para ello utilizaremos una versión simplificada de gapminder. Eliminaremos también un caso extremo.

gap90 <- gapminder %>%
  filter(year > 1990, lifeExp > 25) #eliminamos un caso extremo

CASOS EXTREMOS: En ocasiones algunos casos están muy alejados del resto de valores de la distribución y podemos considerar eliminarlos porque, pensamos, pueden venir explicados por otros factores muy distintos. Cuál es el caso extremo que hemos eliminado?

gapminder[which(gapminder$lifeExp < 25),]

Visualizar

La manera de visualizar una relación entre variables numéricas es por medio de un diagrama de dispersión, que llamaremos por medio de la geometría geom_point(). La relación que tienen los puntos entre sí nos la indicará la recta de regresión, que es la línea recta que pasa lo más cerca posible de todos los puntos. La llamaremos con geom_smooth(method ="lm").

gap90 %>%
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point(aes(col = continent), alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE) +
  theme_minimal() +
  theme(legend.position = "bottom", legend.title = NULL)

Tened en cuenta que con esta visualización sabemos que:

  • La forma no es lineal.
  • Es una relación positiva y fuerte.
  • Podríamos considerar que algunos países africanos son casos extremos.

La recta de regresión también se llama recta OLS (Ordinary Least Squares). Otro tipo de recta es la loess (locally Estimated Scatterplot Smoothing), que podemos llamar si no introducimos ningún argumento dentro de geom_smooth().

Cuantificar

Aunque visualmente ya nos podemos hacer una idea de la fuerza, la dirección e incluso de la significación de una relación, nos será mucho más fácil comparar relaciones si obtenemos estos parámetros de forma numérica.

  1. El coeficiente de correlación es un número que varía entre -1 a 1 y se obtiene a través de la función cor(). El signo muestra si la relación es positiva o negativa. La proximidad con 1 nos indica la fuerza de la relación.

Podemos obtener el coeficiente de correlación entre dos variables numéricas, por ejemplo, indicando cor(gap90$gdpPercap, gap90$lifeExp). Una forma más sofisticada para obtener y comparar múltiples coeficientes es la siguiente:

gapminder %>% 
  filter(year %in% c(1957, 1967, 1977, 1977, 1987, 1997, 2007), 
         continent %in% c("Europe", "Africa", "Americas")) %>%
  group_by(continent, year) %>% 
  summarize(cor = cor(lifeExp, gdpPercap), 
            N = n()) %>%
  spread(year, cor)
continent N 1957 1967 1977 1987 1997 2007
Africa 52 0.2589616 0.2490682 0.3478392 0.6277603 0.5643816 0.3847152
Americas 25 0.6232590 0.6066095 0.5912833 0.6174131 0.6054986 0.5909661
Europe 30 0.7389486 0.7135078 0.7342168 0.7291457 0.8275159 0.8499711
  1. El coeficiente de determinación, también llamado R2, es un número que varía entre 0 y 1 y nos indica qué proporción de la variación en la variable dependiente podemos explicar con la variación de los valores de la variable independiente . Se obtiene, simplemente, elevando el cuadrado el coeficiente de correlación.
cor(x, y)^2

Modelar

Modelar significa crear una fórmula a partir de los datos existentes que nos permita predecir el valor de una variable si conocemos el valor de la otra variable. De hecho, ya hemos visto un modelo anteriomente: la recta OLS. Con esta recta podemos predecir los valores de y si conocemos los valores de x.

Para crear un modelo lineal necesitamos saber:

  • La constante: El valor de y cuando x es cero.
  • La inclinación: Cuanto crece o decrece y si aumentamos x en una unidad.

Podemos conocer estos valores con la fórmula lm(formula = y ~ x, data = dataframe) y luego pedir un summary(). Probemos con un modelo en el que la variable dependiente sea la esperanza de vida y la independiente el PIB per cápita:

summary(lm(formula = lifeExp ~ gdpPercap, data = gap90))
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = gap90)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -22.699  -5.740   1.236   6.764  14.119 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5.835e+01  4.741e-01  123.08   <2e-16 ***
## gdpPercap   7.395e-04  3.239e-05   22.83   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.435 on 565 degrees of freedom
## Multiple R-squared:  0.4799, Adjusted R-squared:  0.479 
## F-statistic: 521.3 on 1 and 565 DF,  p-value: < 2.2e-16

En los resultados observamos lo siguiente:

  • Constante: En un hipotético país con el PIB per cápita igual a cero, la esperanza de vida sería de 58.35 años (nos movemos en términos hipotéticos, ya sabemos que es imposible que haya un país donde el ingreso medio sea igual a cero).
  • Pendiente: Cuando aumentamos el PIB per cápita en una unidad (por lo tanto, aumentamos un dolar), la esperanza de vida crece 0.0007395 años.
  • Significación: La relación es estadísticamente significativa, tal como nos muestra el p-valor (Pr(>|t|)) de <2e-16 (también nos lo muestran los tres asteriscos).
  • Determinación: Sabiendo el PIB per cápita de un país, tenemos un 48% de probabilidades de acertar su esperanza de vida. Lo vemos en la Multiple R-squared.
  • Modelo: De acuerdo con los parámetros que hemos obtenido, el modelo predictivo de la esperanza de vida en base a los valores del PIB per cápita es el siguiente:
x <- 0
5.835e+01 + 7.395e-04 * x

Es importante remarcar que el PIB per capita tiene una distribución asimetrica y, por tanto, mejoraríamos el modelo si aplicásemos el logaritmo. No obstante, para facilitar la interpretación de los datos, en este ejercicio no lo hemos aplicado.

Regresión múltiple

Una regresión múltiple es, en corto, un modelo de regresión con varias variables independientes. En la función lm() sólo necesitamos añadir la variable z y tantas variables como sean necesarias.

summary(lm(formula = y ~ x + z, data = model))

La hipótesis que queremos comprobar es que ser una democracia (x) tiene un efecto negativo sobre el voto afirmativo a la AGNU (y). Pensamos, sin embargo, que esta afirmación puede estar condicionada por:

  • El nivel de desarrollo del país (w).
  • La proporción de democracias en la asamblea general (z).

En primer lugar, preparamos los datos:

  1. WDI: Obtenemos información del PIB per cápita anual a partir de 1946 (recordemos que gapminder sólo podemos saber el PIB per cápita cada cinco años) a través del paquete wbstats (Piburn 2020).
wbstats::wbsearch("gdp per capita.*constant")
##                indicatorID                                            indicator
## 7988        NY.GDP.PCAP.KN                        GDP per capita (constant LCU)
## 7989     NY.GDP.PCAP.KD.ZG                     GDP per capita growth (annual %)
## 7990        NY.GDP.PCAP.KD                   GDP per capita (constant 2010 US$)
## 8707  NY.GDP.PCAP.PP.KD.ZG                GDP per capita, PPP annual growth (%)
## 8708  NY.GDP.PCAP.PP.KD.87  GDP per capita, PPP (constant 1987 international $)
## 8709     NY.GDP.PCAP.PP.KD  GDP per capita, PPP (constant 2011 international $)
## 10718   6.0.GDPpc_constant GDP per capita, PPP (constant 2011 international $) 
## 10723       5.51.01.10.gdp                                Per capita GDP growth
gdp_wb <- wb(indicator = "NY.GDP.PCAP.PP.KD", startdate = 1946, enddate = 2018)
gdp_wdi <- gdp_wb %>%
  transmute(iso2c, year = as.numeric(date), 
            country, NY.GDP.PCAP.PP.KD = value) %>%
  as_tibble()
  1. UN Votes: Obtenemos información del porcentaje de votos afirmativos de cada país y, más adelante, de la proporción anual de votos favorables a la AGNU.
  2. DD Dataset: Obtener información binaria de la presencia de democracia en cada país.
# Obtenemos el porcentaje de votos favorables de cada país
un_year_vote <- un_roll_calls %>% 
  separate(date, "year", extra = "drop") %>% 
  inner_join(un_votes) %>%
  mutate(year = as.numeric(year),
         vote = if_else(vote == "yes", 1, 0)) %>%
  group_by(country, country_code, year) %>% 
  summarize(vote = mean(vote))

# Añadimos el marco de datos DData con el indicador dicotómico de democracia 
un_vote_dem <- un_year_vote %>%
  inner_join(DDdata, by = c("country_code" = "iso2c", "year" = "year")) %>%
  select(country = country.x, country_code, year, vote, democracy)

# Obtenemos la proporción anual de votos favorables en la AGNU 
un_prop <- un_vote_dem %>% 
  group_by(year) %>% 
  summarize(unga_prop = mean(democracy))

#Añadimos los datos de PIB per cápita de WDI
un_wdi <- un_vote_dem %>%
  left_join(un_prop, by = "year") %>%
  inner_join(gdp_wdi, by = c("country_code" = "iso2c", "year" = "year")) %>%
  select(country = country.x, year, vote, democracy, 
         gdpcap = NY.GDP.PCAP.PP.KD, unga_prop) %>%
  filter(gdpcap != is.na(gdpcap))

El marco de datos un_wdi nos queda de la siguiente manera:

country_code country year vote democracy gdpcap unga_prop
AF Afghanistan 2008 0.9722222 0 1484.115 0.6137566
AL Albania 2008 0.6533333 1 9944.233 0.6137566
DZ Algeria 2008 0.9054054 0 10796.901 0.6137566
AO Angola 2008 0.9436620 0 7864.375 0.6137566
AG Antigua and Barbuda 2008 0.9324324 1 23130.553 0.6137566
AR Argentina 2008 0.8684211 1 23103.456 0.6137566
AM Armenia 2008 0.7702703 1 10467.519 0.6137566
AU Australia 2008 0.5394737 1 44974.526 0.6137566
AT Austria 2008 0.6578947 1 53259.411 0.6137566
AZ Azerbaijan 2008 0.9066667 0 12903.152 0.6137566
BS Bahamas 2008 0.9014085 1 38746.671 0.6137566
BH Bahrain 2008 0.8684211 0 46408.999 0.6137566
BD Bangladesh 2008 0.9200000 0 2659.049 0.6137566
BB Barbados 2008 0.9189189 1 16946.671 0.6137566
BY Belarus 2008 0.8513514 0 15942.898 0.6137566
BE Belgium 2008 0.6315789 1 48577.204 0.6137566
BZ Belize 2008 0.9365079 1 7339.481 0.6137566
BJ Benin 2008 0.9264706 1 2738.192 0.6137566
BT Bhutan 2008 0.8985507 1 6995.758 0.6137566
BO Bolivia (Plurinational State of) 2008 0.9189189 1 6351.228 0.6137566

A continuación creamos el modelo de regresión con las variables correspondientes y pedimos el sumario:

summary(lm(formula = vote ~ democracy + gdpcap + unga_prop, data = un_wdi))
## 
## Call:
## lm(formula = vote ~ democracy + gdpcap + unga_prop, data = un_wdi)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.91942 -0.07608  0.01801  0.10558  0.36672 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.696e-01  4.985e-02  19.451   <2e-16 ***
## democracy   -9.865e-02  5.301e-03 -18.610   <2e-16 ***
## gdpcap      -2.643e-06  1.430e-07 -18.483   <2e-16 ***
## unga_prop   -8.598e-02  8.802e-02  -0.977    0.329    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1431 on 3113 degrees of freedom
## Multiple R-squared:  0.2155, Adjusted R-squared:  0.2148 
## F-statistic: 285.1 on 3 and 3113 DF,  p-value: < 2.2e-16

Observando los resultados, llegamos a las siguientes conclusiones:

  • Ser una democracia (x) tiene un efecto negativo y significativo sobre el voto afirmativo a la AGNU (y) incluso cuando controlamos por las dos variables alternativas.
  • El nivel de desarrollo del país (w) también afecta de manera negativa y significativa el voto favorable a la AGNU.
  • En cambio, la proporción de democracias en la asamblea (z) no parece afectar el voto favorable a la AGNU.
  • Si conocemos los valores de las variables independientes tenemos un 21% de probabilidades de acertar la variable dependiente (ciertamente, no es un porcentaje muy elevado, por el que haríamos bien en buscar otras variables que nos proporcionen un modelo mejor).

Referencias

Cheibub, José Antonio, Jennifer Gandhi, and James Raymond Vreeland. 2010. “Democracy and Dictatorship Revisited.” Public Choice 143 (2-1): 67–101.

Piburn, Jesse. 2020. Wbstats: Programmatic Access to the World Bank Api. Oak Ridge, Tennessee: Oak Ridge National Laboratory. https://doi.org/10.11578/dc.20171025.1827.

Voeten, Erik. 2017. “Data and Analyses of Voting in the UN General Assembly.” In Routledge Handbook of International Organization, edited by Bob Reinalda. London: Routledge.

Previous
Next