22 may 2024

Usar la función summarise+apply en dplyr

En la siguiente entrada, se simula una data, que contienen diferentes tipos de series, con el objetivo de mostrar, como al combinar las funciones summarise (del paquete dplyr) y la función apply (base de R), podemos obtener resúmenes estadísticos de un conjunto de variables, incluyendo test formales como el Dickey Fuller, o estadísticos como el coeficiente de autocorrelación. Puntualmente, tentemos una base de datos con 30 variables y deseamos obtener una tabla donde a cada variable le calculemos el promedio y la desviación estándar.

library(dplyr)
library(moments)
library(tseries)

Generamos de forma aleatoria una data llamada my_data, esta es un ejemplo de datos aleatorios para ilustrar el proceso.

set.seed(123)
my_data <- data.frame(
  serie1 = rnorm(100),
  serie2 = rnorm(100),
  fecha = as.Date("2024-01-01") + 0:99,
  serie3 = rnorm(100),
  categoria = sample(c("A", "B", "C"), 100, replace = TRUE)
)
 
          serie1      serie2      fecha      serie3 categoria
1   -0.560475647 -0.71040656 2024-01-01  2.19881035         B
2   -0.230177489  0.25688371 2024-01-02  1.31241298         A
3    1.558708314 -0.24669188 2024-01-03 -0.26514506         C
4    0.070508391 -0.34754260 2024-01-04  0.54319406         C
5    0.129287735 -0.95161857 2024-01-05 -0.41433995         C

Ahora creamos un filtro para seleccionar únicamente las series numéricas dentro de mi base de datos, dato que puede contener fechas y caracteres. Es decir, las series 1,2 y 3.

numeric_columns <- my_data %>%
  select_if(is.numeric) %>%
  colnames()
 
umeric_columns
[1] "serie1" "serie2" "serie3"

Ahora, usamos select para recuperar las variables numéricas y luego a cada columna de aplicamos la opción deseada combinando summarise y apply como se muestra en los siguientes ejemplos.

my_data %>%
  dplyr::select(all_of(numeric_columns)) %>%
  summarise(
    varianza = apply(., 2, var),
    media = apply(., 2, mean)
  )
 
varianza       media
1 0.8332328  0.09040591
2 0.9350631 -0.10754680
3 0.9022700  0.12046511

Finalmente, calculamos para cada columna (numérica, porque solo va a trabajar con las condiciones impuestas por alguna operación lógica), se estimarán los estadísticos indicados, y los organizara en un cuadro. Usamos la función select del paquete dplyr, esta se indica el nombre del paquete, dado que puede coincidir con funciones de otros paquetes y generar errores. Además, usamos mutate, para colocar el nombre en cada fila, permitiendo la lectura de los datos.

Error in select(., all_of(numeric_columns)) :
  unused argument (all_of(numeric_columns))

Posteriormente, se solicita un resumen de la data, pero realizada a cada una de las columnas usando apply. En el caso de funciones menos directas, como el p valor del test DF, se inserta una fusión que permita extraerlo.  

stats <- my_data %>%
  dplyr::select(all_of(numeric_columns)) %>%
  summarise(
    varianza = apply(., 2, var),
    asimetria = apply(., 2, skewness),
    curtosis = apply(., 2, kurtosis),
    autocorr_lag1 = apply(., 2, function(x) {
      acf(x, plot = FALSE)$acf[2]
    }),
    p_valor_dickey_fuller = apply(., 2, function(x) {
      adf.test(x)$p.value
    })
  )
 
# Imprimir las estadísticas
print(stats)

Estimar un modelo de regresión lineal univariada con muestreo de Gibbs (estadística bayesiana)

  1.1.            Simulando datos Primero simulamos los datos, asumiendo un beta1 real de 0.5. Puntualmente se generan dos variables aleat...