Análisis y pronóstico de series de tiempo con R

Introducción

En este documento se explica lo relacionado al pronóstico de series de tiempo. Lo cual comprende:

Elaborando la serie de tiempo en R Análisis de la serie de tiempo Pronóstico de la serie de tiempo Estimación de errores de pronóstico Para el análisis de series de tiempo en R, existen una gran variedad de librerias. En este tutorial se emplea la libreria fpp2, la cual contiene contiene:

La libreria forecast, que contiene funciones de pronóstico La libreria ggplot2, que contiene funciones para gráficos Esta libreria se instala y se carga mediante install.packages(“fpp2”)y library(fpp2) respectivamente.

Elaborando la serie de tiempo en R Cargando librerias y datos Recordemos que se puede leer datos directamente desde una API, SQL u otros medios. Para este tutorial empleo la lectura de datos desde Excel. Entonces para ello emplearemos las siguientes funciones:

La función head() nos muestra los primeros datos de nuestra tabla de datos

library(fpp2)
## Warning: package 'fpp2' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## ── Attaching packages ────────────────────────────────────────────── fpp2 2.5 ──
## ✔ ggplot2   3.4.2      ✔ fma       2.5   
## ✔ forecast  8.22.0     ✔ expsmooth 2.3
## Warning: package 'forecast' was built under R version 4.3.3
## Warning: package 'fma' was built under R version 4.3.3
## Warning: package 'expsmooth' was built under R version 4.3.3
## 
AirPassengers
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432

Creando el objeto de serie de tiempo La serie de tiempo se debe almacenar en el objeto ts empleando la función ts(). El empleo de esta función es de la siguiente forma : serie <- ts(data, frequency= ,start=). Donde el primer agumento es un vector de datos. Luego los dos siguientes argumentos se indican de acuerdo a la siguiente tabla.

Frecuencia frequency= start=
Anual 1 2000
Trimestral 4 c(2000,2)
Mensual 12 c(2000,9)
Diario 7 o 365.25 1 o c(2000,234)
Semanal 52.18 c(2000,23)
Horario 24 o 168 o 8766 1
Cada 30 min 48 o 336 o 17532 1

En el siguiente fragmento de código definimos el objeto de la serie de tiempo y lo almacenaremos en data_serie.

file_path <- "C:/Users/TELEMATICA-LAB/Documents/JEFF/DATOSTEMP.csv"
dataeliana<- read.csv(file_path)
dataeliana
##     DATOS
## 1   25.50
## 2   25.76
## 3   26.30
## 4   25.61
## 5   25.30
## 6   23.90
## 7   23.70
## 8   23.60
## 9   24.30
## 10  24.60
## 11  24.60
## 12  25.80
## 13  24.50
## 14  25.20
## 15  25.60
## 16  25.40
## 17  25.20
## 18  23.80
## 19  23.50
## 20  23.40
## 21  22.40
## 22  22.40
## 23  24.10
## 24  24.60
## 25  25.00
## 26  25.30
## 27  25.30
## 28  25.70
## 29  25.60
## 30  24.50
## 31  22.20
## 32  22.30
## 33  22.10
## 34  22.20
## 35  22.80
## 36  24.20
## 37  25.00
## 38  25.50
## 39  26.00
## 40  26.30
## 41  24.90
## 42  23.10
## 43  23.56
## 44  23.36
## 45  23.71
## 46  23.86
## 47  24.14
## 48  24.87
## 49  26.70
## 50  27.20
## 51  26.11
## 52  26.07
## 53  25.76
## 54  25.20
## 55  23.60
## 56  23.20
## 57  24.30
## 58  23.60
## 59  24.83
## 60  25.70
## 61  27.00
## 62  27.00
## 63  27.80
## 64  27.50
## 65  26.57
## 66  25.33
## 67  25.00
## 68  25.57
## 69  25.67
## 70  26.30
## 71  25.53
## 72  26.57
## 73  26.63
## 74  25.50
## 75  27.30
## 76  28.27
## 77  26.10
## 78  24.07
## 79  23.53
## 80  25.43
## 81  25.73
## 82  25.13
## 83  26.47
## 84  26.90
## 85  26.50
## 86  25.47
## 87  26.57
## 88  26.57
## 89  26.23
## 90  24.83
## 91  23.60
## 92  24.67
## 93  25.60
## 94  25.97
## 95  25.50
## 96  25.67
## 97  26.23
## 98  25.37
## 99  26.20
## 100 25.50
## 101 25.47
## 102 23.93
## 103 22.33
## 104 25.40
## 105 25.10
## 106 25.07
## 107 25.23
## 108 27.03
## 109 26.03
## 110 25.37
## 111 26.20
## 112 24.77
## 113 24.83
## 114 23.30
## 115 23.13
## 116 24.70
## 117 24.27
## 118 25.03
## 119 24.13
## 120 26.17
## 121 25.33
## 122 26.03
## 123 26.27
## 124 25.97
## 125 24.63
## 126 23.77
## 127 22.23
## 128 23.80
## 129 24.80
## 130 25.20
## 131 25.27
## 132 24.33
## 133 25.80
## 134 26.00
## 135 25.90
## 136 26.07
## 137 26.20
## 138 25.67
## 139 24.03
## 140 24.50
## 141 24.93
## 142 24.77
## 143 25.03
## 144 26.10
## 145 26.57
## 146 26.17
## 147 26.07
## 148 25.90
## 149 25.60
## 150 23.57
## 151 23.43
## 152 24.30
## 153 24.77
## 154 24.83
## 155 25.33
## 156 25.73
## 157 25.90
## 158 26.07
## 159 25.67
## 160 26.73
## 161 26.13
## 162 24.30
## 163 24.13
## 164 24.80
## 165 24.67
## 166 25.17
## 167 24.30
## 168 25.80
## 169 25.63
## 170 25.60
## 171 26.20
## 172 26.67
## 173 24.40
## 174 23.97
## 175 23.83
## 176 25.43
## 177 25.67
## 178 25.37
## 179 24.73
## 180 25.57
## 181 26.20
## 182 26.47
## 183 26.57
## 184 26.97
## 185 26.43
## 186 25.57
## 187 24.13
## 188 24.67
## 189 25.53
## 190 25.17
## 191 25.80
## 192 26.27
## 193 26.27
## 194 26.40
## 195 26.07
## 196 26.90
## 197 25.63
## 198 24.90
## 199 23.57
## 200 23.93
## 201 24.63
## 202 25.63
## 203 25.83
## 204 25.90
## 205 25.47
## 206 25.67
## 207 26.30
## 208 26.47
## 209 24.93
## 210 24.80
## 211 23.27
## 212 23.87
## 213 25.77
## 214 24.53
## 215 25.10
## 216 26.33
## 217 25.63
## 218 26.23
## 219 26.27
## 220 26.93
## 221 26.63
## 222 26.37
## 223 25.30
## 224 25.33
## 225 25.27
## 226 25.53
## 227 25.33
## 228 26.70
## 229 27.13
## 230 26.60
## 231 26.30
## 232 26.97
## 233 26.57
## 234 24.93
## 235 23.40
## 236 24.77
## 237 25.33
## 238 24.93
## 239 25.37
## 240 25.20
## 241 25.50
## 242 25.73
## 243 26.20
## 244 26.13
## 245 25.63
## 246 24.23
## 247 23.17
## 248 24.63
## 249 25.27
## 250 24.90
## 251 25.60
## 252 25.40
## 253 25.50
## 254 25.67
## 255 26.50
## 256 26.60
## 257 25.83
## 258 24.83
## 259 23.60
## 260 23.90
## 261 24.47
## 262 25.53
## 263 25.37
## 264 25.70
## 265 25.33
## 266 25.93
## 267 26.33
## 268 26.47
## 269 26.60
## 270 25.73
## 271 25.43
## 272 25.20
## 273 25.40
## 274 25.10
## 275 26.87
## 276 27.13
## 277 26.90
## 278 26.87
## 279 26.90
## 280 26.60
## 281 25.67
## 282 25.23
## 283 23.93
## 284 24.10
## 285 25.60
## 286 25.23
## 287 25.47
## 288 27.40
## 289 26.37
## 290 26.93
## 291 26.80
## 292 26.57
## 293 26.30
## 294 24.67
## 295 24.13
## 296 24.90
## 297 25.83
## 298 25.57
## 299 26.37
## 300 26.67
## 301 26.43
## 302 26.57
## 303 26.53
## 304 27.00
## 305 26.33
## 306 25.77
## 307 24.33
## 308 25.57
## 309 26.00
## 310 26.40
## 311 26.57
## 312 27.17
## 313 26.97
## 314 26.23
## 315 26.63
## 316 27.20
## 317 26.87
## 318 25.37
## 319 23.87
## 320 23.93
## 321 25.23
## 322 25.80
## 323 25.60
## 324 26.13
## 325 26.20
## 326 26.17
## 327 26.43
## 328 26.67
## 329 24.67
## 330 24.50
## 331 24.50
## 332 23.63
## 333 25.47
## 334 25.23
## 335 26.40
## 336 26.20
## 337 26.03
## 338 26.53
## 339 27.00
## 340 26.53
## 341 25.17
## 342 24.90
## 343 25.10
## 344 25.77
## 345 26.20
## 346 25.90
## 347 26.83
## 348 27.07
## 349 27.93
## 350 28.23
## 351 28.27
## 352 27.97
## 353 27.70
## 354 27.50
## 355 27.30
## 356 26.90
## 357 26.17
## 358 25.67
## 359 26.33
## 360 26.23
## 361 26.47
## 362 26.77
## 363 26.93
## 364 26.87
## 365 26.23
## 366 26.07
## 367 23.97
## 368 24.33
## 369 25.03
## 370 25.70
## 371 25.77
## 372 26.33
## 373 25.37
## 374 26.13
## 375 26.37
## 376 26.67
## 377 25.57
## 378 25.57
## 379 23.17
## 380 24.53
## 381 25.97
## 382 25.90
## 383 25.97
## 384 26.40
## 385 25.60
## 386 26.37
## 387 26.93
## 388 26.57
## 389 25.00
## 390 24.13
## 391 24.63
## 392 24.43
## 393 25.77
## 394 26.03
## 395 26.17
## 396 25.57
## 397 26.73
## 398 27.13
## 399 27.17
## 400 27.23
## 401 26.80
## 402 25.63
## 403 25.13
## 404 25.33
## 405 26.13
## 406 27.37
## 407 26.67
## 408 27.27
## 409 26.53
## 410 27.07
## 411 26.63
## 412 26.83
## 413 26.80
## 414 24.60
## 415 24.40
## 416 24.23
## 417 25.60
## 418 25.43
## 419 26.83
## 420 25.77
## 421 25.70
## 422 26.37
## 423 26.70
## 424 26.67
## 425 26.13
## 426 24.37
## 427 24.50
## 428 24.07
## 429 24.97
## 430 25.90
## 431 26.67
## 432 26.13
## 433 26.90
## 434 26.53
## 435 27.37
## 436 27.30
## 437 26.67
## 438 26.30
## 439 24.43
## 440 24.87
## 441 25.97
## 442 26.07
## 443 26.63
## 444 27.30
## 445 26.73
## 446 26.67
## 447 27.47
## 448 27.30
## 449 26.90
## 450 25.80
## 451 25.23
## 452 24.50
## 453 25.47
## 454 26.17
## 455 27.20
## 456 26.10
## 457 26.43
## 458 26.80
## 459 27.37
## 460 27.90
## 461 26.97
## 462 26.50
## 463 24.73
## 464 24.57
## 465 25.50
## 466 25.90
## 467 25.57
## 468 26.07
## 469 25.80
## 470 26.10
## 471 27.03
## 472 27.07
## 473 26.90
## 474 25.47
## 475 25.03
## 476 24.30
## 477 25.67
## 478 26.20
## 479 26.30
## 480 26.77
## 481 26.07
## 482 26.07
## 483 26.30
## 484 26.47
## 485 26.20
## 486 24.90
## 487 23.97
## 488 23.97
## 489 25.37
## 490 25.43
## 491 25.90
## 492 26.47
## 493 26.37
## 494 26.10
## 495 27.03
## 496 26.60
## 497 26.53
## 498 25.63
## 499 25.13
## 500 24.80
## 501 25.67
## 502 24.90
## 503 26.30
## 504 26.47
## 505 25.63
## 506 26.03
## 507 26.27
## 508 26.37
## 509 25.67
## 510 24.53
## 511 23.87
## 512 24.63
## 513 25.53
## 514 25.63
## 515 25.57
## 516 27.03
## 517 25.60
## 518 26.27
## 519 26.23
## 520 26.67
## 521 27.10
## 522 26.90
## 523 26.87
## 524 26.40
## 525 26.87
## 526 26.73
## 527 26.83
## 528 27.43
## 529 27.60
## 530 27.73
## 531 27.68
## 532 27.50
## 533 28.22
## 534 26.70
## 535 26.13
## 536 25.10
## 537 27.01
## 538 25.33
## 539 25.30
## 540 24.97
## 541 26.37
## 542 26.03
## 543 26.67
## 544 26.20
## 545 25.80
## 546 24.07
## 547 23.80
## 548 23.77
## 549 25.60
## 550 24.77
## 551 26.17
## 552 25.57
## 553 25.57
## 554 26.17
## 555 26.37
## 556 26.03
## 557 25.43
## 558 24.93
## 559 23.53
## 560 24.67
## 561 25.40
## 562 25.63
## 563 25.40
## 564 26.67
## 565 26.97
## 566 26.30
## 567 26.59
## 568 26.83
## 569 25.93
## 570 23.37
## 571 24.17
## 572 24.17
## 573 25.40
## 574 26.64
## 575 25.97
## 576 26.67
## 577 27.03
## 578 26.63
## 579 27.00
## 580 26.73
## 581 26.93
## 582 25.33
## 583 24.40
## 584 24.10
## 585 26.17
## 586 25.74
## 587 25.97
## 588 26.80
## 589 26.27
## 590 26.97
## 591 27.23
## 592 27.13
## 593 26.60
## 594 24.63
## 595 24.65
## 596 24.80
## 597 24.80
## 598 26.17
## 599 26.43
## 600 26.00
## 601 26.83
## 602 26.63
## 603 27.17
## 604 27.19
## 605 27.03
## 606 24.33
## 607 24.73
## 608 24.53
## 609 25.53
## 610 26.20
## 611 26.17
## 612 27.33
## 613 27.17
## 614 26.13
## 615 27.03
## 616 27.37
## 617 25.73
## 618 25.63
## 619 24.10
## 620 24.27
## 621 25.77
## 622 25.37
## 623 24.33
## 624 26.25
## 625 26.63
## 626 26.90
## 627 27.10
## 628 27.03
## 629 26.03
## 630 24.80
## 631 24.50
## 632 26.00
## 633 26.47
## 634 26.37
## 635 27.00
## 636 26.47
## 637 27.03
## 638 26.97
## 639 26.53
## 640 27.23
## 641 26.40
## 642 25.30
## 643 24.20
## 644 23.97
## 645 25.13
## 646 25.43
## 647 26.07
## 648 25.53
## 649 25.57
## 650 26.07
## 651 26.90
## 652 26.97
## 653 26.40
## 654 25.57
## 655 25.17
## 656 25.03
## 657 25.23
## 658 25.83
## 659 25.67
## 660 26.67
View(dataeliana)


data_serie <- ts(dataeliana$DATOS, frequency=12, start=1946)

data_serie
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 1946 25.50 25.76 26.30 25.61 25.30 23.90 23.70 23.60 24.30 24.60 24.60 25.80
## 1947 24.50 25.20 25.60 25.40 25.20 23.80 23.50 23.40 22.40 22.40 24.10 24.60
## 1948 25.00 25.30 25.30 25.70 25.60 24.50 22.20 22.30 22.10 22.20 22.80 24.20
## 1949 25.00 25.50 26.00 26.30 24.90 23.10 23.56 23.36 23.71 23.86 24.14 24.87
## 1950 26.70 27.20 26.11 26.07 25.76 25.20 23.60 23.20 24.30 23.60 24.83 25.70
## 1951 27.00 27.00 27.80 27.50 26.57 25.33 25.00 25.57 25.67 26.30 25.53 26.57
## 1952 26.63 25.50 27.30 28.27 26.10 24.07 23.53 25.43 25.73 25.13 26.47 26.90
## 1953 26.50 25.47 26.57 26.57 26.23 24.83 23.60 24.67 25.60 25.97 25.50 25.67
## 1954 26.23 25.37 26.20 25.50 25.47 23.93 22.33 25.40 25.10 25.07 25.23 27.03
## 1955 26.03 25.37 26.20 24.77 24.83 23.30 23.13 24.70 24.27 25.03 24.13 26.17
## 1956 25.33 26.03 26.27 25.97 24.63 23.77 22.23 23.80 24.80 25.20 25.27 24.33
## 1957 25.80 26.00 25.90 26.07 26.20 25.67 24.03 24.50 24.93 24.77 25.03 26.10
## 1958 26.57 26.17 26.07 25.90 25.60 23.57 23.43 24.30 24.77 24.83 25.33 25.73
## 1959 25.90 26.07 25.67 26.73 26.13 24.30 24.13 24.80 24.67 25.17 24.30 25.80
## 1960 25.63 25.60 26.20 26.67 24.40 23.97 23.83 25.43 25.67 25.37 24.73 25.57
## 1961 26.20 26.47 26.57 26.97 26.43 25.57 24.13 24.67 25.53 25.17 25.80 26.27
## 1962 26.27 26.40 26.07 26.90 25.63 24.90 23.57 23.93 24.63 25.63 25.83 25.90
## 1963 25.47 25.67 26.30 26.47 24.93 24.80 23.27 23.87 25.77 24.53 25.10 26.33
## 1964 25.63 26.23 26.27 26.93 26.63 26.37 25.30 25.33 25.27 25.53 25.33 26.70
## 1965 27.13 26.60 26.30 26.97 26.57 24.93 23.40 24.77 25.33 24.93 25.37 25.20
## 1966 25.50 25.73 26.20 26.13 25.63 24.23 23.17 24.63 25.27 24.90 25.60 25.40
## 1967 25.50 25.67 26.50 26.60 25.83 24.83 23.60 23.90 24.47 25.53 25.37 25.70
## 1968 25.33 25.93 26.33 26.47 26.60 25.73 25.43 25.20 25.40 25.10 26.87 27.13
## 1969 26.90 26.87 26.90 26.60 25.67 25.23 23.93 24.10 25.60 25.23 25.47 27.40
## 1970 26.37 26.93 26.80 26.57 26.30 24.67 24.13 24.90 25.83 25.57 26.37 26.67
## 1971 26.43 26.57 26.53 27.00 26.33 25.77 24.33 25.57 26.00 26.40 26.57 27.17
## 1972 26.97 26.23 26.63 27.20 26.87 25.37 23.87 23.93 25.23 25.80 25.60 26.13
## 1973 26.20 26.17 26.43 26.67 24.67 24.50 24.50 23.63 25.47 25.23 26.40 26.20
## 1974 26.03 26.53 27.00 26.53 25.17 24.90 25.10 25.77 26.20 25.90 26.83 27.07
## 1975 27.93 28.23 28.27 27.97 27.70 27.50 27.30 26.90 26.17 25.67 26.33 26.23
## 1976 26.47 26.77 26.93 26.87 26.23 26.07 23.97 24.33 25.03 25.70 25.77 26.33
## 1977 25.37 26.13 26.37 26.67 25.57 25.57 23.17 24.53 25.97 25.90 25.97 26.40
## 1978 25.60 26.37 26.93 26.57 25.00 24.13 24.63 24.43 25.77 26.03 26.17 25.57
## 1979 26.73 27.13 27.17 27.23 26.80 25.63 25.13 25.33 26.13 27.37 26.67 27.27
## 1980 26.53 27.07 26.63 26.83 26.80 24.60 24.40 24.23 25.60 25.43 26.83 25.77
## 1981 25.70 26.37 26.70 26.67 26.13 24.37 24.50 24.07 24.97 25.90 26.67 26.13
## 1982 26.90 26.53 27.37 27.30 26.67 26.30 24.43 24.87 25.97 26.07 26.63 27.30
## 1983 26.73 26.67 27.47 27.30 26.90 25.80 25.23 24.50 25.47 26.17 27.20 26.10
## 1984 26.43 26.80 27.37 27.90 26.97 26.50 24.73 24.57 25.50 25.90 25.57 26.07
## 1985 25.80 26.10 27.03 27.07 26.90 25.47 25.03 24.30 25.67 26.20 26.30 26.77
## 1986 26.07 26.07 26.30 26.47 26.20 24.90 23.97 23.97 25.37 25.43 25.90 26.47
## 1987 26.37 26.10 27.03 26.60 26.53 25.63 25.13 24.80 25.67 24.90 26.30 26.47
## 1988 25.63 26.03 26.27 26.37 25.67 24.53 23.87 24.63 25.53 25.63 25.57 27.03
## 1989 25.60 26.27 26.23 26.67 27.10 26.90 26.87 26.40 26.87 26.73 26.83 27.43
## 1990 27.60 27.73 27.68 27.50 28.22 26.70 26.13 25.10 27.01 25.33 25.30 24.97
## 1991 26.37 26.03 26.67 26.20 25.80 24.07 23.80 23.77 25.60 24.77 26.17 25.57
## 1992 25.57 26.17 26.37 26.03 25.43 24.93 23.53 24.67 25.40 25.63 25.40 26.67
## 1993 26.97 26.30 26.59 26.83 25.93 23.37 24.17 24.17 25.40 26.64 25.97 26.67
## 1994 27.03 26.63 27.00 26.73 26.93 25.33 24.40 24.10 26.17 25.74 25.97 26.80
## 1995 26.27 26.97 27.23 27.13 26.60 24.63 24.65 24.80 24.80 26.17 26.43 26.00
## 1996 26.83 26.63 27.17 27.19 27.03 24.33 24.73 24.53 25.53 26.20 26.17 27.33
## 1997 27.17 26.13 27.03 27.37 25.73 25.63 24.10 24.27 25.77 25.37 24.33 26.25
## 1998 26.63 26.90 27.10 27.03 26.03 24.80 24.50 26.00 26.47 26.37 27.00 26.47
## 1999 27.03 26.97 26.53 27.23 26.40 25.30 24.20 23.97 25.13 25.43 26.07 25.53
## 2000 25.57 26.07 26.90 26.97 26.40 25.57 25.17 25.03 25.23 25.83 25.67 26.67
plot(data_serie)

#Nota: Los resultados de esta guía corresponden a Data1 del archivo excel. Sugiero que tambien practiques con las otras series de tiempo como Data2 o Data3.

Análisis de la serie de tiempo Para el análisis de datos, esta libreria fpp2 nos permite emplear las siguientes funciones:

autoplot(), para graficar la serie de tiempo ggseasonplot(), para graficar la estacionalidad de una serie de tiempo ggsubseriesplot(), para graficar subseries ggAcf(), para graficar la autocorrelación decompose(), permite realizar una descomposición de estacionalidad y tendencia. Grafico de la serie de tiempo Para el gráfico simple de la serie de tiempo empleamos la funcion autoplot(). Donde solo se requiere ingresar el objeto de la serie de tiempo.

autoplot(data_serie)+
        labs(title = "Serie de tiempo",       
             x = "Tiempo",
             y = "Valor",
             colour = "#00a0dc")+
        theme_bw() 

Descomposición de la serie de tiempo Para la descomposición de la serie de tiempo se emplea la función decompose(). Donde se debe indicar el objeto de la serie de tiempo y el tipo de descomposición. Los tipos de descomposición que acepta esta función es additive y multiplicative.

Aditivo: Serie=T + S + I

Multiplicativo: Serie=T x S x I

Donde:

T: Tendencia

S: Estacionalidad

I: Irregular o error

# Descomposición de la serie de tiempo. Se almacena en el objeto fit
fit <- decompose(data_serie, type='additive')
#fit <- decompose(data_serie, type='multiplicative')

# Para graficar esta descomposición volvemos a emplear la funcion autoplot, pero con el objeto fit
autoplot(fit)+
        labs(title = "Descomposicion de la serie de tiempo",                   
             x = "Tiempo",
             y = "Valor",
             colour = "Gears")+
        theme_bw()

library(highcharter)
## Warning: package 'highcharter' was built under R version 4.3.3
hchart(stl(data_serie, s.window='periodic'))
## Warning: Deprecated function. Use the `create_axis` function.

Grafico de la serie de tiempo con su tendencia El siguiente fragmento de código nos permite graficar la serie de tiempo con su tendencia. Notese que emplea el objeto fit en el cual guardamos previamente los valores de la descomposición. Nótese que se emplea la funcion trendcycle() para obtener los datos de tendencia del objeto fit.

autoplot(data_serie, series="Serie tiempo") + 
        autolayer(trendcycle(fit), series="Tendencia") +
        labs(title = "Serie de tiempo",      
             x = "Tiempo",
             y = "Valor"
        ) + 
        theme_bw()
## Warning: Removed 12 rows containing missing values (`geom_line()`).

Grafico de estacionalidad Para realizar el gráfico de estacionalidad empleamos la función ggseasonplot. Donde el argumento es el objeto que contiene la serie de tiempo.

ggseasonplot(data_serie)

library(TSstudio)
## Warning: package 'TSstudio' was built under R version 4.3.3
ts_seasonal(data_serie, type = "all")
ts_heatmap(data_serie)
#Graficar la autocorrelacion 
acf(data_serie, lag=35, col="2",main ="",
    xlab="Lag",ylab="Valores")

#Graficar la autocorrelacion parcial
pacf(data_serie, lag=35, col="2",main ="",
     xlab="Lag",ylab="Valores")

#Como hay confirmación de tendencia se hace la diferencia (1 lag)
plot(diff(data_serie),xlab="Tiempo",ylab="Valores")

acf(diff(data_serie), lag=35, col="2",main = "",
    xlab="Lag", ylab="Valores")

pacf(diff(data_serie), lag=35,col="2",main = "",
     xlab="Lag",ylab="Valores")

#Como la variancia se ve incrementa en el tiempo se debe sacar logaritmo natural de la serie
plot(diff(log(data_serie)),xlab="Tiempo",ylab="Valores")

acf(diff(log(data_serie)), lag=35, col="2",main = "",
    xlab="Lag", ylab="Valores")

pacf(diff(log(data_serie)), lag=35,col="2",main = "",
     xlab="Lag",ylab="Valores")

#Augmented Dickey-Fuller test para ver no estacionaridad
#Devuelve la probabilidad de ser no estacionaria
#Si es mayor que 0.05 la serie es no estacionaria (tiene tendencia)
#Si es menor que 0.05 es estacionaria (No hay tendencia)

# library(aTSA)
aTSA::adf.test(diff(log(data_serie)))
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -25.5    0.01
## [2,]   1 -19.4    0.01
## [3,]   2 -17.9    0.01
## [4,]   3 -16.2    0.01
## [5,]   4 -16.0    0.01
## [6,]   5 -16.0    0.01
## [7,]   6 -16.2    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -25.5    0.01
## [2,]   1 -19.4    0.01
## [3,]   2 -17.9    0.01
## [4,]   3 -16.2    0.01
## [5,]   4 -15.9    0.01
## [6,]   5 -15.9    0.01
## [7,]   6 -16.2    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -25.5    0.01
## [2,]   1 -19.4    0.01
## [3,]   2 -17.9    0.01
## [4,]   3 -16.2    0.01
## [5,]   4 -15.9    0.01
## [6,]   5 -15.9    0.01
## [7,]   6 -16.2    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
library(forecast)
#Ajuste automático de los coeficientes
ARIMAmodel <- auto.arima(log(data_serie))
ARIMAmodel
## Series: log(data_serie) 
## ARIMA(0,0,1)(0,1,1)[12] with drift 
## 
## Coefficients:
##          ma1     sma1  drift
##       0.4268  -0.8863  1e-04
## s.e.  0.0287   0.0252  0e+00
## 
## sigma^2 = 0.0006294:  log likelihood = 1460.91
## AIC=-2913.81   AICc=-2913.75   BIC=-2895.92
#Ajuste automático de los coeficientes
ARIMAmodel <- auto.arima(diff(log(data_serie)))
ARIMAmodel
## Series: diff(log(data_serie)) 
## ARIMA(5,0,0)(2,0,0)[12] with zero mean 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5    sar1    sar2
##       -0.4450  -0.2896  -0.2371  -0.1642  -0.1254  0.4151  0.3284
## s.e.   0.0418   0.0439   0.0433   0.0421   0.0387  0.0377  0.0379
## 
## sigma^2 = 0.0006817:  log likelihood = 1466.35
## AIC=-2916.7   AICc=-2916.48   BIC=-2880.78

Pronóstico Métodos simples Para el pronóstico de series de tiempo mediante métodos básicos, la libreria fpp2 nos brinda las siguientes funciones:

naive(), metodo de naive simple ses(), exponential smoothing meanf(), media movil snaive(), metodo naive considerando estacionalidad El argumento a colocar en estas funciones es la serie de tiempo y el valor de h. Este valor de h es la cantidad de datos que deseamos pronosticar. Por ejemplo si deseamos pronosticar 12 datos, se debe indicar h=12.

Finalmente, para verificar el ajuste del método podemos emplear las siguientes funciones:

fitted(), obtiene un ajuste con la data historica checkresiduals(), permite analizar los residuales

# elaborando el método
m1 <- snaive(data_serie, h=96)

# graficando el pronóstico
autoplot(m1)

# verificando el ajuste del método
autoplot(m1)+autolayer(fitted(m1), series="Ajuste")
## Warning: Removed 12 rows containing missing values (`geom_line()`).

# verificando los residuales
checkresiduals(m1)

## 
##  Ljung-Box test
## 
## data:  Residuals from Seasonal naive method
## Q* = 760, df = 24, p-value < 2.2e-16
## 
## Model df: 0.   Total lags used: 24

Método regresión Para el pronóstico de series de tiempo mediante regresión, la libreria fpp2 nos brinda la función tslm(). Esta función la emplearemos para crear una regresión de la serie de tiempo con los datos de la descomposición estacional y/o tendencia. Entonces:

Si observamos solo tendencia usaremos : tslm(data_serie ~ trend) Si observamos solo estacionalidad usaremos : tslm(data_serie ~ season) Si observamos tendencia y estacionalidad usaremos : tslm(data_serie ~ trend + season) Luego con la función forecast realizamos el pronostico. El argumento a colocar en estas funcion es la regresión y el valor de h. Este valor de h es la cantidad de datos que deseamos pronosticar.

Finalmente, para verificar el ajuste del método podemos emplear las siguientes funciones:

fitted(), obtiene pronostico con la data historica checkresiduals(), permite analizar los residuales

library(tseries)
# elaborando la regresion
regresion <- tslm(data_serie ~ trend + season)

# elaborando el pronostico
m2 <- forecast(regresion)

# graficando el pronóstico
autoplot(m2)

# verificando el ajuste del método
autoplot(m2)+autolayer(fitted(m2), series="Ajuste")

# verificando los residuales
checkresiduals(m2)

## 
##  Ljung-Box test
## 
## data:  Residuals from Linear regression model
## Q* = 900.02, df = 24, p-value < 2.2e-16
## 
## Model df: 0.   Total lags used: 24

Método holt winters Para el pronóstico de series de tiempo mediante holt winters, la libreria fpp2 nos brinda la función hw().

Los argumentos a colocar en esta funcion son:

La serie de tiempo El valor de h. Este valor de h es la cantidad de datos que deseamos pronosticar. El tipo de descomposición a usar para la estacionalidad. Los tipos de descomposición que acepta esta función es additive y multiplicative. Finalmente, para verificar el ajuste del método podemos emplear las siguientes funciones:

fitted(), obtiene pronostico con la data historica checkresiduals(), permite analizar los residuales

# elaborando el pronostico
m3 <- hw(data_serie, h=96, seasonal = 'multiplicative')

# graficando el pronóstico
autoplot(m3)

# verificando el ajuste del método
autoplot(m3)+autolayer(fitted(m3), series="Ajuste")

# verificando los residuales
checkresiduals(m3)

## 
##  Ljung-Box test
## 
## data:  Residuals from Holt-Winters' multiplicative method
## Q* = 91.843, df = 24, p-value = 7.127e-10
## 
## Model df: 0.   Total lags used: 24

ARIMA Para el pronóstico de series de tiempo mediante ARIMA, la libreria fpp2 nos brinda la función auto.arima().

Primero crearemos un modelo ARIMA, para ello el argumento a colocar en esta funcion es la serie de tiempo. Considerar que esta función es solo una aproximación iterativa que busca los indices de AR y MA. Pues en determinadas series de tiempo podria no encontrar los indices adecuados para un modelo ARIMA. En ese caso lo adecuado es seguir la metodología de estimación de índices ARIMA. Esta metodología no esta cubierta en esta guia.

Luego con la función forecast realizamos el pronostico. El argumento a colocar en estas funcion es el modelo ARIMA y el valor de h. Este valor de h es la cantidad de datos que deseamos pronosticar.

Finalmente, para verificar el ajuste del método podemos emplear las siguientes funciones:

fitted(), obtiene pronostico con la data historica checkresiduals(), permite analizar los residuales

# elaborando el modelo ARIMA
modelo_arima <- auto.arima(data_serie)

# elaborando el pronostico
m4 <- forecast(modelo_arima, h=96)


# graficando el pronóstico
autoplot(m4)

# verificando el ajuste del método
autoplot(m4)+autolayer(fitted(m4), series="Ajuste")

# verificando los residuales
checkresiduals(m4)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,2)(1,1,0)[12] with drift
## Q* = 118.11, df = 19, p-value = 2.22e-16
## 
## Model df: 5.   Total lags used: 24

Red neuronal Para el pronóstico de series de tiempo mediante una red neuronal, la libreria fpp2 nos brinda la función nnetar().

Primero crearemos un modelo de red neuronal (neural network), para ello el argumento a colocar en esta funcion es la serie de tiempo.

Luego con la función forecast realizamos el pronostico. El argumento a colocar en estas funcion es el modelo de red neuronal y el valor de h. Este valor de h es la cantidad de datos que deseamos pronosticar.

Finalmente, para verificar el ajuste del método podemos emplear las siguientes funciones:

fitted(), obtiene pronostico con la data historica checkresiduals(), permite analizar los residuales

# elaborando el modelo de red neuronal
neural_network <- nnetar(data_serie)

# elaborando el pronostico
m5 <- forecast(neural_network, h=96)

# graficando el pronóstico
autoplot(m5)

# verificando el ajuste del método
autoplot(m5)+autolayer(fitted(m5), series="Ajuste")
## Warning: Removed 25 rows containing missing values (`geom_line()`).

# verificando los residuales
checkresiduals(m5)

## 
##  Ljung-Box test
## 
## data:  Residuals from NNAR(25,1,13)[12]
## Q* = 10.417, df = 24, p-value = 0.9926
## 
## Model df: 0.   Total lags used: 24

Estimación de error Para estimar los errores de pronóstico, se debe realizar con los valores ocurridos o reales. Es decir este error se mide tiempo despues de haber realizado el pronóstico.

Supongamos que los valores reales ocurridos para la Data1 son los siguientes:

Mes Valor Real
Enero 19 13487 Mayo Febrero 19 12776 Junio Marzo 19 13812 Julio Abril 19 13032 Agosto Entonces, para poder comparar nuestros datos sera necesario almacenarlo en un objeto de serie de tiempo. Entonces:

real <- c(622, 606, 508, 461, 390, 432,462, 471)
data_real <- ts(real, frequency=12,start=1961)

La función accuracy() determina los errores de pronostico, para ello es necesario:

Indicar el modelo de pronostico, donde estará el pronóstico Indicar datos reales, donde estará los valores reales Entonces lo que realizará esta función es comparar el pronóstico de los siguientes 8 datos y el valor real. Pues estamos considerando que ya pasaron 8 meses, y nos encontramos en la etapa de evaluar el error de pronóstico de nuestros modelos.