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.
mean()
sd()
median()
max()
y min()
Conocer la librería moments()
para el cálculo de medidas de forma como la asimetría y el apuntamiento.
Conocer y familizarizarse con el uso y manipulación de valores perdidos (NA) en R.
Aprender a programar funciones en R para la automatización de tareas.
Empezar a utilizar el paquete ggplot2 para la generación de gráficos.
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(n(),
mean(LCC),
sd(LCC),
skewness(LCC),
kurtosis(LCC),
min(LCC),max(LCC),
median(LCC))
## # 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)
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()
.
tortugas %>%
summarise(media=mean(LCC),
sd=sd(LCC),
asimetria=skewness(LCC),
apuntamiento=kurtosis(LCC),
minimo=min(LCC),
mediana=median(LCC),
maximo=max(LCC)) %>%
flextable() %>%
colformat_num(digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
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 |
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.frametortugas
transformándolo (%>% mutate
) mediante la creación de una nueva variablesuperf
calculada comopi*((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:
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:
listaFunciones=list(n=n,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
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:
listaFunciones=list(n=length,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(superf), listaFunciones) %>%
flextable() %>% autofit()
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:
tortugas %>%
summarise_at(vars(LCC), listaFunciones) %>%
mutate(Variable="LCC") %>%
select(last_col(),everything()) %>%
flextable() %>%
fontsize(size=12,part="all") %>%
colformat_num(j=-2,digits=2) %>%
autofit()
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.
tortugas %>%
summarise_at(vars(ACC), listaFunciones) %>%
mutate(Variable="ACC") %>%
select(last_col(),everything()) %>%
flextable() %>%
fontsize(size=12,part="all") %>%
colformat_num(j=-2,digits=2) %>%
autofit()
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
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
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():
listaFunciones=list(n=length,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(crias_Emerg), listaFunciones, na.rm=TRUE)
## 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:
listaFunciones=list(media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(crias_Emerg), listaFunciones, na.rm=TRUE)
## # 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
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:
tortugas %>%
summarise(mediaCrias_Emerg=mean(crias_Emerg,na.rm=TRUE),
sdLCC=sd(crias_Emerg,na.rm=TRUE),
nLCC=n_valid(crias_Emerg))
## # 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:
listaFunciones=list(nValidos=n_valid,
nPerdidos=n_missing,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(crias_Emerg),listaFunciones,na.rm=TRUE)
## 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:
n_valid <- function(x, ...){
sum(!is.na(x))
}
n_missing <- function(x, ...){
sum(is.na(x))
}
listaFunciones=list(nValidos=n_valid,
nPerdidos=n_missing,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(crias_Emerg),listaFunciones,na.rm=TRUE) %>%
flextable() %>%
colformat_num(j=-c(1,2),digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
set_caption("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.
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
:
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: