#install.packages("lterdatasampler", repos = "http://cran.us.r-project.org")
#remotes::install_github("lter/lterdatasampler")
Introducción a exploratorios
Para esta clase emplearemos la paquetería lterdatasampler
la cual tiene como objetivo proporcionar subconjuntos de datos medioambientales útiles para la enseñanza y la formación en ciencia de datos.
Instalación paquetería
Podemos instalar la paquetería desde CRAN o la versión en desarrollo en GitHub
Relaciones Univariadas
Emplearemos los datos del cangrejo violinista (Minuca pugnax) en marismas de Florida a Massachusetts durante el verano de 2016 en la isla Plum.
library(lterdatasampler)
library(tidyverse)
library(ggrepel)
library(ggridges)
library(patchwork)
Primero exploraremos la tabla de datos, y observaremos las medias, mínimos, máximos….
mean(crab)
<- pie_crab %>% select(where(is.numeric))
crab summary(crab)
latitude size air_temp air_temp_sd
Min. :30.00 Min. : 6.64 Min. :10.29 Min. :6.391
1st Qu.:34.00 1st Qu.:12.02 1st Qu.:12.05 1st Qu.:8.110
Median :39.10 Median :14.44 Median :13.93 Median :8.410
Mean :37.69 Mean :14.66 Mean :15.20 Mean :8.654
3rd Qu.:41.60 3rd Qu.:17.34 3rd Qu.:18.63 3rd Qu.:9.483
Max. :42.70 Max. :23.43 Max. :21.79 Max. :9.965
water_temp water_temp_sd
Min. :13.98 Min. :4.838
1st Qu.:14.33 1st Qu.:6.567
Median :17.50 Median :6.998
Mean :17.65 Mean :7.252
3rd Qu.:20.54 3rd Qu.:7.865
Max. :24.50 Max. :9.121
Podemos centrarnos en una única variable
summary(crab$size)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6.64 12.02 14.44 14.66 17.34 23.43
Boxplot
Boxplot básico
boxplot(crab$size, range=1.5, ylab="Size")
<- stack(crab) crab2
filter(crab2, ind == "size") %>% #selecciono variable que me importa
ggplot(aes(x= ind, y= values))+ # Creo la capa de datos
geom_boxplot(outlier.color = "red", #color de outlier
fill= "gray")+ # color de la caja
# geom_text(aes(label= values), position = position_dodge2(0.3))+
labs(title = " Boxplot de tamaño",
y= " Valores",
x= "")+
theme_classic()
Una buena regla de dedo para identificar datos atípicos es: que los puntos que caen mas allá del 3er+1.5*(intercuartil) o mas bajo que 1er-1.5*(intercuartil) son valores atípicos.
Ejemplo:
<- 17.34-12.02
iqsize <-(12.02-(iqsize*1.5))
atip_inf atip_inf
[1] 4.04
<- (17.34+(iqsize*1.5))
atip_sup atip_sup
[1] 25.32
boxplot(crab)
boxplot(log(crab+1))
En ggplot tenemos que usar la base de datos que tenemos en formato “long”
ggplot(crab2, aes(x= ind, y= values, fill= ind))+ # Creo la capa de datos
geom_boxplot(outlier.color = "red") # color outlier
# geom_text(aes(label= values), position = position_dodge2(0.3))+
labs(title = " Boxplot de tamaño",
y= " Valores",
x= "")+
theme_classic()#+
NULL
# theme(legend.position ="none") # leyendas variable
ggplot(crab2, aes(x= ind, y= log(values+1), fill= ind))+ # Creo la capa de datos
geom_boxplot(outlier.color = "red", notch = TRUE) # color outlier
# geom_text(aes(label= values), position = position_dodge2(0.3))+
labs(title = " Boxplot de tamaño",
y= " Valores",
x= "")+
theme_classic()#+
NULL
# theme(legend.position ="none") # leyendas variable
ggplot(crab2, aes(x=ind, y= log(values+1), fill=ind))+
geom_violin()+ # geometría de violin
geom_jitter(aes(col= ind), alpha= 0.6)+
labs(title = "Gráfico de violín",
x= "", y= "variables scala log")+
theme_minimal()+
theme(legend.position = "none") #quitar leyenda de variables
Ahora en conjunto
ggplot(crab2, aes(x=ind, y= log(values+1)))+
geom_jitter( aes(color=ind),width = 0.2, alpha= 0.6)+
geom_violin(aes(color=ind),
scale = "width",
alpha= 0.1, # valor de opacidad
size= 0.8)+ # tamaño de la linea
geom_boxplot(width = 0.3, alpha= 0.1, size= 0.8,
outlier.color = "red",
outlier.alpha = 0.9,
outlier.size = 2)+
labs(title = "Gráfico conjunto",
x= "", y= "Variables scala log")+
theme_bw()+
theme(legend.position = "none", # quitar leyenda de variables
text = element_text(size= 11, face = "bold")) # Ajustar tamaño de texto
Dotplots
Con base R
dotchart(crab$size,
ylab = "Order of observations",
xlab = "SO2",
main = "Cleveland dotplot")
Modo ggplot
<- crab %>%
d_plot mutate(index = seq(n())) %>%
select_if(is.numeric) %>%
pivot_longer(cols = !index,
names_to = "Variable",
values_to = "Value") %>%
ggplot(aes(x= Value, y= index, col= Variable))+
geom_point(size= 2, alpha=0.6)+
scale_color_viridis_d(option = "mako",
begin = 0.1,
end = 0.8)+
facet_wrap(~Variable, scales = "free")+
labs(y= "Order of ovservation")+
theme_bw()+
theme(legend.position = "none",
text = element_text(size=10))
Histogramas
hist(crab$size,lwd=2)
abline(v = 14.65, col = "blue")
abline(v = 14.435, col = "red")
Todas las variables juntas (base R)
par(mfrow=c(3,2))
hist(crab$size,lwd=2); abline(v = c(14.65,14.435), col = c("blue", "red"))
hist(crab$latitude,lwd=2)
hist(crab$air_temp,lwd=2)
hist(crab$air_temp_sd,lwd=2)
hist(crab$water_temp,lwd=2)
hist(crab$water_temp_sd,lwd=2)
Modo ggplot
Volvemos a emplear nuestra base crab2
en modo largo
ggplot(crab2, aes(x=values, fill= ind))+
geom_histogram( bins = 7, color="black")+
facet_wrap(.~ind, scales = "free")+ # Crear los paneles por variable
theme_bw()+
theme(legend.position = "none")+
labs(x="", y= " Frequency")
Gráficos de densidad
ggplot de una variable
ggplot(crab, aes(x= size))+
geom_histogram(aes(y = stat(density)),
bins = 7,
fill= "gray",
color="black")+
geom_density(size=1)+
theme_classic()
ggplot de todas las variables
ggplot(crab2, aes(x=log(values+1), fill= ind))+
geom_histogram(aes(y = stat(density), fill= ind),
bins = 7, color="black")+
geom_density(aes(fill= ind),
size=1, alpha= 0.5)+
facet_wrap(.~ind, scales = "free")+ # Crear los paneles por variable
theme_classic()+
theme(legend.position = "none")+
labs(x="", y= " Frequency")
Ahora pondremos las variables a la misma escala y las exploraremos con un gráfico de olas
ggplot(crab2, aes(x= log(values+1), y= ind, fill= ind))+
geom_density_ridges()+
theme_ridges() +
theme(legend.position = "none")
QQ-plots
Primero con plot base
qqnorm(crab$size, main="Q-Q plot Size")
qqline(crab$size, col = 2, lty = 2)
modo ggplot para QQplot
ggplot(crab, aes(sample=size))+
stat_qq()+
stat_qq_line(linetype= "dashed")+
labs(title = "Q-Q plot",
x= "Theoretical Quantiles",
y= "Education sample cuantiles")+
theme_bw()
Relaciones Bivariadas
Veamos que relación hay entre las distintas variables. Aquí utilizo una función smoooth (regresión con pesos locales) que permite sugerir con los propios datos que tipo de relación pudieran tener.
pairs(crab, panel=panel.smooth)
Veamos la relación entre el tamaño de los cangrejos y la latitud
ggplot(data = pie_crab, aes(y = latitude, x = water_temp)) +
geom_point()
En general, la temperatura del agua dentro del área de estudio disminuye hacia latitudes más bajas.
<- pie_crab %>% group_by(latitude, site) %>%
crab_stats summarise(
n = n(),
mean_mm = mean(size),
min_mm = min(size),
max_mm = max(size),
sd_mm = sd(size),
median_mm = median(size)
)
crab_stats
# A tibble: 13 × 8
# Groups: latitude [13]
latitude site n mean_mm min_mm max_mm sd_mm median_mm
<dbl> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 30 GTM 28 12.4 7.55 14.9 1.80 12.6
2 31.4 SI 30 9.85 6.64 13.6 1.79 9.55
3 33.3 NIB 30 13.3 8.52 17.3 2.42 13.3
4 34 ZI 35 12.1 8.05 15.7 2.01 12.0
5 34.7 RC 25 12.5 9.4 17.6 2.34 12.1
6 37.2 VCR 30 16.3 11.7 21.4 2.94 16.0
7 39.1 DB 30 15.6 11.5 20.4 2.12 15.1
8 39.6 JC 30 15.3 9.58 20.9 2.72 15.4
9 41.3 CT 33 14.7 11.0 19.5 2.36 15.5
10 41.6 NB 29 17.1 13.2 21.9 2.29 17.2
11 41.9 CC 27 16.8 10.6 19.8 2.05 16.7
12 42.2 BC 37 16.2 9.01 23.4 4.81 17.3
13 42.7 PIE 28 18.5 9.92 22.1 2.30 18.4
Aquí, creamos un boxplot del tamaño del caparazón del cangrejo (mm) por latitud. En general, el tamaño de los cangrejos aumenta hacia latitudes más altas, siguiendo la regla de Bergmann.
%>%
pie_crab ggplot(aes(y=latitude)) +
geom_boxplot(aes(size, group = latitude, color=-latitude), outlier.size=0.8) +
geom_text(data = crab_stats,
aes(label = (paste('n =', n)),
group = latitude,
color = -latitude,
x= max_mm + 0.2,
y= latitude + 0.15),
size=3.5) +
scale_x_continuous(breaks = seq(from = 7, to = 23, by = 2), limits = c(6.5,24))+
scale_y_continuous(breaks = seq(from = 29, to = 43, by = 2), limits = c(29, 43.5)) +
theme(legend.position= "none")
<- pie_crab %>% group_by(site, latitude) %>%
crab_summary summarise(
mean_size = mean(size)
%>% ungroup() )
A continuación se muestra otro gráfico del tamaño del caparazón (mm) según la latitud del lugar, con los tamaños medios registrados para cada lugar mostrados como puntos morados (todas las observaciones incluidas como puntos gris claro), lo que revela una relación aproximadamente lineal entre el tamaño medio del caparazón y la latitud.
ggplot(data = crab_summary, aes(y = latitude, x = mean_size)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color="black") +
geom_point(color = "purple", size=3) +
geom_point(aes(x = size, y = latitude), data = pie_crab, color = "gray", alpha = 0.5) +
geom_text(aes(label = site), nudge_x = 0.3, nudge_y = 0.3, size=3) +
labs(y = "Latitude",
x = "Mean carapace width (mm)",
title = "Mean carapace width of male fiddler crabs by latitude") +
theme_minimal()