9 Correlacion
9.1 Simple
::p_load(tidyverse, GGally, correlation, ggcorrplot, viridis) pacman
GGally
%>%
iris ggpairs()
correlation
correlation (del ecosistema easystats)
<- iris %>%
iris_corr 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 %>%
iris_corr_sp group_by(Species) %>%
correlation() # %>%
# %>% knitr::kable() iris_corr_sp
Es aqui donde pasa el investigador al frente del analista a interpretar los patrones
Veamos un ejemplo clasico multi-level: Simpson’s paradox
<- simulate_simpson(n = 100, groups = 10)
simpson
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!
<- rio::import('https://docs.google.com/spreadsheets/d/1c_FXVNkkj4LD8hVUForaaI24UhRauh_tWsy7sFRSM2k/edit#gid=1709959158')
anscombe_long
%>%
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 %>%
anscombe_long 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)