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.
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.
library(readxl)
library(tidyverse)
library(flextable)
library(moments)
<- read_excel("datosP1-1920.xlsx") tortugas
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:
<- tortugas %>%
medias 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")
<- tortugas %>%
desviaciones 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")
Variable | Media | sd |
LCC | 81.63 | 2.91 |
ACC | 76.24 | 2.65 |
Huevos | 80.90 | 14.41 |
distancia | 21.20 | 7.19 |
profNido | 55.23 | 7.10 |
crias_Emerg | 29.75 | 25.69 |
crias_Muertas | 1.69 | 2.77 |
hrotos | 49.94 | 24.35 |
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:
<- function(argumento1, argumento2, ...){
nombreFuncion
... 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:
<- function(a,b){
suma <- a+b
valor 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:
<- function(a,b){
suma +b
a }
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:
<- function(x){
meanSd =mean(x,na.rm=TRUE) # Se calcula la media
media=sd(x,na.rm=TRUE) # Se calcula la desviación típica
sdsprintf("%.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")
Variable | Media |
LCC | 81.63 ± 2.91 |
ACC | 76.24 ± 2.65 |
Huevos | 80.90 ± 14.41 |
distancia | 21.20 ± 7.19 |
profNido | 55.23 ± 7.10 |
crias_Emerg | 29.75 ± 25.69 |
crias_Muertas | 1.69 ± 2.77 |
hrotos | 49.94 ± 24.35 |
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:
<- function(x){
medianIQR =median(x,na.rm=TRUE)
Me=quantile(x,na.rm=TRUE,probs=0.25)
Q1=quantile(x,na.rm=TRUE,probs=0.75)
Q3sprintf("%.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")
Variable | Mediana [IQR] |
LCC | 81.60 [79.30; 83.53] |
ACC | 75.95 [74.25; 77.75] |
Huevos | 82.50 [68.75; 86.25] |
distancia | 18.40 [16.70; 24.35] |
profNido | 53.80 [50.45; 59.00] |
crias_Emerg | 24.00 [9.75; 44.50] |
crias_Muertas | 0.50 [0.00; 2.25] |
hrotos | 51.50 [34.25; 67.25] |
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”.
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()
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")