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_corriris_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)