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.

  2. Conocer y familizarizarse con el uso y manipulación de valores perdidos (NA) en R.

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

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

 

 

 

 

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

 

 

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

## # A tibble: 1 x 8
##   `n()` `mean(LCC)` `sd(LCC)` `skewness(LCC)` `kurtosis(LCC)` `min(LCC)`
##   <int>       <dbl>     <dbl>           <dbl>           <dbl>      <dbl>
## 1    20        81.6      2.91          0.0750            2.07       77.1
## # … with 2 more variables: `max(LCC)` <dbl>, `median(LCC)` <dbl>

 

Importante: nótese que hemos puesto LCC como argumento en todas las funciones menos en n(). Ello es debido a que la función n() en realidad no cuenta el número de valores de LCC sino el número de filas del data.frame sobre el que se está ejecutanto el summarise (en este caso, tortugas), que tiene 20 filas. Si escribiéramos n(LCC) R nos devolvería un error:

## Error in n(LCC): unused argument (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_num(digits=2). Por último asigna nombre a la tabla con set_caption().

Descripción de la variable LCC

media

sd

asimetria

apuntamiento

minimo

mediana

maximo

81.63

2.91

0.07

2.07

77.10

81.60

86.70

 

 

 

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:

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:

## # A tibble: 1 x 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:

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:

lo que nos mostrará todas las variables en Rstudio:

 

 

 

4. Uso de listas de funciones en summarise()

Describe la variable anterior mediante las mismas medidas descriptivas de la pregunta 1 de esta práctica. Simplifica dicha descripción creando una lista de funciones.

 

Podemos crear fácilmente una lista de las funciones que queremos aplicar mediante:

Y ahora, para aplicar esta lista de funciones a la variable superf ejecutamos:

## Error in (function () : unused argument (superf)

Como vemos, R nos ha devuelto el error unused argument (superf) . ¿A qué se debe este mensaje? Recordemos que en la pregunta 1 vimos que la función n() no puede recibir ningún argumento. El mensaje de error que estamos viendo se debe precisamente a que cuando se ha pasado la variable superf a la lista de funciones, hay una función de esa lista (la función n()) que recibe un argumento (superf) que no usa.

Podemos sustituir la función n() por la función length() que sí que nos da la longitud (número de valores) de la variable a la que se aplique:

n

media

sd

asimetria

curtosis

min

mediana

max

20

0.4897684

0.02899563

0.07120863

2.228814

0.4370866

0.4861427

0.5443251

 

 

Puede mejorarse la presentación de resultados del siguiente modo:

Variable

n

media

sd

asimetria

curtosis

min

mediana

max

LCC

20

81.63

2.91

0.07

2.07

77.10

81.60

86.70

 

Nótese que en esta sintaxis:

  • Hemos creado la variable Variable que identifica qué variable estamos resumiendo (en este caso LCC). O hemos hecho mediante mutate(Variable="LCC").

  • Al crear esta variable, se coloca al final de nuestra descripcion; como el resultado resulta mejor si esta variable es la primera, la cambiamos de sitio mediante select(last_col(),everything()); esto significa que coloca primero la última columna (last_col()) y después todo lo demás (everything()).

  • Por defecto la asimetría, curtosis, etc. se presentan con muchos decimales. Para que todos los resultados numéricos tengan solo dos decimales utilizamos colformat_num(j=-2, digits=2). Hemos añadido `j=-2’ para que la variable que está en segundo lugar (número de casos), no le afecte el poner dos dígitos decimales.

 

  • Describimos ACC del mismo modo:

Variable

n

media

sd

asimetria

curtosis

min

mediana

max

ACC

20

76.24

2.65

0.35

2.25

72.10

75.95

81.40

 

 

 

 

Nota 1: Dentro de vars() se pueden especificar varias variables, y R aplicaría la lista de funciones a cada una de ellas, si bien la presentación del resultado no es demasiado elegante:

LCC_n

ACC_n

LCC_media

ACC_media

LCC_sd

ACC_sd

LCC_asimetria

ACC_asimetria

LCC_curtosis

ACC_curtosis

LCC_min

ACC_min

LCC_mediana

ACC_mediana

LCC_max

ACC_max

20

20

81.63

76.24

2.908083

2.647819

0.07495546

0.3482047

2.067325

2.245906

77.1

72.1

81.6

75.95

86.7

81.4

Ya veremos más adelante como mejorar esta presentación

 

 

5. Valores perdidos: uso de na.rm=TRUE.

 

Calcula el número medio de crías emergidas

 

Para calcular el número medio de crías emergidas podríamos pensar en ejecutar simplemente:

## # A tibble: 1 x 1
##   `mean(crias_Emerg)`
##                 <dbl>
## 1                  NA

Vemos que R nos devuelve NA (No Asignado). Ello es debido a que la variable contiene valores perdidos (hay nidos en los que no se contó el número de crías emergidas), y esta es la forma que tiene R de advertirnos que puede haber algún problema.

Téngase en cuenta que en algunos casos los valores perdidos pueden invalidar los resultados de un análisis. Imaginemos que tuviésemos 50 nidos, pero que el número de crías emergidas se hubiese contabilizado solamente en dos de ellos. ¿Podríamos tomar el número medio en estos dos nidos como una estimación razonable del número medio de crías emergidas en los 50 nidos?. Probablemente no. Por ello cuando hay valores perdidos en nuestros datos debemos ser especialmente cuidadosos y advertirlo en nuestro informe.

Dado que nuestro archivo contiene 20 nidos y solo hay 4 en los que no se tiene información del número de crías, podríamos proceder a evaluar el número medio de crías en los otros 16 nidos. Para decirle a R que ignore la presencia de valores perdidos se utiliza la opción na.rm=TRUE, donde na.rm es un acrónimo de “NA remove” (eliminar valores perdidos):

## # A tibble: 1 x 1
##   `mean(crias_Emerg, na.rm = TRUE)`
##                               <dbl>
## 1                              29.8

 

 

 

 

6. Valores perdidos cuando se usan listas de funciones: uso de na.rm=TRUE.

 

Describe las variables “Crias Emergidas” y “Crías Muertas” utilizando la lista de funciones empleada en el punto 1 de esta práctica

 

Si las funciones de una lista admiten la opción na.rm basta con añadir na.rm=TRUE en la llamada a summarise():

## Error in .Primitive("length")(crias_Emerg, na.rm = TRUE): 2 arguments passed to 'length' which requires 1

En este caso nos ha dado un error porque la función length() no admite la opción na.rm (podemos comprobarlo escribiendo help(length) en la linea de comandos y viendo en la ayuda de esta función que no admite ninguna opción). Suprimimos esta función de la lista anterior y comprobamos que ahora sí obtenemos el resultado buscado:

## # A tibble: 1 x 7
##   media    sd asimetria curtosis   min mediana   max
##   <dbl> <dbl>     <dbl>    <dbl> <dbl>   <dbl> <dbl>
## 1  29.8  25.7     0.543     2.07     0      24    75

El mismo resumen se puede hacer con las crias_Muertas:

## # A tibble: 1 x 7
##   media    sd asimetria curtosis   min mediana   max
##   <dbl> <dbl>     <dbl>    <dbl> <dbl>   <dbl> <dbl>
## 1  1.69  2.77      2.00     6.23     0     0.5    10

 

 

 

 

7. Funciones.

 

Define funciones para contar el número de observaciones válidas y el número de valores perdidos en una variable.

 

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

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:

Para ejecutarla bastaría con escribir:

## [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:

y funcionaría exactamente igual:

## [1] 6

 

Para contar el número de casos perdidos en una variable debemos conocer la existencia de la función is.na(). Esta función recibe un vector x y devuelve TRUE por cada valor perdido en x y FALSE por cada valor válido (para definir un vector se utiliza la función c() poniendo en el paréntesis los valores separados por comas):

## [1] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE

Si ahora aplicamos sum(), cada TRUE cuenta como 1 y cada FALSE como 0:

## [1] 3

por lo que sum(is.na(x)) nos da el número de valores perdidos en x.

Podemos escribir fácilmente una función que utilice la expresión anterior:

Cuando aplicamos esta función obtenemos directamente el número de valores perdidos:

## [1] 3

Si tenemos en cuenta que el símbolo “!” representa la negación, es fácil construir una función que cuente el número de valores válidos usando !is.na(x)

Comprobamos que funciona y nos devuelve el número de valores válidos en x.

## [1] 4

Una vez que hemos creado estas funciones podemos utilizarlas en nuestros análisis estadísticos. Por ejemplo, si queremos contar el número de valores válidos en todas las variables de tortugas:

## # A tibble: 1 x 13
##     Año   LCC   ACC  peso Huevos playa distancia profNido crias_Emerg
##   <int> <int> <int> <int>  <int> <int>     <int>    <int>       <int>
## 1    20    20    20    20     20    20        20       20          16
## # … with 4 more variables: crias_Muertas <int>, hrotos <int>,
## #   cangrejos <int>, superf <int>

O si queremos contar el número de valores perdidos:

## # A tibble: 1 x 13
##     Año   LCC   ACC  peso Huevos playa distancia profNido crias_Emerg
##   <int> <int> <int> <int>  <int> <int>     <int>    <int>       <int>
## 1     0     0     0     0      0     0         0        0           4
## # … with 4 more variables: crias_Muertas <int>, hrotos <int>,
## #   cangrejos <int>, superf <int>

Podemos usar estas funciones en combinación con otras:

## # A tibble: 1 x 3
##   mediaCrias_Emerg sdLCC  nLCC
##              <dbl> <dbl> <int>
## 1             29.8  25.7    16

 

 

Podemos incluir nuestras funciones en una lista de funciones:

## Error in (function (x) : unused argument (na.rm = TRUE)

Nuevamente, el error se debe a que summarise pasa la opción na.rm=TRUE a todas las funciones de la lista, y en las funciones n_valid y n_missing tal como las hemos definido no existe dicha opción. Para arreglar este problema podemos redefinir estas funciones del siguiente modo:

Lo único que hemos hecho es añadir los puntos suspensivos como argumento de la función; ello quiere decir que la función admitirá cualquier otro argumento al llamarla (y por tanto no dará error al pasarle como argumento na.rm=TRUE). No obstante como en el cuerpo de la función lo único que se utiliza es x, el resto de argumentos que le pasemos no tendrá ningún efecto:

Descripción de la variable 'Número de Crías Emergidas'

nValidos

nPerdidos

media

sd

asimetria

curtosis

min

mediana

max

16

4

29.75

25.69

0.54

2.07

0.00

24.00

75.00

 

Nótese que para evitar que flextable añada dos dígitos decimales al número de valores válidos y perdidos, hemos especificado en colformat_num(j =-c(1,2),digits=2) lo que significa que aplica dos decimales a todas las variables numéricas excepto a la primera y la segunda.

 

 

 

 

8. 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:

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:

 

 

 

 

9. 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: