Objetivos

  1. Continuar utilizando las funciones del conjunto de librerías tidyverse para la manipulación y análisis de datos, y la librería flextable para la presentación de resultados.

  2. Aprender a programar funciones en R para la automatización de tareas.

  3. Empezar a utilizar el paquete ggplot2 para la generación de gráficos.

 

 

 

 

Preliminares: carga de las librerías que utilizaremos en esta práctica, y lectura del archivo de datos.

library(readxl)
library(tidyverse)
library(flextable)
library(moments) 
tortugas <- read_excel("datosP1-1920.xlsx")

 

 

1. Funciones en R

En las aplicaciones prácticas suele ser habitual describir las variables mostrando su media y su desviación típica (en el formato \(\overline{x}\pm sd\)) o mediante su mediana y primer y tercer cuartiles (en el formato \(Me \left[Q_1; Q2\right])\)). Como se ha visto en la práctica anterior es factible construir una tabla con esta información mediante la sintaxis:

medias <- tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),mean,na.rm=TRUE)) %>% 
  pivot_longer(everything(),names_to = "Variable", values_to = "Media")

desviaciones <- tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),sd,na.rm=TRUE)) %>% 
  pivot_longer(everything(),names_to = "Variable", values_to = "sd")

full_join(medias,desviaciones) %>% 
  flextable() %>% 
  colformat_double(digits=2) %>% 
  autofit() %>% 
  set_caption("Medias y desviaciones típicas")

 

Como vemos, de esta forma obtenemos una tabla con dos columnas, una con la media y otra con la desviación típica. Si queremos que nos muestre una única columna con el formato \(\overline{x}\pm sd\) podemos definir una función que se encargue de calcular la media y la desviación típica y mostrar el resultado en este formato.

 

En R es fácil crear nuevas funciones. La estructura de una función es de la forma:

nombreFuncion <- function(argumento1, argumento2, ...){
  ... Cálculos ... 
  return(Resultado)
}

Esta función tiene por nombre nombreFunción, recibe los argumentos que se especifiquen, con ellos hace sus cálculos y devuelve el valor Resultado. Un ejemplo muy sencillo es la siguiente función que suma dos números:

suma <- function(a,b){
  valor <- a+b
  return(valor)
}

Para ejecutarla bastaría con escribir:

suma(2,4)
## [1] 6

En la práctica no es necesario escribir return(). Por defecto una función devuelve siempre el último resultado que haya calculado; así, por ejemplo, la función suma anterior podría definirse de modo equivalente como:

suma <- function(a,b){
  a+b
}

y funcionaría exactamente igual:

suma(2,4)
## [1] 6

 

Para construir una función tal que dada una variable \(x\) calcule y formatee su media y su desviación típica de la forma \(\overline{x}\pm sd\) podemos utilizar la función sprintf() del siguiente modo:

meanSd <- function(x){
  media=mean(x,na.rm=TRUE) # Se calcula la media
  sd=sd(x,na.rm=TRUE) # Se calcula la desviación típica
  sprintf("%.2f ± %.2f",media,sd) # Se formatea el resultado
}

En la función sprintf() se especifica primero entre paréntesis la forma en que debe expresarse el resultado; en este caso, “%.2f ± %.2f” quiere decir que primero va un número real con dos decimales (%.2f), seguido del símbolo “±” y a continuación otro número real también con dos decimales (%.2f); los números a utilizar son los que figuran a continuación: el primero es la media y el segundo la desviación típica. De esta forma, si aplicamos esta función a la variable LCC obtenemos:

tortugas %>% 
  summarize(meanSd(LCC))
## # A tibble: 1 × 1
##   `meanSd(LCC)`
##   <chr>        
## 1 81.63 ± 2.91

Si quisiéramos un único decimal utilizaríamos sprintf(“%.1f ± %.1f”,media,sd); si quisiéramos tres decimales sprintf(“%.3f ± %.3f”,media,sd), etc.

 

Para aplicar esta función a varias variables y presentar el resultado en forma de tabla podemos utilizar el mismo procedimiento que seguimos en la práctica anterior usando across(), pivot_longer() y flextable():

tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),meanSd)) %>% 
  pivot_longer(everything(),names_to = "Variable", values_to = "Media") %>% 
  flextable() %>% 
  colformat_double(digits=2) %>% 
  autofit() %>% 
  set_caption("Medias y desviaciones típicas")

 

Si lo que nos interesa es calcular la mediana y el rango intercuartílico (IQR, el intervalo definido por los cuartiles 1 y 3), y que R nos lo devuelva en el formato \(Me \left[Q1; Q3\right]\) podemos implementar la siguiente función; nótese la forma en que definimos ahora el resultado en la función sprintf(), utilizando tres valores reales con dos decimales cada uno:

medianIQR <- function(x){
  Me=median(x,na.rm=TRUE)
  Q1=quantile(x,na.rm=TRUE,probs=0.25)
  Q3=quantile(x,na.rm=TRUE,probs=0.75)
  sprintf("%.2f [%.2f; %.2f]",Me,Q1,Q3)
}

Podemos aplicar esta función solo a LCC:

tortugas %>% 
  summarize(medianIQR(LCC))
## # A tibble: 1 × 1
##   `medianIQR(LCC)`    
##   <chr>               
## 1 81.60 [79.30; 83.53]

o a todas las variables:

tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),medianIQR)) %>% 
  pivot_longer(everything(),names_to = "Variable", values_to = "Mediana [IQR]") %>% 
  flextable() %>% 
  colformat_double(digits=2) %>% 
  autofit() %>% 
  set_caption("Mediana y rango intercuartílico")

 

Señalemos por último que cuando la variable a formatear en sprintf() es de tipo entero usaremos “%d”; y si es de tipo string usaremos “%s”.

 

 

 

 

2. Gráficos con ggplot: Nubes de puntos

 

Representar gráficamente LCC frente a ACC.

 

Para realizar esta representación indicamos a ggplot que use los datos del conjunto tortugas, y que la “estética” (aesthetics, aes) del gráfico consiste en colocar ACC en el eje X y LCC en el eje Y; a continuación añadimos una geometría de puntos (geom_points()) y listo:

ggplot(tortugas, aes(x=ACC,y=LCC)) +
  geom_point()

Por cierto, se obtiene el mismo resultado si el conjunto de datos tortugas se hace pasar por una tubería %>% para “entrar” en el comando ggplot:

tortugas %>% 
  ggplot(aes(x=ACC,y=LCC)) +
  geom_point()

 

 

 

 

3. Gráficos con ggplot: Nubes de puntos y recta de regresión.

 

Representar gráficamente el peso frente a la superficie del caparazón, añadiendo la linea de regresión

 

Con ggplot() es sencillo añadir la línea de mejor ajuste a una nube de puntos. Ello se consigue una vez trazado el gráfico con la nube de puntos añadiendo geom_smooth(method="lm") (donde lm significa “linear model”). En caso de no poner method="lm" ggplot dibujaría la curva que mejor se ajusta a la nube de puntos:

tortugas %>% 
  mutate(superf=pi*((LCC+ACC)/400)^2) %>% 
  ggplot(aes(x=superf,y=peso)) +
  geom_point()+
  geom_smooth(method="lm")