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(moments)
library(tseries)
Generamos de forma aleatoria una data llamada my_data, esta es un ejemplo de datos aleatorios para ilustrar el proceso.
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)
)
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.
select_if(is.numeric) %>%
colnames()
[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.
dplyr::select(all_of(numeric_columns)) %>%
varianza = apply(., 2, var),
media = apply(., 2, mean)
)
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.
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.
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
})
)
print(stats)