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

Cargando 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.

Formato ancho al formato largo

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))

Transformando datos del formato largo a ancho

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