26 feb 2021

Análisis del gráfico de dispersión en R

Borrador

El gráfico de dispersión permite estudiar relación y dependencia entre dos variables cuantitativas. Adicionalmente, permite identificar patrones, verificar valores extremos y clusters en los datos. En la presente entrada se muestra como estimarlos en R y como realizar lecturas sobre los mismos.


1. Relaciones entre variables

En el gráfico siguiente se muestra la relación entre el peso del auto (wt) y la cantidad de millas por galón (mpg) que brinda el vehículo. En tal sentido el gráfico permite caracterizar la relación entre variables a partir de: i) dirección, ii) forma y iii) fuerza. La dirección y forma se puede verificar a partir de la línea de regresión que mejor se ajuste a los datos, mientras la fuerza está asociada a la dispersión de los puntos alrededor de esta línea.

library(dplyr)
library(ggplot2)

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point() +
  theme_minimal()


Ahora bien, debemos tener pendiente que correlación no implica causalidad. En caso de una relación lineal entre las variables solo implica que el aumento (disminución) del valor de una variable, esta correspondido con un aumento (disminución) de la probabilidad de tener un mayor valor de la otra variable, no que está causando este movimiento.

2. Independencia en media

La función geom_smooth se utiliza para agregar la recta de regresión, donde cada punto encima de la recta se interpreta en términos de esperanzas condicionales E[y|x]. Por tanto, esta permite una inspección gráfica de la independencia en media, en el sentido de verificar si el promedio condicional de la variable y es o no constante a partir de diversos valores de x. En caso afirmativo (de ser independiente), la pendiente de esta recta será plana y se verifica independencia en media E[y|x]=E[y]. Otra posible interpretación de la recta se deriva de que su pendiente es igual al coeficiente de pendiente en el modelo de regresión lineal, por tanto, su signo lo obtiene de la covarianza entre las variables representadas, y muestra dirección de la relación entre las variables.

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point() +
  geom_smooth(method=lm, se=FALSE) +
  theme_minimal()

Este puede asumir una relación lineal o no, pero recuerde que el coeficiente de correlación solo captura relaciones lineales. Aunque la función descrita puede ajustarse para capturar posibles relaciones no lineales entre las variables. 

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point() +
  geom_smooth(se=FALSE) +
  theme_minimal()

3. Análisis condicional por grupos de variables

Ahora bien, hemos asumido la misma relación a lo interno de los diversos grupos de población. Sin embargo, y atendiendo a la paradoja de Simpson, es importante siempre condicional la relación a lo interno de las diversas características de nuestra población, esto para evitar incurrir en un análisis erróneo de las relaciones.

Para condicional estas relaciones en R se agregan las opciones Shape (forma del punto) y color para modificar el color a lo interno de los diversos grupos. En el siguiente ejemplo se condiciona la relación según la cantidad de cilindros. Note, que ahora la relación entre variables parece más lineal que cuando hacemos la inspección incondicional (sobre todas las observaciones). 

ggplot(mtcars, aes(x=wt, y=mpg, shape=factor(cyl), color=factor(cyl))) +
  geom_point() +
  geom_smooth(method=lm, se=FALSE, fullrange=TRUE) +
    theme_classic() +
  theme(legend.position="bottom")


Podemos comparar estas relaciones condicionales con la incondicional, para verificar la relación existente.

ggplot(mtcars, aes(x=wt, y=mpg, shape=factor(cyl), color=factor(cyl))) +
  geom_point() +
  geom_smooth(method=lm, se=FALSE) +
  stat_smooth(aes(group = 1), method = "lm", se = FALSE) +
  theme_classic() +
  theme(legend.position="bottom")


4. Formas funcionales del modelo de regresión

Hasta aquí ya tenemos herramientas para verificar la posible asociación entre dos variables, así como la característica de esta relación condicionada a diversos grupos de nuestra población, en términos del análisis de regresión esta son herramientas básicas para poder identificar formas funcionales. Llanamente, la forma asumida por el gráfico de dispersión, especialmente cuando se ha condicionado a diversas variables, arroja luz sobre la adecuada forma que deben incluirse o modelarse las relaciones entre variables en el modelo de regresión.

Por ejemplo, la no linealidad está sugiriendo la especificación de modelos cuadráticos. Mientras que los diferenciales de pendientes en las relaciones observadas a partir de las rectas de regresión en la figura anterior, sugieren interacciones entre las variables que deben modelarse incluyendo interacciones en el modelo.  

5. Relación por quintiles

En la parte 4 vimos que las relaciones pueden cambiar a lo interno de diverisos grupos de la poblacion, pero además estos cambios en la relación entre dos variables pueden darse en función del nivel de una misma variable. 

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_jitter(width = .5, size=1) +
  stat_quantile(quantiles = c(0.05, 0.5, 0.95)) +
  theme_classic() 


También podemos segmentar el análisis condicional a los diversos sub grupos.

ggplot(mtcars, aes(x=wt, y=mpg, shape=factor(cyl), color=factor(cyl))) +
  geom_point() +
  stat_quantile(quantiles = c(0.05, 0.5, 0.95)) +
  theme_classic() 


6. Clasificación o clusters 

La función stat_ellipse permite la clasificación de grupos.

ggplot(mtcars, aes(x=wt, y=mpg, shape=factor(cyl), color=factor(cyl))) +
  geom_point() +
   theme_classic() +
  theme(legend.position="bottom") +
  stat_ellipse(type = "norm") +
  scale_color_brewer(palette="Dark2")

7. Un parentesis en el caso del gráfico de dispersión en series temporales

Una nota al margen de mucha importancia en el caso de trabajar con series temporales, es que la correlación se hace bajo supuesto de independencia en las series (también de normalidad), por esto, en el caso de series temporales se suelen estudiar la asociación entre alguna transformación de las series de precio original, tal como la data de crecimiento o la primera diferencia en logaritmo. Series que se suponen estacionales.

library(ggfortify)
diff(log(EuStockMarkets[,"DAX"]), differences=1) %>%
autoplot() +
theme_minimal()

Nota como se obtienen las tasas de variación de todas las variables en la data, para posteriormente obtener el coeficiente de correlación. La función across se explica en una entrada anterior.

library("GGally")

tasaData <- EuStockMarkets %>% as.data.frame() %>%

  mutate(
    across(everything(),
           ~((./dplyr::lag(.)-1)*100),
           .names= "tc_{.col}"
  )) %>%
 select(starts_with("tc"))

head(tasaData)

##       tc_DAX     tc_SMI     tc_CAC    tc_FTSE
## 1         NA         NA         NA         NA
## 2 -0.9283193  0.6197485 -1.2578971  0.6793256
## 3 -0.4412412 -0.5863192 -1.8566124 -0.4877652
## 4  0.9044450  0.3276540 -0.5762515  0.9067887

tasaData %>%
  ggpairs()


8. Identificar valores atipicos 

***

Referencias

             Balentyne, P. and Mindrila, D. (s.f.d). Scatterplots and Correlation.

             Sthda (s.f.d). ggplot2 scatter plots : Quick start guide - R software and data visualization.

             Sthda (s.f.d). GGally R package: Extension to ggplot2 for correlation matrix and survival plots - R software and data visualization.

             Sthda (s.f.d). Correlation Test Between Two Variables in R.



 

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