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))
  1. Grafique la serie de tiempo
Seriets=ts(Serie,start =c(2012,1),frequency=12)
plot(Seriets)

plot(Seriets, xlim=c(2016,2022))

  1. Realice la descomposición de la misma y comente

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.

  1. Simule una serie de tiempo con datos bimestrales para 50 años
Serie1ts_1=c(rnorm(300,100,10))
#window(Serie1ts_2,start=1955,end=2000)
  1. Grafique la serie de tiempo
Serie1ts_2=ts(Serie1ts_1,start =c(1950,1),frequency=6)
plot(Serie1ts_2)

  1. Realice la descomposición de la misma y comente
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.

  1. Importe la base Electric_Production
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)

  1. Comente si hay presencia de outliers y valores faltantes (presente el análisis)

Hay 4 Nas y 8 outlyer

  1. Haga el tratamiento de la serie y con los datos limpios grafíquela, haga la descomposición y presente el análisis el análisis
boxplot(datoslimpios2~cycle(datoslimpios2))

plot(decompose(datoslimpios2))

Resumen de la series descompuesta:

1.Tendencia Ascendente

  1. Se marca estacionalidad en los meses de enero, julio y diciembre, pero hay que hacer otras pruebas estadpisticas al modelo.
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.

  1. Analice la serie dada en la base de temperaturas mínimas diarias
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)

  1. Comente si hay presencia de outliers y valores faltantes (presente el análisis)

Hay 3 Nas y 0 outlyer

  1. Haga el tratamiento de la serie y con los datos limpios grafíquela, haga la descomposición y presente el análisis el análisis
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

  1. No hay estacionalidad

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.

  1. Seleccione dos indices de la base de datos precio cierre.
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)

  1. Comente si hay presencia de outliers y valores faltantes (presente el análisis)

Hay 3 Nas y 0 outlyer

  1. Haga el tratamiento de la serie y con los datos limpios grafíquela, haga la descomposición y presente el análisis el análisis
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

  1. Aparente tener estacionalidad, pero en el gráfico de arriba vemos que no hay patrones.

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)

  1. Comente si hay presencia de outliers y valores faltantes (presente el análisis)

Hay 3 Nas y 0 outlyer

  1. Haga el tratamiento de la serie y con los datos limpios grafíquela, haga la descomposición y presente el análisis el análisis
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

  1. Aparente tener estacionalidad, pero en el gráfico de arriba vemos que no hay patrones.
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)