9 Correlacion

9.1 Simple

pacman::p_load(tidyverse, GGally, correlation, ggcorrplot, viridis)

GGally

iris %>% 
  ggpairs()

correlation

correlation (del ecosistema easystats)

iris_corr <- iris %>% 
  correlation(method = "pearson") #spearman
iris_corr
iris_corr %>%  
  ggplot() + 
  aes(x=Parameter1, Parameter2, fill= r)+
  geom_tile()
iris_corr %>%  
  ggplot(aes(x=fct_relevel(Parameter1, "Sepal.Length", after = 2), 
             y=fct_relevel(Parameter2, "Petal.Width"), 
             fill= r)) + 
  geom_tile() + 
  scale_fill_viridis(discrete=FALSE, direction = -1) + 
  labs(x="", y="") + 
  geom_text(aes(label=r %>% round(2)), col="white") +
  coord_flip()+
  theme_minimal()

ggcorrplot

iris %>% 
  select_if(is.numeric) %>% 
  cor() %>% 
  round(2) %>%
  ggcorrplot(hc.order = TRUE, type = "lower", lab = TRUE)

9.2 Multi-level

iris %>% 
  ggpairs(aes(color = Species))
iris_corr_sp <- iris %>%
  group_by(Species) %>%
  correlation() # %>% 

iris_corr_sp # %>% knitr::kable()

Es aqui donde pasa el investigador al frente del analista a interpretar los patrones

Veamos un ejemplo clasico multi-level: Simpson’s paradox

simpson <- simulate_simpson(n = 100, groups = 10)
simpson

simpson %>% 
  ggplot()+ 
  aes(x = V1, y = V2) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
correlation(simpson)
simpson %>% 
  ggplot() +
  aes(x = V1, y = V2, col = Group) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  geom_smooth(colour = "black", method = "lm", se = FALSE)

Parece que, para cada sujeto, la relación es diferente. La tendencia negativa (global) parece ser un producto de las diferencias entre los grupos y podría ser espuria

Las correlaciones multinivel (como en multigrupo) nos permiten dar cuenta de las diferencias entre grupos. Se basa en una parcialización del grupo, ingresada como efecto aleatorio en una regresión lineal mixta.

Puede calcularlos con el paquete de correlaciones configurando el argumento multinivel en VERDADERO.

simpson %>% 
  group_by(Group) %>% 
  correlation()

simpson %>% 
  correlation(multilevel = TRUE)

Ojo con las correlaciones!

anscombe_long <- rio::import('https://docs.google.com/spreadsheets/d/1c_FXVNkkj4LD8hVUForaaI24UhRauh_tWsy7sFRSM2k/edit#gid=1709959158')

anscombe_long %>% 
  group_by(set) %>% 
  summarise(x_mean = mean(x), 
            y_mean = mean(y), 
            x_sd = sd(x), 
            y_sd = sd(y))
anscombe_long %>% 
  group_by(set) %>% 
  correlation(method = "pearson")
anscombe_long %>% 
  ggplot() + 
  aes(x, y) + 
  geom_point() + 
  geom_smooth(method="lm")+ 
  facet_wrap("set")

Conclusion: SIEMPRE plotear los datos crudos y los residuos

Como pasar “anscombe” de wide a long

data(anscombe)

anscombe_long <- anscombe %>%
  pivot_longer(
    cols = everything(),
    # apilar solo el valor en la columna "set"
    names_to = c(".value", "set"),
    # indico que las columnas que estoy apilando tienen su primer digito con el nombre de una variable y el segundo digito con el nro de set
    names_pattern = "(.)(.)"
  ) %>% 
  arrange(set, x)