Analisis descriptivo - UNMSM

Gabriel Carrasco-Escobar

Análsis Descriptivo

Paquetes y Data

Los paquetes que se utilizaran son:

library(tidyverse)
library(janitor)
library(pubh)
library(pracma)
library(moments)
library(doBy)
library(epiDisplay)
library(sfsmisc)
library(ggmosaic)

Para los ejercicios a continuacion se utilizaron las siguientes bases de datos:

  • Winzell2004_covar.csv
  • DHS_Peru.csv
df <- read_csv(url("https://zenodo.org/record/5053036/files/Winzell2004_covar.csv?download=1"))

peru <- read_csv(url("https://zenodo.org/record/5053060/files/DHS_Peru.csv?download=1"))

Medidas de Frecuencia

Una variable

El paquete janitor tiene la función tabyl que permite generar tablas de frecuencias y se integra en el ecosistema del tidyverse.

df %>%
  tabyl(Diet)
##  Diet   n   percent
##  chow 449 0.5307329
##    hf 397 0.4692671

tabyl permite almacenar el objeto del cálculo de frecuencias en formato tidy para su manipulación posterior.

tab1 <- df %>%
  tabyl(Diet)

View(tab1)
Diet n percent
chow 449 0.5307329
hf 397 0.4692671

Adicionalmente podemos configurar nuestra tabla con adorn_*(). Por ejemplo, podemos utilizar adorn_totals("row") para agregar el total de las filas y adorn_pct_formatting() para dar formato a la columna de porcentajes.

df %>%
  tabyl(Diet) %>%
  adorn_totals("row") %>%
  adorn_pct_formatting()
##   Diet   n percent
##   chow 449   53.1%
##     hf 397   46.9%
##  Total 846  100.0%

Dos variables

Podemos realizar tablas de doble entrada (frecuencias de 2 variables) con tabyl

df %>%
  tabyl(Diet, Sex)
##  Diet   F   M
##  chow 225 224
##    hf 200 197

Al igual que con las freuencias de una vairable podemos cambiar el formato de la tabla con adorn_*(). Más información de las opciones de formato se encuentra detallado en la documentación de janitor.

df %>%
  tabyl(Diet, Sex) %>%
  adorn_percentages("col") %>%
  adorn_pct_formatting(digits = 2) %>%
  adorn_ns()
##  Diet            F            M
##  chow 52.94% (225) 53.21% (224)
##    hf 47.06% (200) 46.79% (197)

Otro paquete con funciones útiles para medidas descriptivas es pubh (enfocado en salud pública). La función cross_tab() permite realizar también tablas de doble entrada.

df %>%
  cross_tab(Sex ~ Diet) %>%
  theme_pubh()
FMTotal
(N=425)(N=421)(N=846)
Diet
- chow225 (52.9%)224 (53.2%)449 (53.1%)
- hf 200 (47.1%)197 (46.8%)397 (46.9%)

Medidas de tendencia central

Media aritmetica

Con mean calculamos la media (promedio) de una variable. En este caso, glucose.

mean(df$glucose)
## [1] 7.006728

Mediana

A diferencia de la media, la mediana nos permite identificar el valor que divide una ditribución ordenada por la mitad

Utilizamos la función median con la variable glucose

median(df$glucose)
## [1] 7.00021

Moda

Nos da como resultado el valor mas frecuente; suele ser utilizado para variables categóricas

R no tiene una funcion en los comandos de base para calcular la moda. Utilizaremos la función Mode del paquete pracma.

Mode(df$glucose)
## [1] 7.029131

Medidas de dispersion

Rango

Se conoce como rango a la diferencia entre el valor máximo y el mínimo observados. Se lo conoce también como aplitud total o recorrido.

Utilizamos la función min y max para hallar los valores mínimos y máximos de una variable respectivamente.

c(min(df$glucose),max(df$glucose))
## [1] 5.650370 8.315831

Para hallar el rango, utilizamos la función range. Comprobamos que el resultado sea igual al de min y max.

range(df$glucose)
## [1] 5.650370 8.315831

Rango intercuartil (RIC)

Con la función IQR hallamos el rango intercuartil (percentiles 25 y 75)

IQR(df$glucose)
## [1] 0.5067847

Desviacion estandar

Con la desviación estándar calculamos el monto promedio en el que se desvían los valores observados respecto a su media artimética.

En R utilizamos la función sd.

sd(df$glucose)
## [1] 0.383118

Varianza muestral

Tambien podemos utilizar la función var para obtener el resultado de la varianza muestral.

var(df$glucose)
## [1] 0.1467794

Coeficiente de variacion

La formula para la función del coeficiente de variacion es el siguiente:

cv <- function (x) { sd(x) / mean(x) } 

Con la variable glucosa, el coeficiente de variación nos da el siguiente resultado:

cv(df$glucose)
## [1] 0.05467859

Medidas de localizacion y forma

Para explicar y entender mejor la distribución de los datos de una variable, utilizamos las medidas de asimetria estadistica (skewness) y curtosis.

Skewness

Con la funcion skewness del paquete moments calculamos la asimetría estadística.

skewness(df$glucose)
## [1] 0.001214676

Kurtosis

La curtosis es calculada con la función kurtosis del paquete moments.

kurtosis(df$glucose)
## [1] 3.355597

Multiples metricas

Con la función summary obtenemos un resumen de las principales medidas de una variable (valor mínimo, 1er quintil, mediana, media, 3er quintil, valor máximo)

summary(df$glucose)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.650   6.744   7.000   7.007   7.251   8.316

Podemos usar la función estat() del paquete pubh para obtener múltiples medidas de tendencia central en formato tidy

df %>%
  estat(~ glucose)
##             N Min. Max. Mean Median   SD   CV
## 1 glucose 846 5.65 8.32 7.01      7 0.38 0.05

Metricas estratificadas

Con la función summaryBy del paquete doBy podemos comparar múltiples métricas estratificadas por una segunda variable.

En el código a continuación, compararamos las variables glucose y Diet, utilizando los datos del objeto df, y queremos obtener la media (mean), desviación estándar (sd), mediana (median), tamaño (length), simetría (skewness) y curtosis (kurtosis)

En algunas ocasiones, debemos utilizar la función as.data.frame para cambiar el formato del objeto de tu base de datos: df <- as.data.frame(df)

summaryBy(glucose ~ Diet, data=df, 
          FUN=c(mean, sd, median, skewness, kurtosis), na.rm=T)
## # A tibble: 2 × 6
##   Diet  glucose.mean glucose.sd glucose.median glucose.skewness glucose.kurtosis
##   <chr>        <dbl>      <dbl>          <dbl>            <dbl>            <dbl>
## 1 chow          7.03      0.389           7.03           0.0835             3.21
## 2 hf            6.98      0.375           6.98          -0.118              3.48

Podemos realizar la misma rutina con la función stat() del paquete pubh dentro del ecosistema tidyverse.

Es importante notar que la variable sobre la cual vamos a estratificar nuestras métricas tiene que estar en formato factor.

df %>%
  mutate(Diet = as.factor(Diet)) %>%
  estat(glucose ~ Diet)
##           Diet   N Min. Max. Mean Median   SD   CV
## 1 glucose chow 449 5.65 8.21 7.03   7.03 0.39 0.06
## 2           hf 397 5.82 8.32 6.98   6.98 0.37 0.05

Visualizacion y Analisis de datos Exploratorio (ADE)

Analisis de una variable

Frecuencias

La función tab1 del paquete epiDisplay genera un gráfico de barras de una variable (tabulación de un solo sentido).

En el siguiente ejemplo, utilizamos la función tab1 con la variable Diet para visualizar la distribución de las freqcuencias de dietas chow y hf.

tab1(df$Diet)

## df$Diet : 
##         Frequency Percent Cum. percent
## chow          449    53.1         53.1
## hf            397    46.9        100.0
##   Total       846   100.0        100.0

La consola de R nos brindara una tabla de resumen, en el que se indica la frequencia, porcentaje y porcentaje acumulado de las variables que utilizamos.

Stem plot

Con la función stem generamos un gráfico de texto, conocido como diagrama de tallos y hojas, el cual nos permite visualizar la distribución de un grupo de observaciones.

En este caso, utilizamos la variable glucose.

stem(df$glucose)
## 
##   The decimal point is 1 digit(s) to the left of the |
## 
##   56 | 5
##   58 | 236
##   60 | 2246802245569
##   62 | 000134800111344567777888888
##   64 | 00002233334556666677788888889990011222333334444444555555666677777788
##   66 | 00000002222222233333344444444445555566677777888890000000000011111122+37
##   68 | 00000000111122222233333344444444555555566666667788888888889999999999+98
##   70 | 00000000001111222222223333333333344444444445555566666666667777777788+82
##   72 | 00000000000011111111222222222222333333334444444455555555555556666666+68
##   74 | 00111111111222223333333444455666777778888990000022223333455555667777
##   76 | 00122234788901236999
##   78 | 0112245781123689
##   80 | 12386
##   82 | 12

Histograma

Similar a la funcion stem, la función hist nos permite visualizar esta información a través de un histograma.

Nuevamente, utilizamos la variable glucose para la visualización.

hist(df$glucose)

Podemos generar el mismo gráfico en el ecosistema tidyverse con ggplot y la geomtría geom_histogram().

df %>%
  ggplot(aes(x = glucose)) +
  geom_histogram()

Anotaciones

Utilziaremos la flexibilidad gráfica de ggplot con la geometría geom_vline() para anotar nuestro histograma con las posiciones de nuestras 3 medidas de tendencia central de la variable glucose:

  1. La media, de rojo.
  2. La mediana, de azul
  3. La moda, de verde
df %>%
  ggplot(aes(x = glucose)) +
  geom_histogram() +
  geom_vline(aes(xintercept = mean(glucose)), col = "red") +
  geom_vline(aes(xintercept = median(glucose)), col = "blue") +
  geom_vline(aes(xintercept = Mode(glucose)), col = "green")

Boxplot

Usaremos la geometría geom_boxplot para generar diagramas de caja (boxplots).

df %>%
  ggplot(aes(x = glucose)) +
  geom_boxplot()

Graficos estadisticos

Podemos combinar múltiples gráficos para entender la información que proporciona cada gráfico. La función histBxp del paquete sfsmisc nos permite comparar el gráfico de histograma con el de boxplot.

histBxp(df$glucose, main="Hist y Boxplot de glucosa en ratones", xlab="Glucosa", ylab="Frecuencia")

En el paquete ggplot podemos combinar geometrias para lograr un gráfico equivalente.

df %>%
  ggplot(aes(x = glucose)) +
  geom_boxplot(width = 10) + 
  geom_histogram(fill="transparent", col = "black")

Adicionalmente podemos agregar anotaciones de las posiciones de nuestras 3 medidas de tendencia central de la variable glucose:

df %>%
  ggplot(aes(x = glucose)) +
  geom_boxplot(width = 10) + 
  geom_histogram(fill="transparent", col = "black") +
  geom_vline(aes(xintercept = mean(glucose)), col = "red") +
  geom_vline(aes(xintercept = median(glucose)), col = "blue") +
  geom_vline(aes(xintercept = Mode(glucose)), col = "green")

Comparacion de dos variables

Categorica vs. Categroica

Los gráficos de mosaicos nos permite comparar dos variables categoricas. Usaremos la geometría geom_mosaic() del paquete ggmosaic

df %>%
  ggplot() + 
  geom_mosaic(aes(x = product(Sex, Diet), fill = Sex))

Continua vs. Continua

Para comparar dos variables continuas en un grafico de dispersion, utilizamos la geometría geom_point en ggplot.

Para el ejemplo usaremos las variables Bodyweight y glucose

df %>%
  ggplot(aes(x = Bodyweight, y = glucose)) +
  geom_point()

Continua vs. Categorica

df %>%
  ggplot(aes(x = Diet, y = Bodyweight)) +
  geom_boxplot()
## Warning: Removed 5 rows containing non-finite values (stat_boxplot).

Ejercicios

Ejercicio 1

  • EJERCICIO Realiza exploracion grafica para determinar si las variables en_intake y time tienen distribucion normal. Utiliza la geometría geom_vline() para complementar tus hallazgos.

Ejercicio 2

  • EJERCICIO Compara la dispersión de meta_eff y ein_resp

Ejercicio 3

  • EJERCICIO A Explora y compara en_intake y ein_respen terminos de skewness

  • EJERCICIO B Explora y compara insulin y meta_effen terminos de Curtosis