Relación entre 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)
continentN195719671977198719972007
Africa520.25896160.24906820.34783920.62776030.56438160.3847152
Americas250.62325900.60660950.59128330.61741310.60549860.5909661
Europe300.73894860.71350780.73421680.72914570.82751590.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::wb_search("gdp per capita.*constant")
## # A tibble: 7 x 3
##   indicator_id    indicator                indicator_desc                       
##   <chr>           <chr>                    <chr>                                
## 1 5.51.01.10.gdp  Per capita GDP growth    GDP per capita is the sum of gross v…
## 2 6.0.GDPpc_cons… GDP per capita, PPP (co… GDP per capita based on purchasing p…
## 3 NY.GDP.PCAP.KD  GDP per capita (constan… GDP per capita is gross domestic pro…
## 4 NY.GDP.PCAP.KD… GDP per capita growth (… Annual percentage growth rate of GDP…
## 5 NY.GDP.PCAP.KN  GDP per capita (constan… GDP per capita is gross domestic pro…
## 6 NY.GDP.PCAP.PP… GDP per capita, PPP (co… GDP per capita based on purchasing p…
## 7 NY.GDP.PCAP.PP… GDP per capita, PPP ann… Annual percentage growth rate of GDP…
gdp_wb <- wb_data(indicator = "NY.GDP.PCAP.PP.KD", start_date = 1946, end_date = 2018)
gdp_wdi <- gdp_wb %>%
  transmute(iso2c, year = as.numeric(date), 
            country, gdpcap = NY.GDP.PCAP.PP.KD) %>%
  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, unga_prop) %>%
  filter(gdpcap != is.na(gdpcap))

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

country_codecountryyearvotedemocracygdpcapunga_prop
AFAfghanistan20080.972222201484.1140.6137566
ALAlbania20080.653333319912.5770.6137566
DZAlgeria20080.9054054010796.9030.6137566
AOAngola20080.943662007864.3750.6137566
AGAntigua and Barbuda20080.9324324123131.5780.6137566
ARArgentina20080.8684211123103.4570.6137566
AMArmenia20080.7702703110467.5300.6137566
AUAustralia20080.5394737144835.3610.6137566
ATAustria20080.6578947153089.8760.6137566
AZAzerbaijan20080.9066667012903.1520.6137566
BSBahamas20080.9014085138746.7840.6137566
BHBahrain20080.8684211046408.8320.6137566
BDBangladesh20080.920000002659.0490.6137566
BBBarbados20080.9189189116946.6710.6137566
BYBelarus20080.8513514015942.8980.6137566
BEBelgium20080.6315789148422.5780.6137566
BZBelize20080.936507917426.8910.6137566
BJBenin20080.926470612738.1940.6137566
BTBhutan20080.898550716995.7790.6137566
BOBolivia (Plurinational State of)20080.918918916351.2260.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.91949 -0.07551  0.01963  0.10436  0.35445 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.011e+00  4.971e-02  20.337   <2e-16 ***
## democracy   -9.609e-02  5.264e-03 -18.254   <2e-16 ***
## gdpcap      -2.579e-06  1.421e-07 -18.153   <2e-16 ***
## unga_prop   -1.600e-01  8.779e-02  -1.822   0.0685 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1418 on 3092 degrees of freedom
## Multiple R-squared:  0.2115, Adjusted R-squared:  0.2108 
## F-statistic: 276.5 on 3 and 3092 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