knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.6 v purrr 0.3.4
## v tibble 3.1.8 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.0.2 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.1.3
## Warning: package 'tibble' was built under R version 4.1.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(forecast)
## Warning: package 'forecast' was built under R version 4.1.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(dygraphs)
## Warning: package 'dygraphs' was built under R version 4.1.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.1.3
library (xts)
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
1.Simule a partir de una distribución normal con media 100 y desviación estándar 10, una serie para 10 años con observaciones mensuales.
Serie=c(rnorm(120,100,10))
Seriets=ts(Serie,start =c(2012,1),frequency=12)
plot(Seriets)
plot(Seriets, xlim=c(2016,2022))
La Siguiente grpafica no me aporta ninguna información, por lo que es necesario tomar los últimos años y compararlos con la descomposión de la serie total.
seasonplot(Seriets,col=rainbow(4),year.labels = TRUE)
grid()
subset.ts <- function(data, start, end) {
ks <- which(time(data) >= start & time(data) < end)
vec <- data[ks]
ts(vec, start=start(data) + c(0, ks[1] - 1), frequency=frequency(data))
}
sub_ts<-subset(Seriets,2019,2022)
Vamos aver sólo la estacionalidad y los ciclos de los últimos dos años y los comparamos con la gráfica de decompose
seasonplot(sub_ts,col=rainbow(4),year.labels = TRUE)
grid()
boxplot(Seriets~cycle(Seriets))
plot(decompose(Seriets))
El PAC indica que la serie completa se relaciona en un rezago, en otras palabras, el dato actual depende del dato anterior.
plot(acf(Seriets))
El PACF muestra la autocorrelación parcial y en este caso vemos que todos los rezagos están dentro del area de significancia por lo que vemos que la serie es estacionaria. La siguiente prueba estadística confirma esta hipótesis.
plot(pacf(Seriets))
Prueba de estacionariedad.
adf.test(Seriets)
## Warning in adf.test(Seriets): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: Seriets
## Dickey-Fuller = -4.7874, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
La serie es estacionaria.
Serie1ts_1=c(rnorm(300,100,10))
#window(Serie1ts_2,start=1955,end=2000)
Serie1ts_2=ts(Serie1ts_1,start =c(1950,1),frequency=6)
plot(Serie1ts_2)
plot(decompose(Serie1ts_2))
Comentar: No hay tendencia, se oberva estacionalidad en la gráfica y detrás de esto esta el teórema del limite central considerando la misma media yu desviación estandár de la pregunta anterior.
plot(acf(Serie1ts_1))
El PAC indica que la serie completa se relaciona en un rezago, en otras palabras, el dato actual depende del dato anterior.
plot(pacf(Serie1ts_1))
El PACF muestra la autocorrelación parcial y en este caso vemos que todos los rezagos están dentro del área de significancia por lo que vemos que la serie es estacionaria. La siguiente prueba estadística confirma esta hipótesis. Prueba de estacionariedad.
adf.test(Serie1ts_1)
## Warning in adf.test(Serie1ts_1): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: Serie1ts_1
## Dickey-Fuller = -6.609, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
La serie es estacionaria.
library(readr)
Electric_Production <- read_csv("C:/Users/rchang/Dropbox/curso_UNAH_Series_temporales/Electric_Production.csv",
col_types = cols(DATE = col_date(format = "%m/%d/%Y")))
summary(Electric_Production)
## DATE IPG2211A2N
## Min. :1985-01-01 Min. : 55.32
## 1st Qu.:1993-04-01 1st Qu.: 77.22
## Median :2001-07-01 Median : 90.07
## Mean :2001-07-01 Mean : 95.92
## 3rd Qu.:2009-10-01 3rd Qu.:100.97
## Max. :2018-01-01 Max. :999.00
## NA's :4
Seriets3=ts(Electric_Production$IPG2211A2N,start= 1985, frequency=12)
plot(Seriets3)
Detección outlyers
datoslimpios1 = tsoutliers(Seriets3)
datoslimpios1
## $index
## [1] 10 77 253 362 372 386 394 397
##
## $replacements
## [1] 55.71626 66.84742 112.39613 110.07479 111.88720 104.69155 92.56290
## [8] 119.07280
Limpiar valores pérdidos y outlyers
datoslimpios2=tsclean(Seriets3)
plot(datoslimpios2)
Hay 4 Nas y 8 outlyer
boxplot(datoslimpios2~cycle(datoslimpios2))
plot(decompose(datoslimpios2))
Resumen de la series descompuesta:
1.Tendencia Ascendente
seasonplot(datoslimpios2,col=rainbow(4),year.labels = TRUE)
grid()
plot(acf(datoslimpios2))
El PAC indica que la serie completa se relaciona en con 7 rezagos, en otras palabras, el dato actual depende de 7 rezagos.
plot(pacf(datoslimpios2))
El PACF muestra la autocorrelación parcial y en este caso vemos que todos los rezagos no están dentro del área de significancia. Sin embargo, se recomienda un AR2 o un modelo ARMA, dedido a que el ACF muestra oscilidad o variaciones. mientras qu el PACF muestra un rezago hasta numero 7.
Prueba de estacionariedad.
adf.test(datoslimpios2)
## Warning in adf.test(datoslimpios2): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: datoslimpios2
## Dickey-Fuller = -4.8761, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
La serie es estacionaria.
library(readr)
temp_min <- read_csv("C:/Users/rchang/Dropbox/curso_UNAH_Series_temporales/temp_min.csv",
col_types = cols(Date = col_date(format = "%m/%d/%Y"),
`Daily minimum temperatures` = col_double()))
head(temp_min)
summary(temp_min)
## Warning: One or more parsing issues, see `problems()` for details
## Date Daily minimum temperatures
## Min. :1981-01-01 Min. : 0.00
## 1st Qu.:1983-07-02 1st Qu.: 8.30
## Median :1985-12-31 Median :11.00
## Mean :1985-12-31 Mean :11.19
## 3rd Qu.:1988-06-30 3rd Qu.:14.00
## Max. :1990-12-31 Max. :26.30
## NA's :3
Seriets4=ts(temp_min$`Daily minimum temperatures`, start= 1981, frequency=365)
plot(Seriets4)
#don <- xts(x = temp_min$`Daily minimum temperatures`, order.by = temp_min$Date)
#dygraph(don)
Detección outlyers
datoslimpios3 = tsoutliers(Seriets4)
datoslimpios3
## $index
## [1] 382 385 1426 1531 2496 2513
##
## $replacements
## [1] 15.19396 19.95963 12.60565 17.58938 17.33966 15.33163
Limpiar valores pérdidos y outlyers
datoslimpios4=tsclean(Seriets4)
plot(datoslimpios4)
Hay 3 Nas y 0 outlyer
seasonplot(datoslimpios4,col=rainbow(4),year.labels = TRUE)
grid()
boxplot(datoslimpios4~cycle(datoslimpios4))
plot(decompose(datoslimpios4))
Resumen de la series descompuesta:
1.Tendencia no hay
Comentarios
Valoresperdidosnalocf=na.locf(Valoresperdidosts) plot(Valoresperdidosnalocf)
valoresperdidosfill=na.fill(Valoresperdidosts,0) plot(valoresperdidosfill)
Valoresperdidosts1=na.omit(Valoresperdidosts)
plot(acf(datoslimpios4))
El PAC indica que la serie completa se relaciona en con 15 rezagos, en otras palabras, el dato actual depende de 15 rezagos.
plot(pacf(datoslimpios4))
El PACF muestra la autocorrelación parcial y en este caso vemos que todos los rezagos no están dentro del área de significancia. La siguiente prueba estadística confirma esta hipótesis. Prueba de estacionariedad.
adf.test(datoslimpios4)
## Warning in adf.test(datoslimpios4): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: datoslimpios4
## Dickey-Fuller = -5.2214, Lag order = 15, p-value = 0.01
## alternative hypothesis: stationary
La serie es estacionaria.
library(readr)
Indice_1<- read_csv("C:/Users/rchang/Dropbox/curso_UNAH_Series_temporales/precio_cierre.csv",
col_types = cols(date = col_date(format = "%m/%d/%Y")
))
head(Indice_1)
## Warning: One or more parsing issues, see `problems()` for details
summary(Indice_1)
## date spx dax ftse
## Min. :1994-01-02 Min. : 438.9 Min. : 1912 Min. :2877
## 1st Qu.:2000-01-05 1st Qu.: 990.7 1st Qu.: 4069 1st Qu.:4486
## Median :2006-01-05 Median :1233.4 Median : 5773 Median :5662
## Mean :2006-01-06 Mean :1288.1 Mean : 6080 Mean :5423
## 3rd Qu.:2012-01-08 3rd Qu.:1460.0 3rd Qu.: 7443 3rd Qu.:6304
## Max. :2018-12-01 Max. :2872.9 Max. :13560 Max. :7779
## NA's :3804
## nikkei
## Min. : 7055
## 1st Qu.:10709
## Median :15028
## Mean :14597
## 3rd Qu.:17860
## Max. :24124
##
dax = Indice_1$dax
head(dax)
## [1] 2224.95 2225.00 2228.10 2182.06 2142.37 2151.05
Seriets5=ts(dax, start= 1994, frequency=365)
plot(Seriets5)
Detección outlyers
datoslimpios5 = tsoutliers(Seriets5)
datoslimpios5
## $index
## [1] 5521 5539 5540 5541 5542 5543 5758
##
## $replacements
## [1] 11919.162 11993.861 11991.951 11981.074 11978.262 11944.531 8987.101
Limpiar valores pérdidos y outlyers
datoslimpios5=tsclean(Seriets5)
plot(datoslimpios5)
Hay 3 Nas y 0 outlyer
seasonplot(datoslimpios5,col=rainbow(4),year.labels = TRUE)
grid()
Este gráfico nos muestra que no hay estacionalidad.
boxplot(datoslimpios5~cycle(datoslimpios5))
plot(decompose(datoslimpios5))
Resumen de la series descompuesta:
1.Tendencia a la alza
Comentarios
plot(acf(datoslimpios5))
El PAC indica que la serie completa no se puedo utilizar para un modelo MA.
plot(pacf(datoslimpios5))
El PACF nos muestra que el mejor modelo es una AR1. Pero la serie no es estacionaria como vemos en la siguiente prueba, por lo que debemos volverla estacionaria.
adf.test(datoslimpios5)
##
## Augmented Dickey-Fuller Test
##
## data: datoslimpios5
## Dickey-Fuller = -1.5816, Lag order = 18, p-value = 0.7555
## alternative hypothesis: stationary
La serie NO es estacionaria.
La siguiente funicón nos indica cuantos rezagos necesitamos para volverla estacionaria.
ndiffs(datoslimpios5)
## [1] 1
ydiff=diff(datoslimpios5,lag=1)
plot(ydiff)
adf.test(ydiff)
## Warning in adf.test(ydiff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ydiff
## Dickey-Fuller = -17.955, Lag order = 18, p-value = 0.01
## alternative hypothesis: stationary
acf(ydiff)
Observamos en el ACF que la serie esta correlacionada con ella misma por lo que el mejor modelo es un aleatorio, en otras palabras un MA.
pacf(ydiff)
###Indice ftse
library(readr)
Indice_3<- read_csv("C:/Users/rchang/Dropbox/curso_UNAH_Series_temporales/precio_cierre.csv",
col_types = cols(date = col_date(format = "%m/%d/%Y")
))
head(Indice_3)
## Warning: One or more parsing issues, see `problems()` for details
summary(Indice_3)
## date spx dax ftse
## Min. :1994-01-02 Min. : 438.9 Min. : 1912 Min. :2877
## 1st Qu.:2000-01-05 1st Qu.: 990.7 1st Qu.: 4069 1st Qu.:4486
## Median :2006-01-05 Median :1233.4 Median : 5773 Median :5662
## Mean :2006-01-06 Mean :1288.1 Mean : 6080 Mean :5423
## 3rd Qu.:2012-01-08 3rd Qu.:1460.0 3rd Qu.: 7443 3rd Qu.:6304
## Max. :2018-12-01 Max. :2872.9 Max. :13560 Max. :7779
## NA's :3804
## nikkei
## Min. : 7055
## 1st Qu.:10709
## Median :15028
## Mean :14597
## 3rd Qu.:17860
## Max. :24124
##
ftse = Indice_1$ftse
head(ftse)
## [1] 3445.98 3440.58 3413.77 3372.02 3360.01 3400.56
Seriets6=ts(ftse, start= 1994, frequency=365)
plot(Seriets6)
Detección outlyers
datoslimpios5 = tsoutliers(Seriets6)
datoslimpios5
## $index
## [1] 1236 1237 1240 3850 3854 3860 3861 3862 3879 3880 3950 3951 3952 3953 3954
## [16] 3955 3957
##
## $replacements
## [1] 4857.515 4823.473 4771.990 4236.428 4017.790 4039.669 4075.056 4156.217
## [9] 4016.176 4064.645 3830.526 3783.883 3780.062 3774.465 3765.641 3746.821
## [17] 3733.257
Limpiar valores pérdidos y outlyers
datoslimpios6=tsclean(Seriets6)
plot(datoslimpios6)
Hay 3 Nas y 0 outlyer
seasonplot(datoslimpios6,col=rainbow(4),year.labels = TRUE)
grid()
Vemos que no estacionalidad
plot(decompose(datoslimpios6))
Resumen de la series descompuesta:
1.Tendencia a la alza
plot(acf(datoslimpios6))
El PAC indica que la serie completa no se puedo utilizar para un modelo MA.
plot(pacf(datoslimpios6))
El PACF nos muestra que el mejor modelo es una AR1.
adf.test(datoslimpios6)
##
## Augmented Dickey-Fuller Test
##
## data: datoslimpios6
## Dickey-Fuller = -2.1989, Lag order = 18, p-value = 0.4941
## alternative hypothesis: stationary
La serie NO es estacionaria.
LA sisguiente función nos indica cuantos autoregresivos necesitamos para hacer la serie estacionaria.
ndiffs(datoslimpios6)
## [1] 1
ydiff1=diff(datoslimpios6,lag=1)
plot(ydiff1)
adf.test(ydiff1)
## Warning in adf.test(ydiff1): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ydiff1
## Dickey-Fuller = -19.502, Lag order = 18, p-value = 0.01
## alternative hypothesis: stationary
Se muestra que la serie esta correlacionada con ella misma. El lag de cero no debe considerarse en este programa. Por lo que se recomienda un modelo MA y no AR.
acf(ydiff1)
pacf(ydiff1)