library(tidyverse)
library(readxl)
Supongamos que queremos construir un modelo predictivo para una serie de tiempo usando tasas de inflación de Alemania. Primeramente cargamos nuestros datos
Df=read_xlsx("C:/Users/HP/Documents/Manual tidyverse/data/germaninfl.xlsx", col_names = F) # cargamos datos
colnames(Df)=c("Año", "Ene", # establecemos nombres a las columnas
"Feb",
"Mar",
"Abr",
"May",
"Jun",
"Jul",
"Ago",
"Sep",
"Oct",
"Nov",
"Dic")
head(Df)
## # A tibble: 6 x 13
## Año Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
## <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 2008 -0.31 0.41 0.51 -0.20 0.61 0.20 0.61 -0.30 -0.10 -0.20 -0.51 0.41
## 2 2009 -0.51 0.61 -0.20 0.10 -0.10 0.30 0.00 0.20 -0.30 0.00 -0.10 0.81
## 3 2010 -0.60 0.40 0.50 0.10 -0.10 0.00 0.20 0.10 -0.10 0.10 0.10 0.60
## 4 2011 -0.20 0.60 0.59 0.00 0.00 0.10 0.20 0.10 0.20 0.00 0.20 0.19
## 5 2012 -0.10 0.68 0.58 -0.19 0.00 -0.19 0.39 0.38 0.10 0.00 0.10 0.29
## 6 2013 -0.48 0.57 0.48 -0.47 0.38 0.09 0.47 0.00 0.00 -0.19 0.19 0.38
Observamos que los datos están en forma de matriz, para generar una serie de tiempo necesitamos que cada mes sea una observación.
Usaremos la función pivot_longer() para transformar los datos a formato largo. Primero indicamos en un vector, las columnas de nuestros datos a transformar, seguido como cadenas, los nombres de las columnas con la nueva clave y los valores
Df2=Df %>% pivot_longer(Ene:Dic, names_to = "Mes", values_to = "Inflación")
head(Df2,20)
## # A tibble: 20 x 3
## Año Mes Inflación
## <dbl> <chr> <chr>
## 1 2008 Ene -0.31
## 2 2008 Feb 0.41
## 3 2008 Mar 0.51
## 4 2008 Abr -0.20
## 5 2008 May 0.61
## 6 2008 Jun 0.20
## 7 2008 Jul 0.61
## 8 2008 Ago -0.30
## 9 2008 Sep -0.10
## 10 2008 Oct -0.20
## 11 2008 Nov -0.51
## 12 2008 Dic 0.41
## 13 2009 Ene -0.51
## 14 2009 Feb 0.61
## 15 2009 Mar -0.20
## 16 2009 Abr 0.10
## 17 2009 May -0.10
## 18 2009 Jun 0.30
## 19 2009 Jul 0.00
## 20 2009 Ago 0.20
Como vemos ahora cada mes es una observación. Cambiamos el tipo de dato de inflación a numérico y generamos la serie de tiempo con los datos del dataframe transformado
Df2$Inflación= as.numeric(Df2$Inflación) # cambiamos tipo de dato
serie1 = ts(na.omit(Df2$Inflación), start=c(2008,1), frequency = 12) # generamos la serie y removemos valores nulos
serie1
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2008 -0.31 0.41 0.51 -0.20 0.61 0.20 0.61 -0.30 -0.10 -0.20 -0.51 0.41
## 2009 -0.51 0.61 -0.20 0.10 -0.10 0.30 0.00 0.20 -0.30 0.00 -0.10 0.81
## 2010 -0.60 0.40 0.50 0.10 -0.10 0.00 0.20 0.10 -0.10 0.10 0.10 0.60
## 2011 -0.20 0.60 0.59 0.00 0.00 0.10 0.20 0.10 0.20 0.00 0.20 0.19
## 2012 -0.10 0.68 0.58 -0.19 0.00 -0.19 0.39 0.38 0.10 0.00 0.10 0.29
## 2013 -0.48 0.57 0.48 -0.47 0.38 0.09 0.47 0.00 0.00 -0.19 0.19 0.38
## 2014 -0.56 0.47 0.28 -0.19 -0.09 0.28 0.28 0.00 0.00 -0.28 0.00 0.00
## 2015 -1.03 0.85 0.47 0.00 0.09 -0.09 0.19 0.00 -0.19 0.00 0.09 -0.09
## 2016 -0.84 0.38 0.75 -0.37 0.28 0.09 0.28 0.00 0.09 0.19 0.09 0.74
## 2017 -0.64 0.65 0.18 0.00 -0.18 0.18 0.37 0.09 0.09 0.00
Ahora con auto.arima, ajustamos un modelo para hacer predicciones
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
modelo = auto.arima(serie1)
autoplot(forecast(modelo, h=10))
Como ejercicio transformaremos al formato ancho los mismos datos que usamos para crear la serie temporal, usando la función pivot_wider(). Pasamos como argumentos la columna de donde obtendremos los nombres de las columnas resultantes, y de qué columna obtendremos los valores de cada celda
Df2 %>% pivot_wider(names_from = Mes, values_from = Inflación)
## # A tibble: 10 x 13
## Año Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2008 -0.31 0.41 0.51 -0.2 0.61 0.2 0.61 -0.3 -0.1 -0.2 -0.51 0.41
## 2 2009 -0.51 0.61 -0.2 0.1 -0.1 0.3 0 0.2 -0.3 0 -0.1 0.81
## 3 2010 -0.6 0.4 0.5 0.1 -0.1 0 0.2 0.1 -0.1 0.1 0.1 0.6
## 4 2011 -0.2 0.6 0.59 0 0 0.1 0.2 0.1 0.2 0 0.2 0.19
## 5 2012 -0.1 0.68 0.58 -0.19 0 -0.19 0.39 0.38 0.1 0 0.1 0.29
## 6 2013 -0.48 0.57 0.48 -0.47 0.38 0.09 0.47 0 0 -0.19 0.19 0.38
## 7 2014 -0.56 0.47 0.28 -0.19 -0.09 0.28 0.28 0 0 -0.28 0 0
## 8 2015 -1.03 0.85 0.47 0 0.09 -0.09 0.19 0 -0.19 0 0.09 -0.09
## 9 2016 -0.84 0.38 0.75 -0.37 0.28 0.09 0.28 0 0.09 0.19 0.09 0.74
## 10 2017 -0.64 0.65 0.18 0 -0.18 0.18 0.37 0.09 0.09 0 NA NA