Objetivos

  1. Continuar utilizando las funciones del conjunto de librerías tidyverse para la manipulación y análisis de datos, en particular:
  • summarise(): para resumir variables mediante diversos estadísticos descriptivos.

  • summarise_at(): para obtener resúmenes estadísticos aplicados a determinadas variables.

  • mutate(): para la creación de nuevas variables.

  1. Familiarizarse con las funciones para el cálculo de estadísticos descriptivos básicos:
  • Media Aritmética: mean()
  • Desviación típica: sd()
  • Mediana: median()
  • Máximo y mínimo: max() y min()
  1. Conocer la librería moments() para el cálculo de medidas de forma como la asimetría y el apuntamiento.

 

 

 

 

0. 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. Cálculo de múltiples medidas descriptivas mediante summarise.

Calcula el número de observaciones, la media, desviación típica, Asimetria, Curtosis, mínimo, máximo y Mediana de la variable LCC (NOTA: asimetría y curtosis están en library(moments)).

tortugas %>%
  summarise(sum(!is.na(LCC)),
            mean(LCC),
            sd(LCC),
            skewness(LCC),
            kurtosis(LCC),
            min(LCC),max(LCC),
            median(LCC)) 
## # A tibble: 1 × 8
##   `sum(!is.na(LCC))` `mean(LCC)` sd(LC…¹ skewn…² kurto…³ min(L…⁴ max(L…⁵ media…⁶
##                <int>       <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1                 20        81.6    2.91  0.0750    2.07    77.1    86.7    81.6
## # … with abbreviated variable names ¹​`sd(LCC)`, ²​`skewness(LCC)`,
## #   ³​`kurtosis(LCC)`, ⁴​`min(LCC)`, ⁵​`max(LCC)`, ⁶​`median(LCC)`

 

Importante: para contar el número de valores válidos en la variable LCC hemos usado la función is.na(); esta variable vale 1 si el valor está “perdido” (nasignifica not assigned, lo que quiere decir que el valor no se ha registrado) y vale 0 si el valor es válido. Asimismo, el símbolo ! indica negación; es decir !is.na(LCC) identifica los valores que no están perdidos en la variable LCC; cuando el valor es válido !is.na() vale 1 y cuando está perdido vale 0; por tanto sum(!is.na(LCC)) cuenta el número de valores válidos dentro de la variable LCC.

 

 

 

2. Mejora de la presentación

Presenta los resultados anteriores asignando un nombre a cada columna y conviértelos en una tabla (usando flextable()). Ajusta el ancho de columna con autofit() y el número de dígitos decimales con colformat_double(digits=2). Por último asigna nombre a la tabla con set_caption().

tortugas %>%
  summarise(n=sum(!is.na(LCC)), 
            media=mean(LCC),
            sd=sd(LCC),
            asimetria=skewness(LCC),
            apuntamiento=kurtosis(LCC),
            minimo=min(LCC),
            mediana=median(LCC),
            maximo=max(LCC)) %>% 
  flextable() %>% 
  colformat_double(digits=2) %>% 
  fontsize(size=12,part="all") %>% 
  autofit() %>% 
  set_caption("Descripción de la variable LCC")

 

 

 

3. Creación de una nueva variable utilizando mutate().

Se puede obtener un valor aproximado de la superficie (en \(m^2\)) del caparazón mediante la siguiente expresión:

\[ Sup = \pi \cdot \left(\frac{LCC+ACC}{400}\right)^2\]

Calcula la superficie aproximada de los caparazones de las tortugas de la muestra.

 

La función mutate() permite crear una nueva variable. Su sintaxis es de la forma:

tortugas %>% 
  mutate(superf=pi*((LCC+ACC)/400)^2)

De esta forma R calcula los valores de superf para cada tortuga de la muestra y nos los enseña por pantalla. Si simplemente quisiéramos calcular la superficie media de todos los caparazones, podríamos ejecutar:

tortugas %>% 
  mutate(superf=pi*((LCC+ACC)/400)^2) %>% 
  summarise(mean(superf))
## # A tibble: 1 × 1
##   `mean(superf)`
##            <dbl>
## 1          0.490

 

Es importante señalar que la nueva variable superf no se ha guardado en ningún sitio. Si queremos guardar esta nueva variable dentro del data.frame tortugas para reutilizarla más adelante en nuestro análisis de los datos, deberemos reasignar el resultado del mutate() de nuevo a tortugas del modo siguiente:

tortugas <- tortugas %>% 
  mutate(superf=pi*((LCC+ACC)/400)^2)

Esta sintaxis puede leerse de la forma:

“En tortugas metemos el resultado (<-) de coger el data.frame tortugas transformándolo (%>% mutate) mediante la creación de una nueva variable superf calculada como pi*((LCC+ACC)/400)^2

Podemos comprobar que ahora el data.frame tortugas tiene una variable más ejecutando:

View(tortugas)

lo que nos mostrará todas las variables en Rstudio:

 

Obviamente, una vez creada esta variable, podemos utilizarla como el resto de variables en el archivo. La misma sintaxis que hemos utilizado con LCC nos permite describir las características de la variable superf:

tortugas %>%
  summarise(n=sum(!is.na(superf)), 
            media=mean(superf),
            sd=sd(superf),
            asimetria=skewness(superf),
            apuntamiento=kurtosis(superf),
            minimo=min(superf),
            mediana=median(superf),
            maximo=max(superf)) %>% 
  flextable() %>% 
  colformat_double(digits=2) %>% 
  fontsize(size=12,part="all") %>% 
  autofit() %>% 
  set_caption("Descripción de la variable LCC")

 

4. Descripción de varias variables.

Supongamos que queremos calcular el valor medio de todas las variables numéricas de la muestra. Una manera de hacerlo sería especificar el cálculo de la media variable a variable:

tortugas %>% 
  summarize(mean(LCC), mean(ACC),mean(peso),mean(Huevos),mean(distancia),
            mean(profNido),mean(crias_Emerg),mean(crias_Muertas),mean(hrotos)) 
## # A tibble: 1 × 9
##   `mean(LCC)` mean(ACC…¹ mean(…² mean(…³ mean(…⁴ mean(…⁵ mean(…⁶ mean(…⁷ mean(…⁸
##         <dbl>      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1        81.6       76.2    59.8    80.9    21.2    55.2      NA      NA      NA
## # … with abbreviated variable names ¹​`mean(ACC)`, ²​`mean(peso)`,
## #   ³​`mean(Huevos)`, ⁴​`mean(distancia)`, ⁵​`mean(profNido)`,
## #   ⁶​`mean(crias_Emerg)`, ⁷​`mean(crias_Muertas)`, ⁸​`mean(hrotos)`

 

Como vemos en las últimas variables el valor mostrado es NA. Ello se debe a que dichas variables contienen valores perdidos, y por defecto en tales casos R devuelve NA como manera de hacernos notar esa circunstancia. No obstante, si ya somos conscientes de que hay valores perdidos, y queremos que R calcule la media del resto de valores, bastará con especificar la opción na.rm=TRUE (que viene a significar que se eliminan (rm remove) los valores perdidos (NA) en el cálculo de la media):

tortugas %>% 
  summarize(mean(LCC), mean(ACC),mean(peso),mean(Huevos),mean(distancia),
            mean(profNido),mean(crias_Emerg,na.rm=TRUE),mean(crias_Muertas,na.rm=TRUE),
            mean(hrotos,na.rm=TRUE)) %>% 
  flextable() %>% 
  autofit()

 

R nos ofrece la posibilidad de simplificar la sintaxis anterior utilizando la función across() en la que se indican los nombres de las variables sobre las cuales se quiere aplicar el cálculo de la media:

tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),mean,na.rm=TRUE)) %>% 
  flextable() %>% 
  autofit()

 

Nótese que los nombres de las variables se han especificado dentro de la función de concatenación c(); asimismo basta con escribir na.rm=TRUE una única vez al final de la función across().

Por último, señalemos que si se desea presentar estos resultados con una fila para cada variable podemos hacerlo utilizando la función pivot_longer(). Esta función permite cambiar datos que están escritos a lo ancho en datos que están escritos a lo largo (de ahí el nombre, pivot_longer). La sintaxis sería la siguiente:

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") %>% 
  flextable() %>% 
  autofit()

 

Nótese que hemos usado la opción names_to para indicar el nombre de la columna en la que irían los nombres de las variables del conjunto anterior; y values_to para indicar el nombre de la columna donde irían los valores numéricos, que en este ejemplo son las medias de las distintas variables.

 

 

La siguiente sintaxis nos permitiría obtener la desviación típica de cada variable:

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") %>% 
  flextable() %>% 
  autofit()

 

Si queremos combinar las dos tablas anteriores en una única tabla que nos muestre media y desviación típica podríamos hacer lo siguiente:

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

 

 

 

Por último, supongamos que en la tabla anterior queremos añadir además el número de valores válidos en cada variable. Ya hemos visto que para ello debemos utilizar sum(!is.na(nombre_de_la_variable)). Si empleamos esta expresión en el across() obtenemos un error:

tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),sum(!is.na))) %>% 
  flextable() %>% 
  autofit()
## Error in `summarize()`:
## ℹ In argument: `across(...)`.
## Caused by error in `!is.na`:
## ! argumento de tipo inválido

 

Ello es debido a que aquí estamos utilizando realmente tres funciones: sum(), is.na() y ! combinadas. Si queremos que sum(!is.na()) sea identificada como una única función dentro de across() debemos precederla del símbolo ~ e indicar entre paréntesis como argumento .x, tal como se muestra a continuación:

tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),
                   ~sum(!is.na(.x))))
## # A tibble: 1 × 8
##     LCC   ACC Huevos distancia profNido crias_Emerg crias_Muertas hrotos
##   <int> <int>  <int>     <int>    <int>       <int>         <int>  <int>
## 1    20    20     20        20       20          16            16     16

 

 

Para combinar la media, desviación típica y número de valores válidos en una única tabla procedemos como antes, usando un segundo full_join() para añadir la nueva tabla con los valores válidos en cada variable:

n <- tortugas %>% 
  summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),~sum(!is.na(.x)))) %>% 
    pivot_longer(everything(),names_to = "Variable", values_to = "n")

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