Professional Documents
Culture Documents
Medidas de Tendencia Central 2020
Medidas de Tendencia Central 2020
Tendencial Central
Osnamir Bru
14 y 16 de abril 2020
Adicionalmente;
library(tidyverse)
library(funModeling)
library(Hmisc)
# DataSet
#funModeling::heart_disease
# No se ve en el Global Envaironment
# Truco para verla
heart_disease=heart_disease
1
## 14 heart_disease_severity 164 54.13 0 0.00 0 0 integer 5
## 15 exter_angina 204 67.33 0 0.00 0 0 factor 2
## 16 has_heart_disease 0 0.00 0 0.00 0 0 factor 2
100
50
0
100 150 200 0.00 0.25 0.50 0.75 1.00 0 2 4 6
Análisis cuantitativo
summary(heart_disease)
2
## Mean :246.7 Mean :149.6
## 3rd Qu.:275.0 3rd Qu.:166.0
## Max. :564.0 Max. :202.0
##
## exer_angina oldpeak slope num_vessels_flour thal
## Min. :0.0000 Min. :0.00 Min. :1.000 Min. :0.0000 3 :166
## 1st Qu.:0.0000 1st Qu.:0.00 1st Qu.:1.000 1st Qu.:0.0000 6 : 18
## Median :0.0000 Median :0.80 Median :2.000 Median :0.0000 7 :117
## Mean :0.3267 Mean :1.04 Mean :1.601 Mean :0.6722 NA's: 2
## 3rd Qu.:1.0000 3rd Qu.:1.60 3rd Qu.:2.000 3rd Qu.:1.0000
## Max. :1.0000 Max. :6.20 Max. :3.000 Max. :3.0000
## NA's :4
## heart_disease_severity exter_angina has_heart_disease
## Min. :0.0000 0:204 no :164
## 1st Qu.:0.0000 1: 99 yes:139
## Median :0.0000
## Mean :0.9373
## 3rd Qu.:2.0000
## Max. :4.0000
##
describe(heart_disease) #Análisis numérico y categórico (cuantitativo)
## heart_disease
##
## 16 Variables 303 Observations
## --------------------------------------------------------------------------------
## age
## n missing distinct Info Mean Gmd .05 .10
## 303 0 41 0.999 54.44 10.3 40 42
## .25 .50 .75 .90 .95
## 48 56 61 66 68
##
## lowest : 29 34 35 37 38, highest: 70 71 74 76 77
## --------------------------------------------------------------------------------
## gender
## n missing distinct
## 303 0 2
##
## Value female male
## Frequency 97 206
## Proportion 0.32 0.68
## --------------------------------------------------------------------------------
## chest_pain
## n missing distinct
## 303 0 4
##
## Value 1 2 3 4
## Frequency 23 50 86 144
## Proportion 0.076 0.165 0.284 0.475
## --------------------------------------------------------------------------------
## resting_blood_pressure
## n missing distinct Info Mean Gmd .05 .10
## 303 0 50 0.995 131.7 19.41 108 110
## .25 .50 .75 .90 .95
3
## 120 130 140 152 160
##
## lowest : 94 100 101 102 104, highest: 174 178 180 192 200
## --------------------------------------------------------------------------------
## serum_cholestoral
## n missing distinct Info Mean Gmd .05 .10
## 303 0 152 1 246.7 55.91 175.1 188.8
## .25 .50 .75 .90 .95
## 211.0 241.0 275.0 308.8 326.9
##
## lowest : 126 131 141 149 157, highest: 394 407 409 417 564
## --------------------------------------------------------------------------------
## fasting_blood_sugar
## n missing distinct
## 303 0 2
##
## Value 0 1
## Frequency 258 45
## Proportion 0.851 0.149
## --------------------------------------------------------------------------------
## resting_electro
## n missing distinct
## 303 0 3
##
## Value 0 1 2
## Frequency 151 4 148
## Proportion 0.498 0.013 0.488
## --------------------------------------------------------------------------------
## max_heart_rate
## n missing distinct Info Mean Gmd .05 .10
## 303 0 91 1 149.6 25.73 108.1 116.0
## .25 .50 .75 .90 .95
## 133.5 153.0 166.0 176.6 181.9
##
## lowest : 71 88 90 95 96, highest: 190 192 194 195 202
## --------------------------------------------------------------------------------
## exer_angina
## n missing distinct Info Sum Mean Gmd
## 303 0 2 0.66 99 0.3267 0.4414
##
## --------------------------------------------------------------------------------
## oldpeak
## n missing distinct Info Mean Gmd .05 .10
## 303 0 40 0.964 1.04 1.225 0.0 0.0
## .25 .50 .75 .90 .95
## 0.0 0.8 1.6 2.8 3.4
##
## lowest : 0.0 0.1 0.2 0.3 0.4, highest: 4.0 4.2 4.4 5.6 6.2
## --------------------------------------------------------------------------------
## slope
## n missing distinct Info Mean Gmd
## 303 0 3 0.798 1.601 0.6291
##
## Value 1 2 3
4
## Frequency 142 140 21
## Proportion 0.469 0.462 0.069
## --------------------------------------------------------------------------------
## num_vessels_flour
## n missing distinct Info Mean Gmd
## 299 4 4 0.783 0.6722 0.9249
##
## Value 0 1 2 3
## Frequency 176 65 38 20
## Proportion 0.589 0.217 0.127 0.067
## --------------------------------------------------------------------------------
## thal
## n missing distinct
## 301 2 3
##
## Value 3 6 7
## Frequency 166 18 117
## Proportion 0.551 0.060 0.389
## --------------------------------------------------------------------------------
## heart_disease_severity
## n missing distinct Info Mean Gmd
## 303 0 5 0.832 0.9373 1.25
##
## lowest : 0 1 2 3 4, highest: 0 1 2 3 4
##
## Value 0 1 2 3 4
## Frequency 164 55 36 35 13
## Proportion 0.541 0.182 0.119 0.116 0.043
## --------------------------------------------------------------------------------
## exter_angina
## n missing distinct
## 303 0 2
##
## Value 0 1
## Frequency 204 99
## Proportion 0.673 0.327
## --------------------------------------------------------------------------------
## has_heart_disease
## n missing distinct
## 303 0 2
##
## Value no yes
## Frequency 164 139
## Proportion 0.541 0.459
## --------------------------------------------------------------------------------
profiling_num(heart_disease) # Análisis para variables numéricas (cuantitativas)
5
## 7 slope 1.6006601 0.6162261 0.3849825 1.00 1.0
## 8 num_vessels_flour 0.6722408 0.9374383 1.3944978 0.00 0.0
## 9 heart_disease_severity 0.9372937 1.2285357 1.3107265 0.00 0.0
## p_25 p_50 p_75 p_95 p_99 skewness kurtosis iqr range_98
## 1 48.0 56.0 61.0 68.0 71.00 -0.2080241 2.465477 13.0 [35, 71]
## 2 120.0 130.0 140.0 160.0 180.00 0.7025346 3.845881 20.0 [100, 180]
## 3 211.0 241.0 275.0 326.9 406.74 1.1298741 7.398208 64.0 [149, 406.74]
## 4 133.5 153.0 166.0 181.9 191.96 -0.5347844 2.927602 32.5 [95.02, 191.96]
## 5 0.0 0.0 1.0 1.0 1.00 0.7388506 1.545900 1.0 [0, 1]
## 6 0.0 0.8 1.6 3.4 4.20 1.2634255 4.530193 1.6 [0, 4.2]
## 7 1.0 2.0 2.0 3.0 3.00 0.5057957 2.363050 1.0 [1, 3]
## 8 0.0 0.0 1.0 3.0 3.00 1.1833771 3.234941 1.0 [0, 3]
## 9 0.0 0.0 2.0 3.0 4.00 1.0532483 2.843788 2.0 [0, 4]
## range_80
## 1 [42, 66]
## 2 [110, 152]
## 3 [188.8, 308.8]
## 4 [116, 176.6]
## 5 [0, 1]
## 6 [0, 2.8]
## 7 [1, 2]
## 8 [0, 2]
## 9 [0, 3]
6
male 206 (67.99%)
gender
female 97 (32.01%)
Frequency / (Percentage %)
7
4 144 (47.52%)
3 86 (28.38%)
chest_pain
2 50 (16.5%)
1 23 (7.59%)
Frequency / (Percentage %)
8
0 258 (85.15%)
fasting_blood_sugar
1 45 (14.85%)
Frequency / (Percentage %)
9
0 151 (49.83%)
resting_electro
2 148 (48.84%)
1 4 (1.32%)
Frequency / (Percentage %)
10
NA 2 (0.66%)
3 166 (54.79%)
thal
7 117 (38.61%)
6 18 (5.94%)
Frequency / (Percentage %)
11
0 204 (67.33%)
exter_angina
1 99 (32.67%)
Frequency / (Percentage %)
12
no 164 (54.13%)
has_heart_disease
Frequency / (Percentage %)
13
4 144 (47.52%)
3 86 (28.38%)
var
2 50 (16.5%)
1 23 (7.59%)
Frequency / (Percentage %)
14
6. Biceps perímetro del biceps derecho (centímetros).
La media
Para calcular la media de una variable cuantitativa se usa la función mean. Los argumentos básicos de la
función mean son dos y se muestran a continuación.
x=c(1,2,3,4,5) # vector para ilustrar
mean(x, na.rm = FALSE)
## [1] 3
En el parámetro x se indica la variable de interés para la cual se quiere calcular la media, el parámetro
na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con
NA, el valor por defecto para este parámetro es FALSE.
Ejemplo 1
Suponga que queremos obtener la altura media del grupo de estudiantes. Para encontrar la media general se
usa la función mean sobre el vector númerico datos$altura.
mean(x=datos$altura)
## [1] 171.5556
Del anterior resultado podemos decir que la estatura media o promedio de los estudiantes es 171.5556
centímetros.
Ejemplo 2
Suponga que ahora queremos la altura media pero diferenciando por sexo.
Para hacer esto se debe primero dividir o partir el vector de altura según los niveles de la variable sexo, esto
se consigue por medio de la función split y el resultado será una lista con tantos elementos como niveles
tenga la variable sexo. Luego a cada uno de los elementos de la lista se le aplica la función mean con la
ayuda de sapply o tapply. A continuación el código completo para obtener las alturas medias para hombres
y mujeres.
sapply(split(x=datos$altura, f=datos$sexo), mean)
## Hombre Mujer
## 179.0778 164.0333
15
El resultado es un vector con dos elementos, vemos que la altura media para hombres es 179.0778 centímetros
y que para las mujeres es de 164.0333 centímetros.
¿Qué sucede si se usa tapply en lugar de sapply? Substituya en el código anterior la función sapply por
tapply y observe la diferencia entre los resultados.
Ejemplo 3
Suponga que se tiene el vector edad con las edades de siete personas y supóngase que para el individuo cinco
no se tiene información de su edad, eso significa que el vector tendrá un NA en la quinta posición.
¿Cuál será la edad promedio del grupo de personas?
edad <- c(19, NA, 36, 38, 20, 32, 17)
mean(x=edad)
## [1] NA
Al correr el código anterior se obtiene un error y es debido al símbolo NA en la segunda posición. Para
calcular la media sólo con los datos de los cuales se tiene información, se incluye el argumento na.rm =
TRUE para que R remueva los NA. El código correcto a usar en este caso es:
mean(x=edad, na.rm=TRUE)
## [1] 27
De este último resultado se obtiene que la edad promedio de los individuos es 27 años.
Mediana
Para calcular la mediana de una variable cantitativa se usa la función median. Los argumentos básicos de la
función median son dos y se muestran a continuación.
x=c(1,2,3,4,5)
median(x, na.rm = FALSE)
## [1] 3
En el parámetro x se indica la variable de interés para la cual se quiere calcular la mediana, el parámetro
na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con
NA, el valor por defecto para este parámetro es FALSE.
Ejemplo 4
Calcular la edad mediana para los estudiantes de la base de datos.Para obtener la mediana usamos el siguiente
código:
median(x=datos$edad)
## [1] 28
y obtenemos que la mitad de los estudiantes tienen edades mayores o iguales a 28 años. El resultado anterior
se pudo haber obtenido con la función quantile e indicando que se desea el cuantil 50 así:
quantile(x=datos$edad, probs=0.5)
## 50%
## 28
16
Moda
La moda de una variable cuantitativa corresponde a valor o valores que más se repiten, una forma sencilla de
encontrar la moda es construir una tabla de frecuencias y observar los valores con mayor frecuencia.
Ejemplo 5
Calcular la moda para la variable edad de la base de datos de estudiantes. Se construye la tabla con la
función table y se crea el objeto tabla para almacenarla.
tabla <- table(datos$edad)
tabla
##
## 19 20 21 22 23 24 25 26 28 29 30 32 33 35 37 40 43 45 51 55 65
## 1 1 1 3 2 1 5 3 2 1 2 1 1 2 3 1 2 1 1 1 1
Al mirar con detalle la tabla anterior se observa que el valor que más se repite es la edad de 25 años en
5 ocasiones. Si la tabla hubiese sido mayor, la inspección visual nos podría tomar unos segundos o hasta
minutos y podríamos equivocarnos, por esa razón es mejor ordenar los resultados de la tabla. Para observar
los valores con mayor frecuencia de la tabla se puede ordenar la tabla usando la función sort de la siguiente
manera:
sort(tabla, decreasing=TRUE)
##
## 25 22 26 37 23 28 30 35 43 19 20 21 24 29 32 33 40 45 51 55 65
## 5 3 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
De esta manera se ve fácilmente que la variable edad es unimodal con valor de 25 años.
Medidas de variabilidad
Para ilustrar el uso de las funciones se utilizará la base de datos llamada aptos2015, esta base de datos
cuenta con 11 variables registradas a apartamentos usados en la ciudad de Medellín. Las variables de la base
de datos son:
1. precio: precio de venta del apartamento (millones de pesos).
17
9. administracion: valor mensual del servicio de administración (millones de pesos).
Rango
Para calcular el rango de una variable cuantitativa se usa la función range. Los argumentos básicos de la
función range son dos y se muestran abajo.
x=c(1,2,3,4,5)
range(x, na.rm = FALSE)
## [1] 1 5
En el parámetro x se indica la variable de interés para la cual se quiere calcular el rango, el parámetro na.rm
es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones con NA, el
valor por defecto para este parámetro es FALSE. La función range entrega el valor mínimo y máximo de la
variable ingresada y el valor de rango se puede obtener restando del valor máximo el valor mínimo.
Ejemplo 6
Suponga que queremos obtener el rango para la variable precio de los apartamentos. Para obtener el rango
usamos el siguiente código.
range(datos$precio)
## [1] 25 1700
max(datos$precio) - min(datos$precio)
## [1] 1675
18
Del resultado anterior podemos ver que los precios de todos los apartamentos van desde 25 hasta 1700 millones
de pesos, es decir, el rango de la variable precio es 1675 millones de pesos.
Ejemplo 7
myrange <- function(x) max(x) - min(x)
precios <- split(datos$precio, f=datos$estrato)
sapply(precios, myrange)
## 2 3 4 5 6
## 103 225 610 1325 1560
De los resultados podemos ver claramente que a medida que aumenta de estrato el rango (variabilidad) del
precio de los apartamentos aumenta. Apartamentos de estrato bajo tienden a tener precios similares mientras
que los precios de venta para apartamentos de estratos altos tienden a ser muy diferentes entre si.
## [1] 1.581139
En el parámetro x se indica la variable de interés para la cual se quiere calcular la desviación estándar
muestral, el parámetro na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover
las observaciones con NA, el valor por defecto para este parámetro es FALSE.
Ejemplo 8
Suponga que queremos obtener la desviación estándar muestral para la variable precio de los apartamentos.
Para obtener la desviación solicitada usamos el siguiente código:
sd(x=datos$precio)
## [1] 247.6149
Ejemplo 9
Calcular la desviación estándar poblacional σ para el siguiente conjunto de 5 observaciones: 12, 25, 32, 15, 26.
Recordemos que las expresiones matemáticas para obtener S y σ son muy similares, la diferencia está en el
denominador, para S el denominador es n − 1 mientras que para σ es n. Teniendo esto en cuenta podemos
calcular la desviación poblacional apoyándonos en la función sd, para esto podemos construir una función
llamada Sigma que calcule la desviación poblacional, a continuación el código necesario.
Sigma <- function(x) {
n <- length(x)
sd(x) * (n-1) / n
}
Ahora para obtener la desviación estándar poblacional de los datos usamos el siguiente código.
y <- c(12, 25, 32, 15, 26)
Sigma(y)
19
## [1] 6.621178
Varianza muestral (S 2 )
Para calcular la varianza muestral de una variable cuantitativa se usa la función var. Los argumentos básicos
de la función var son dos y se muestran abajo.
x=c(1,2,3,4,5)
var(x, na.rm = FALSE)
## [1] 2.5
En el parámetro x se indica la variable de interés para la cual se quiere calcular la varianza muestral, el
parámetro na.rm es un valor lógico que en caso de ser TRUE, significa que se deben remover las observaciones
con NA, el valor por defecto para este parámetro es FALSE.
Ejemplo 10
Suponga que queremos determinar cuál región en la ciudad presenta mayor varianza en los precios de los
apartamentos.
Para realizar esto debemos usar en conjunto la función split, sapply y var ya que se quiere la varianza de
una variable (precio) dado los valores de otra variable (ubicacion). El código para obtener las varianzas es el
siguiente.
precios <- split(datos$precio, f=datos$ubicacion)
sapply(precios, var)
20
1500
Precio (millones)
1000
500
0
ubicacion
Tener presente
w <- c(5, -3, NA, 8, 8, 7)
CV(x=w, na.rm=T)
## [1] 0.9273618
Medidas de posición
Cuantiles
Para obtener cualquier cuantil (cuartiles, deciles y percentiles) se usa la función quantile. Los argumentos
básicos de la función quantile son tres y se muestran a continuación.
En el parámetro x se indica la variable de interés para la cual se quieren calcular los cuantiles, el parámetro
21
probs sirve para definir los cuantiles de interés y el parámetro na.rm es un valor lógico que en caso de ser
TRUE, significa que se deben remover las observaciones con NA, el valor por defecto para este parámetro
es FALSE.
Ejemplo 11
Suponga que queremos obtener el percentil 5, la mediana y el decil 8 pa la altura del grupo de estudiantes.
Se solicita el percentil 5, la mediana que es el percentil 50 y el decil 8 que corresponde al percentil 80, por lo
tanto es necesario indicarle a la función quantile que calcule los cuantiles para las ubicaciones 0.05, 0.5 y
0.8, el código para obtener las tres medidas solicitadas es el siguiente.
quantile(x=datos$precio, probs=c(0.05, 0.5, 0.8), na.rm=TRUE)
## 5% 50% 80%
## 90 245 422
Medidas de correlación
Función cor
cor(x, y, use = ”everything”, method = c(”pearson”, ”kendall”, ”spearman”))
2. use: parámetro que indica lo que se debe hacer cuando se presenten registros NA en alguno de los
vectores. Las diferentes posibilidades son: everything, all.obs, complete.obs, na.or.complete y
pairwise.complete.obs, el valor por defecto es everything.
3. method: tipo de coeficiente de correlación a calcular, por defecto es pearson, otros valores posibles
son kendall y spearman.
Ejemplo 12
Calcular el coeficiente de correlación de Pearson para las variables área y precio de la base de datos sobre
apartamentos usados.
cor(x=datos$mt2, y=datos$precio)
## [1] 0.8582585
El resultado anterior vemos que existe una correlación de 0.8583 entre las dos variables, eso significa que
apartamentos de mayor área tienden a tener precios de venta más alto.
with(datos, plot(x=mt2, y=precio, pch=20, col='red',
xlab='Área del apartamento', las=1,
ylab='Precio del apartamento (millones COP)'))
22
Precio del apartamento (millones COP)
1500
1000
500
Se nota claramente que la nube de puntos tiene un pendiente positiva y por eso el signo del coeficiente de
correlación.
cor(x=datos$mt2, y=datos$precio, method='pearson')
## [1] 0.8582585
cor(x=datos$mt2, y=datos$precio, method='kendall')
## [1] 0.6911121
cor(x=datos$mt2, y=datos$precio, method='spearman')
## [1] 0.860306
Ejemplo 13
Para la base de datos de apartamentos usados, ¿cuáles de las variables cuantitativas tienen mayor correlación?
Lo primero que debemos hacer es determinar cuáles son las cuantitativas de la base de datos. Para obtener
información de las variables que están almacenadas en el marco de datos llamado datos usamos la función
str que muestra la estructura interna de objeto.
str(datos)
23
## $ alcobas : int 3 2 2 3 3 3 2 3 4 3 ...
## $ banos : int 1 1 2 2 2 2 2 2 2 2 ...
## $ balcon : Factor w/ 2 levels "no","si": 2 2 1 2 2 1 2 2 2 2 ...
## $ parqueadero : Factor w/ 2 levels "no","si": 2 2 1 2 1 2 2 2 1 2 ...
## $ administracion: num 0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
## $ avaluo : num 14.9 27 15.7 27 39.6 ...
## $ terminado : Factor w/ 2 levels "no","si": 1 2 1 1 2 2 2 2 2 2 ...
Del anterior resultado vemos que las variables precio, mt2, alcobas, banos, administracion y avaluo son
las variables cuantitativas, las restantes son cualitativas (nominal u ordinal). Las posiciones de las variables
cuantitativas en el objeto datos son 1, 2, 5, 6, 9, 10, así podemos construir un marco de datos sólo con la
información cuantitativa, a continuación el código usado.
datos.cuanti <- datos[, c(1, 2, 5, 6, 9, 10)]
# La siguiente instrucción para editar los nombres de la variables
colnames(datos.cuanti) <- c('Precio', 'Área', 'Alcobas',
'Baños', 'Admon', 'Avaluo')
M <- round(cor(datos.cuanti), digits=2)
M
24
1
Precio 0.8
0.6
0.86 Área
0.4
0.2
0.19 0.31 Alcobas
−0.4
0.75 0.77 0.16 0.55 Admon
−0.6
−0.8
0.79 0.75 0.15 0.53 0.7 Avaluo
−1
En la diagonal de la Figura están las variables, por encima están unos círculos de colores, entre más intensidad
del color, ya sea azul o rojo, mayor es la correlación, colores ténues significan correlación baja; el tamaño de
los círculos está asociado al valor absoluto de correlación. Por debajo de la diagonal se observan los valores
exactos de correlación en colores.
Ejemplo 14
Construya dos vectores hipotéticos con el gasto y ahorro de un grupo de 10 familias, incluya dos N A. Calcule
el coeficiente de correlación entre ahorro y gasto, use el parámetro use para manejar los N A.
A continuación se presenta el código para crear los objetos ahorro y gasto con datos ficticios. Observe que en
el primer caso donde se calcula la correlación no es posible obtener un resultado debido a que por defecto
use=‘everything’ y por lo tanto usa todas las observaciones incluyendo los NA. En el segundo caso si se
obtiene un valor para la correlación debido a que se usó use=‘complete.obs’.
gasto <- c(170, 230, 120, 156, 256, NA, 352, 450, 670, 234)
ahorro <- c(45, 30, NA, 35, 15, 65, 15, 30, 48, 67)
cor(gasto, ahorro)
## [1] NA
# correcto
cor(gasto, ahorro, use='complete.obs')
## [1] 0.03612179
25
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de las siguientes preguntas.
1. Para cada uno de los estratos socioeconómicos, calcular el coeficiente de correlación lineal de Pearson
para las variables precio y área de la base de datos de los apartamentos usados.
2. Calcular los coeficientes de correlación Pearson, Kendall y Spearman para las variables cuantitativas
de la base de datos sobre medidas del cuerpo. La url con la información es la siguiente: https:
//raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo/
3. Represente gráficamente las matrices de correlación obtenidas en el ejercicio anterior.
4. Datos juventud de Medellín, hacer todo lo visto con esos datos.
Referencias
1. Wei, Taiyun, and Viliam Simko. 2017. Corrplot: Visualization of a Correlation Matrix. https:
//CRAN.R-project.org/package=corrplot.
2. Xie, Yihui. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman;
Hall/CRC. http://yihui.name/knitr/.
3. Xie, Yihui. 2018. Bookdown: Authoring Books and Technical Documents with R Markdown. https:
//CRAN.R-project.org/package=bookdown.
26