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.

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

#data_serie <- ts(data_serie$Serie, frequency=12, start=2004)

file_path <- "C:/Users/TELEMATICA-LAB/Desktop/MISHELL/DATOSTEM1.CSV"
Temperatura<- read.csv(file_path)
Temperatura
##        DATOS
## 1   25.50000
## 2   25.76000
## 3   26.30000
## 4   25.61000
## 5   25.30000
## 6   23.90000
## 7   23.70000
## 8   23.60000
## 9   24.30000
## 10  24.60000
## 11  24.60000
## 12  25.80000
## 13  24.50000
## 14  25.20000
## 15  25.60000
## 16  25.40000
## 17  25.20000
## 18  23.80000
## 19  23.50000
## 20  23.40000
## 21  22.40000
## 22  22.40000
## 23  24.10000
## 24  24.60000
## 25  25.00000
## 26  25.30000
## 27  25.30000
## 28  25.70000
## 29  25.60000
## 30  24.50000
## 31  22.20000
## 32  22.30000
## 33  22.10000
## 34  22.20000
## 35  22.80000
## 36  24.20000
## 37  25.00000
## 38  25.50000
## 39  26.00000
## 40  26.30000
## 41  24.90000
## 42  23.10000
## 43  23.56000
## 44  23.36000
## 45  23.71000
## 46  23.86000
## 47  24.14000
## 48  24.87000
## 49  26.70000
## 50  27.20000
## 51  26.11000
## 52  26.07000
## 53  25.76000
## 54  25.20000
## 55  23.60000
## 56  23.20000
## 57  24.30000
## 58  23.60000
## 59  24.83000
## 60  25.70000
## 61  27.00000
## 62  27.00000
## 63  27.80000
## 64  27.50000
## 65  26.56667
## 66  25.33333
## 67  25.00000
## 68  25.56667
## 69  25.66667
## 70  26.30000
## 71  25.53333
## 72  26.56667
## 73  26.63333
## 74  25.50000
## 75  27.30000
## 76  28.26667
## 77  26.10000
## 78  24.06667
## 79  23.53333
## 80  25.43333
## 81  25.73333
## 82  25.13333
## 83  26.46667
## 84  26.90000
## 85  26.50000
## 86  25.46667
## 87  26.56667
## 88  26.56667
## 89  26.23333
## 90  24.83333
## 91  23.60000
## 92  24.66667
## 93  25.60000
## 94  25.96667
## 95  25.50000
## 96  25.66667
## 97  26.23333
## 98  25.36667
## 99  26.20000
## 100 25.50000
## 101 25.46667
## 102 23.93333
## 103 22.33333
## 104 25.40000
## 105 25.10000
## 106 25.06667
## 107 25.23333
## 108 27.03333
## 109 26.03333
## 110 25.36667
## 111 26.20000
## 112 24.76667
## 113 24.83333
## 114 23.30000
## 115 23.13333
## 116 24.70000
## 117 24.26667
## 118 25.03333
## 119 24.13333
## 120 26.16667
## 121 25.33333
## 122 26.03333
## 123 26.26667
## 124 25.96667
## 125 24.63333
## 126 23.76667
## 127 22.23333
## 128 23.80000
## 129 24.80000
## 130 25.20000
## 131 25.26667
## 132 24.33333
## 133 25.80000
## 134 26.00000
## 135 25.90000
## 136 26.06667
## 137 26.20000
## 138 25.66667
## 139 24.03333
## 140 24.50000
## 141 24.93333
## 142 24.76667
## 143 25.03333
## 144 26.10000
## 145 26.56667
## 146 26.16667
## 147 26.06667
## 148 25.90000
## 149 25.60000
## 150 23.56667
## 151 23.43333
## 152 24.30000
## 153 24.76667
## 154 24.83333
## 155 25.33333
## 156 25.73333
## 157 25.90000
## 158 26.06667
## 159 25.66667
## 160 26.73333
## 161 26.13333
## 162 24.30000
## 163 24.13333
## 164 24.80000
## 165 24.66667
## 166 25.16667
## 167 24.30000
## 168 25.80000
## 169 25.63333
## 170 25.60000
## 171 26.20000
## 172 26.66667
## 173 24.40000
## 174 23.96667
## 175 23.83333
## 176 25.43333
## 177 25.66667
## 178 25.36667
## 179 24.73333
## 180 25.56667
## 181 26.20000
## 182 26.46667
## 183 26.56667
## 184 26.96667
## 185 26.43333
## 186 25.56667
## 187 24.13333
## 188 24.66667
## 189 25.53333
## 190 25.16667
## 191 25.80000
## 192 26.26667
## 193 26.26667
## 194 26.40000
## 195 26.06667
## 196 26.90000
## 197 25.63333
## 198 24.90000
## 199 23.56667
## 200 23.93333
## 201 24.63333
## 202 25.63333
## 203 25.83333
## 204 25.90000
## 205 25.46667
## 206 25.66667
## 207 26.30000
## 208 26.46667
## 209 24.93333
## 210 24.80000
## 211 23.26667
## 212 23.86667
## 213 25.76667
## 214 24.53333
## 215 25.10000
## 216 26.33333
## 217 25.63333
## 218 26.23333
## 219 26.26667
## 220 26.93333
## 221 26.63333
## 222 26.36667
## 223 25.30000
## 224 25.33333
## 225 25.26667
## 226 25.53333
## 227 25.33333
## 228 26.70000
## 229 27.13333
## 230 26.60000
## 231 26.30000
## 232 26.96667
## 233 26.56667
## 234 24.93333
## 235 23.40000
## 236 24.76667
## 237 25.33333
## 238 24.93333
## 239 25.36667
## 240 25.20000
## 241 25.50000
## 242 25.73333
## 243 26.20000
## 244 26.13333
## 245 25.63333
## 246 24.23333
## 247 23.16667
## 248 24.63333
## 249 25.26667
## 250 24.90000
## 251 25.60000
## 252 25.40000
## 253 25.50000
## 254 25.66667
## 255 26.50000
## 256 26.60000
## 257 25.83333
## 258 24.83333
## 259 23.60000
## 260 23.90000
## 261 24.46667
## 262 25.53333
## 263 25.36667
## 264 25.70000
## 265 25.33333
## 266 25.93333
## 267 26.33333
## 268 26.46667
## 269 26.60000
## 270 25.73333
## 271 25.43333
## 272 25.20000
## 273 25.40000
## 274 25.10000
## 275 26.86667
## 276 27.13333
## 277 26.90000
## 278 26.86667
## 279 26.90000
## 280 26.60000
## 281 25.66667
## 282 25.23333
## 283 23.93333
## 284 24.10000
## 285 25.60000
## 286 25.23333
## 287 25.46667
## 288 27.40000
## 289 26.36667
## 290 26.93333
## 291 26.80000
## 292 26.56667
## 293 26.30000
## 294 24.66667
## 295 24.13333
## 296 24.90000
## 297 25.83333
## 298 25.56667
## 299 26.36667
## 300 26.66667
## 301 26.43333
## 302 26.56667
## 303 26.53333
## 304 27.00000
## 305 26.33333
## 306 25.76667
## 307 24.33333
## 308 25.56667
## 309 26.00000
## 310 26.40000
## 311 26.56667
## 312 27.16667
## 313 26.96667
## 314 26.23333
## 315 26.63333
## 316 27.20000
## 317 26.86667
## 318 25.36667
## 319 23.86667
## 320 23.93333
## 321 25.23333
## 322 25.80000
## 323 25.60000
## 324 26.13333
## 325 26.20000
## 326 26.16667
## 327 26.43333
## 328 26.66667
## 329 24.66667
## 330 24.50000
## 331 24.50000
## 332 23.63333
## 333 25.46667
## 334 25.23333
## 335 26.40000
## 336 26.20000
## 337 26.03333
## 338 26.53333
## 339 27.00000
## 340 26.53333
## 341 25.16667
## 342 24.90000
## 343 25.10000
## 344 25.76667
## 345 26.20000
## 346 25.90000
## 347 26.83333
## 348 27.06667
## 349 27.93333
## 350 28.23333
## 351 28.26667
## 352 27.96667
## 353 27.70000
## 354 27.50000
## 355 27.30000
## 356 26.90000
## 357 26.16667
## 358 25.66667
## 359 26.33333
## 360 26.23333
## 361 26.46667
## 362 26.76667
## 363 26.93333
## 364 26.86667
## 365 26.23333
## 366 26.06667
## 367 23.96667
## 368 24.33333
## 369 25.03333
## 370 25.70000
## 371 25.76667
## 372 26.33333
## 373 25.36667
## 374 26.13333
## 375 26.36667
## 376 26.66667
## 377 25.56667
## 378 25.56667
## 379 23.16667
## 380 24.53333
## 381 25.96667
## 382 25.90000
## 383 25.96667
## 384 26.40000
## 385 25.60000
## 386 26.36667
## 387 26.93333
## 388 26.56667
## 389 25.00000
## 390 24.13333
## 391 24.63333
## 392 24.43333
## 393 25.76667
## 394 26.03333
## 395 26.16667
## 396 25.56667
## 397 26.73333
## 398 27.13333
## 399 27.16667
## 400 27.23333
## 401 26.80000
## 402 25.63333
## 403 25.13333
## 404 25.33333
## 405 26.13333
## 406 27.36667
## 407 26.66667
## 408 27.26667
## 409 26.53333
## 410 27.06667
## 411 26.63333
## 412 26.83333
## 413 26.80000
## 414 24.60000
## 415 24.40000
## 416 24.23333
## 417 25.60000
## 418 25.43333
## 419 26.83333
## 420 25.76667
## 421 25.70000
## 422 26.36667
## 423 26.70000
## 424 26.66667
## 425 26.13333
## 426 24.36667
## 427 24.50000
## 428 24.06667
## 429 24.96667
## 430 25.90000
## 431 26.66667
## 432 26.13333
## 433 26.90000
## 434 26.53333
## 435 27.36667
## 436 27.30000
## 437 26.66667
## 438 26.30000
## 439 24.43333
## 440 24.86667
## 441 25.96667
## 442 26.06667
## 443 26.63333
## 444 27.30000
## 445 26.73333
## 446 26.66667
## 447 27.46667
## 448 27.30000
## 449 26.90000
## 450 25.80000
## 451 25.23333
## 452 24.50000
## 453 25.46667
## 454 26.16667
## 455 27.20000
## 456 26.10000
## 457 26.43333
## 458 26.80000
## 459 27.36667
## 460 27.90000
## 461 26.96667
## 462 26.50000
## 463 24.73333
## 464 24.56667
## 465 25.50000
## 466 25.90000
## 467 25.56667
## 468 26.06667
## 469 25.80000
## 470 26.10000
## 471 27.03333
## 472 27.06667
## 473 26.90000
## 474 25.46667
## 475 25.03333
## 476 24.30000
## 477 25.66667
## 478 26.20000
## 479 26.30000
## 480 26.76667
## 481 26.06667
## 482 26.06667
## 483 26.30000
## 484 26.46667
## 485 26.20000
## 486 24.90000
## 487 23.96667
## 488 23.96667
## 489 25.36667
## 490 25.43333
## 491 25.90000
## 492 26.46667
## 493 26.36667
## 494 26.10000
## 495 27.03333
## 496 26.60000
## 497 26.53333
## 498 25.63333
## 499 25.13333
## 500 24.80000
## 501 25.66667
## 502 24.90000
## 503 26.30000
## 504 26.46667
## 505 25.63333
## 506 26.03333
## 507 26.26667
## 508 26.36667
## 509 25.66667
## 510 24.53333
## 511 23.86667
## 512 24.63333
## 513 25.53333
## 514 25.63333
## 515 25.56667
## 516 27.03333
## 517 25.60000
## 518 26.26667
## 519 26.23333
## 520 26.66667
## 521 27.10000
## 522 26.89667
## 523 26.86667
## 524 26.40000
## 525 26.86667
## 526 26.73333
## 527 26.83333
## 528 27.43333
## 529 27.60000
## 530 27.73333
## 531 27.68000
## 532 27.50000
## 533 28.21667
## 534 26.70000
## 535 26.13333
## 536 25.10000
## 537 27.00667
## 538 25.32667
## 539 25.29667
## 540 24.96667
## 541 26.36667
## 542 26.03333
## 543 26.66667
## 544 26.20000
## 545 25.80000
## 546 24.06667
## 547 23.80000
## 548 23.76667
## 549 25.60000
## 550 24.76667
## 551 26.16667
## 552 25.56667
## 553 25.56667
## 554 26.16667
## 555 26.36667
## 556 26.03333
## 557 25.43333
## 558 24.93333
## 559 23.53333
## 560 24.66667
## 561 25.40000
## 562 25.63333
## 563 25.40000
## 564 26.66667
## 565 26.96667
## 566 26.30000
## 567 26.59000
## 568 26.82667
## 569 25.93333
## 570 23.36667
## 571 24.16667
## 572 24.16667
## 573 25.40000
## 574 26.64333
## 575 25.97333
## 576 26.66667
## 577 25.80000
## 578 25.50000
## 579 26.20000
## 580 26.00000
## 581 26.00000
## 582 24.60000
## 583 24.00000
## 584 23.30000
## 585 24.70000
## 586 24.90000
## 587 25.10000
## 588 25.50000
## 589 25.40000
## 590 25.90000
## 591 26.40000
## 592 26.40000
## 593 25.80000
## 594 23.90000
## 595 23.20000
## 596 23.90000
## 597 23.60000
## 598 25.10000
## 599 25.30000
## 600 25.60000
## 601 26.30000
## 602 26.10000
## 603 26.40000
## 604 26.20000
## 605 25.60000
## 606 24.00000
## 607 23.40000
## 608 23.50000
## 609 24.40000
## 610 25.00000
## 611 25.30000
## 612 26.30000
## 613 26.30000
## 614 25.50000
## 615 25.90000
## 616 26.30000
## 617 25.20000
## 618 24.10000
## 619 23.60000
## 620 23.50000
## 621 24.70000
## 622 24.30000
## 623 25.20000
## 624 25.70000
## 625 25.60000
## 626 25.80000
## 627 26.50000
## 628 26.10000
## 629 25.20000
## 630 24.10000
## 631 23.50000
## 632 24.40000
## 633 25.10000
## 634 25.30000
## 635 25.30000
## 636 25.80000
## 637 25.80000
## 638 26.10000
## 639 26.10000
## 640 26.10000
## 641 25.20000
## 642 24.30000
## 643 23.70000
## 644 23.00000
## 645 24.00000
## 646 23.90000
## 647 24.60000
## 648 24.80000
## 649 24.20000
## 650 25.40000
## 651 25.90000
## 652 26.20000
## 653 25.20000
## 654 24.50000
## 655 24.30000
## 656 24.20000
## 657 24.30000
## 658 24.20000
## 659 24.70000
## 660 25.50000
## 661 25.40000
## 662 25.40000
## 663 25.90000
## 664 26.20000
## 665 25.90000
## 666 24.60000
## 667 24.30000
## 668 24.50000
## 669 24.90000
## 670 25.20000
## 671 25.80000
## 672 26.50000
## 673 26.10000
## 674 26.40000
## 675 26.70000
## 676 26.80000
## 677 26.40000
## 678 24.80000
## 679 24.20000
## 680 24.00000
## 681 24.40000
## 682 24.70000
## 683 24.00000
## 684 24.40000
## 685 25.20000
## 686 25.70000
## 687 26.50000
## 688 26.10000
## 689 25.90000
## 690 25.10000
## 691 24.60000
## 692 23.70000
## 693 24.60000
## 694 24.20000
## 695 25.10000
## 696 26.00000
## 697 24.80000
## 698 25.50000
## 699 26.30000
## 700 26.50000
## 701 26.10000
## 702 25.40000
## 703 24.10000
## 704 23.80000
## 705 24.40000
## 706 24.70000
## 707 25.70000
## 708 25.90000
## 709 25.10000
## 710 25.50000
## 711 26.20000
## 712 26.10000
## 713 25.20000
## 714 23.90000
## 715 23.00000
## 716 23.40000
## 717 24.80000
## 718 24.90000
## 719 24.90000
## 720 26.00000
## 721 25.10000
## 722 25.20000
## 723 26.50000
## 724 26.10000
## 725 26.00000
## 726 25.60000
## 727 24.80000
## 728 24.50000
## 729 24.50000
## 730 24.70000
## 731 25.10000
## 732 26.40000
## 733 25.30000
## 734 26.10000
## 735 26.40000
## 736 26.90000
## 737 26.70000
## 738 26.20000
## 739 25.50000
## 740 24.60000
## 741 25.80000
## 742 25.70000
## 743 25.70000
## 744 26.60000
## 745 26.20000
## 746 26.60000
## 747 26.90000
## 748 26.70000
## 749 26.80000
## 750 25.70000
## 751 24.80000
## 752 24.90000
## 753 25.20000
## 754 24.80000
## 755 25.50000
## 756 26.40000
## 757 25.80000
## 758 26.40000
## 759 26.30000
## 760 26.60000
## 761 26.50000
## 762 25.10000
## 763 23.90000
## 764 24.20000
## 765 24.60000
## 766 25.10000
## 767 24.40000
## 768 25.20000
## 769 25.70000
## 770 25.30000
## 771 26.00000
## 772 26.30000
## 773 25.50000
## 774 23.90000
## 775 23.50000
## 776 23.50000
## 777 24.60000
## 778 24.40000
## 779 25.60000
## 780 25.60000
## 781 25.60000
## 782 26.50000
## 783 26.40000
## 784 26.70000
## 785 26.10000
## 786 25.20000
## 787 24.10000
## 788 23.50000
## 789 24.30000
## 790 24.50000
## 791 25.20000
## 792 26.05697
## 793 26.10000
## 794 26.40000
## 795 26.50273
## 796 26.55061
## 797 25.97035
## 798 24.30000
## 799 24.00000
## 800 24.50000
## 801 25.70000
## 802 25.20000
## 803 25.50000
## 804 26.06093
## 805 25.40000
## 806 25.90000
## 807 26.30000
## 808 26.10000
## 809 25.40000
## 810 24.50000
## 811 24.00000
## 812 24.40000
## 813 24.90000
## 814 25.20000
## 815 24.60000
## 816 25.00000
View(Temperatura)
data_serie <-ts(Temperatura$DATOS, frequency=12, start=1946)

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.




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 -27.4    0.01
## [2,]   1 -21.0    0.01
## [3,]   2 -19.7    0.01
## [4,]   3 -18.2    0.01
## [5,]   4 -17.7    0.01
## [6,]   5 -17.9    0.01
## [7,]   6 -18.1    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -27.4    0.01
## [2,]   1 -21.0    0.01
## [3,]   2 -19.7    0.01
## [4,]   3 -18.2    0.01
## [5,]   4 -17.6    0.01
## [6,]   5 -17.9    0.01
## [7,]   6 -18.1    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -27.4    0.01
## [2,]   1 -21.0    0.01
## [3,]   2 -19.7    0.01
## [4,]   3 -18.1    0.01
## [5,]   4 -17.6    0.01
## [6,]   5 -17.9    0.01
## [7,]   6 -18.1    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.4568  -0.8052      0
## s.e.  0.0253   0.0247      0
## 
## sigma^2 = 0.0005895:  log likelihood = 1843.75
## AIC=-3679.5   AICc=-3679.45   BIC=-3660.75
#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.4036  -0.2500  -0.2355  -0.1450  -0.0970  0.4194  0.3401
## s.e.   0.0373   0.0387   0.0380   0.0374   0.0349  0.0338  0.0336
## 
## sigma^2 = 0.0005944:  log likelihood = 1869.25
## AIC=-3722.5   AICc=-3722.32   BIC=-3684.87

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* = 987.05, 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)
## Warning: package 'tseries' was built under R version 4.3.3
# 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* = 2486.2, 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* = 138.78, df = 24, p-value < 2.2e-16
## 
## 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(0,0,4)(1,1,2)[12]
## Q* = 94.46, df = 17, p-value = 9.35e-13
## 
## Model df: 7.   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* = 15.644, df = 24, p-value = 0.9005
## 
## 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: