Szeregi czasowe
Tworzenie szeregów czasowych
Szeregi czasowe, a właściwie serie danych, którym przypisywany jest czas (ang time series) to dość częsty rodzaj danych związanych z rozliczeniami finansowymi, analizą wskaźników stanu gospodarki, które zazwyczaj wykonuje się raz na miesiąc lub raz na kwartał. Aby ułatwić zapisywanie takich danych w R, wymyślono rodzaj zmiennych zwanych po polsku szeregami czasowymi. W biologii trafiają się doświadczenia, których wyniki zapisuje się regularnie, co ustalony przedział czasowy i wyniki takiego eksperymentu można zapisać jako wektor danych z informacją od jakiej chwili rozpoczęto pomiary i co jaki czas je powtarzano.
Szeregi czasowe podlegają innej analizie statystycznej, niż wektory danych pomiarowych wykonywanych w tym samym czasie lub niezależnych od czasu. Standardowa analiza statystyczna dotyczy właśnie takich wektorów i opiera się o niezależność tych danych od siebie. Wyniki analiz nie powinny wtedy zależeć od kolejności danych występujących w takim ciągu. Natomiast kolejne wyniki pomiarów w szeregu czasowym w dużym stopniu zależą od wyniku pomiaru poprzedniego (np. średnica grzybni rosnącej na pożywce), zwłaszcza gdy pomiary wykonywane są często. Kolejność zapisu danych ma w nich istotne znaczenie.
Szeregi czasowe tworzy się funkcją ts(), której argumentem są wektory danych.
> cc=ts(c(3:1,1:3,c(2,3,1))) > cc Time Series: Start = 1 End = 9 Frequency = 1 [1] 3 2 1 1 2 3 2 3 1 > cc=ts(c("c", "a", "b", "a", "b", "c", "c", "b", "c")) > cc Time Series: Start = 1 End = 9 Frequency = 1 [1] c a b a b c c b c |
Szeregi czasowe można utworzyć z wektorów o nazwanych wyrazach.
> d=c(L=c(0,1,4,0,0,1,4,0,1)) > ts(d) Time Series: Start = 1 End = 9 Frequency = 1 L1 L2 L3 L4 L5 L6 L7 L8 L9 0 1 4 0 0 1 4 0 1 |
Funkcja ts() standardowo ustala czas rozpoczęcia obserwacji (początek obserwacji) jako 1 i częstotliwość obserwacji jako co 1. Rzadko odpowiada to potrzebom. Zmianę tych wielkości uzyskuje się poprzez zastosowanie opcji start i frequency lub opcji deltat. Opcja frequency to liczba określająca ile razy w czasie 1 (który dodaje się do liczby podanej jako start) dokonano pomiaru. Opcja deltat jest odwrotnością frequencji i określa co jaki ułamek 1 dokonywano pomiaru. Tylko jedna z opcji frequency lub deltat może być użyta. W przypadku gdy frequency=4, deltat=0.25 lub frequency=12, deltat=1/12 przypisuje się automatycznie znaczenie co miesiąc lub co kwartał i szereg czasowy jest inaczej wyświetlany.
> aa=ts(1:36, start=1987, frequency=3) > aa Time Series: Start = c(1987, 1) End = c(1998, 3) Frequency = 3 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [33] 33 34 35 36 > aa=ts(1:36, start=1987, frequency=4) > aa Qtr1 Qtr2 Qtr3 Qtr4 1987 1 2 3 4 1988 5 6 7 8 1989 9 10 11 12 1990 13 14 15 16 1991 17 18 19 20 1992 21 22 23 24 1993 25 26 27 28 1994 29 30 31 32 1995 33 34 35 36 > aa=ts(1:36, start=1987, frequency=12) > aa Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1987 1 2 3 4 5 6 7 8 9 10 11 12 1988 13 14 15 16 17 18 19 20 21 22 23 24 1989 25 26 27 28 29 30 31 32 33 34 35 36 > aa=ts(1:36, start=1987, deltat=1/12) > aa Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1987 1 2 3 4 5 6 7 8 9 10 11 12 1988 13 14 15 16 17 18 19 20 21 22 23 24 1989 25 26 27 28 29 30 31 32 33 34 35 36 |
Pomimo, że dane wyświetlają się w tablicy, nadal jest to wektor z dodatkowymi informacjami, które pozwalają na określenie czasu pomiaru.
Opcja start nie musi być liczbą całkowitą i może mieć charakter wektora dwuelementowego. Pierwsza liczba w tym wektorze określa czas w większej jednostce, a druga – ile jednostek typu deltat trzeba do niej dodać.
> aa=ts(1:36, start=1987.75, deltat=1/12) > aa Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1987 1 2 3 1988 4 5 6 7 8 9 10 11 12 13 14 15 1989 16 17 18 19 20 21 22 23 24 25 26 27 1990 28 29 30 31 32 33 34 35 36 > aa=ts(1:36, start=c(1987,10), deltat=1/12) > aa Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1987 1 2 3 1988 4 5 6 7 8 9 10 11 12 13 14 15 1989 16 17 18 19 20 21 22 23 24 25 26 27 1990 28 29 30 31 32 33 34 35 36 |
Funkcja ts() ma jeszcze opcję: end. Nie zastępuje ona (niestety) opcji frequency lub deltat, co mogłoby zachodzić, gdyby podany w niej czas przyporządkować ostatniej z danych. Pokazuje ona po prostu, do której wartości ciągu (której odpowiada czas podany w end) dane powinny być wpisane do szeregu czasowego. Gdy czas podany w end przewyższa czas odpowiadający ostatniej zmiennej dane z ciągu zostają powielone, czasem wielokrotnie.
> kk=ts(letters, start=0, end=5, frequency=2) > kk Time Series: Start = c(0, 1) End = c(5, 1) Frequency = 2 [1] a b c d e f g h i j k > kk=ts(letters, start=0, end=30, frequency=2) > aa Time Series: Start = c(0, 1) End = c(30, 1) Frequency = 2 [1] a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w [50] x y z a b c d e f g h i |
Szeregi czasowe zaimplementowane do R
Do R zaimplementowano kilkadziesiąt ciekawych szeregów czasowych, na których można ćwiczyć różne operacje. Przykładem takiego szeregu jest obiekt Nile pokazujący roczny przepływ wód Nilu w milionach metrów sześciennych wody na wysokości Assuanu w czasie 100 lat (do 1871 do 1970).
> Nile Time Series: Time Series: Start = 1871 End = 1970 Frequency = 1 [1] 1120 1160 963 1210 1160 1160 813 1230 1370 1140 995 935 1110 994 1020 960 1180 [18] 799 958 1140 1100 1210 1150 1250 1260 1220 1030 1100 774 840 874 694 940 833 [35] 701 916 692 1020 1050 969 831 726 456 824 702 1120 1100 832 764 821 768 [52] 845 864 862 698 845 744 796 1040 759 781 865 845 944 984 897 822 1010 [69] 771 676 649 846 812 742 801 1040 860 874 848 890 744 749 838 1050 918 [86] 986 797 923 975 815 1020 906 901 1170 912 746 919 718 714 740 |
Można tez ćwiczyć na szeregu czasowym lynx pokazującym liczby złowień rysi w Kanadzie w latach 1821 – 1934. Dane pochodzą z pracy Campbell, M. J.and A. M. Walker (1977). A Survey of statistical work on the Mackenzie River series of annual Canadian lynx trappings for the years 18211934 and a new analysis. Journal of the Royal Statistical Society series A, 140, 411431.
> lynx Time Series: Start = 1821 End = 1934 Frequency = 1 [1] 269 321 585 871 1475 2821 3928 5943 4950 2577 523 98 184 279 409 2285 2685 [18] 3409 1824 409 151 45 68 213 546 1033 2129 2536 957 361 377 225 360 731 [35] 1638 2725 2871 2119 684 299 236 245 552 1623 3311 6721 4254 687 255 473 358 [52] 784 1594 1676 2251 1426 756 299 201 229 469 736 2042 2811 4431 2511 389 73 [69] 39 49 59 188 377 1292 4031 3495 587 105 153 387 758 1307 3465 6991 6313 [86] 3794 1836 345 382 808 1388 2713 3800 3091 2985 3790 674 81 80 108 229 399 [103] 1132 2432 3574 2935 1537 529 485 662 1000 1590 2657 3396 |
Zainteresowanym polecam też bardzo długi szereg czasowy pokazujący średnią liczbę plam słonecznych w kolejnych miesiącach o nazwie sunspots.month. Dane te pochodzą z Królewskiego Obserwatorium Astronomicznego w Belgii na podstawie obserwacji prowadzonych od 1700 roku. Można za jego pomocą weryfikować hipotezy, czy plamy słoneczne mają jakiś wpływ na życie na Ziemi.
Odwołanie się do elementów szeregu czasowego
Odwołanie się do wybranych wartości szeregu czasowego jest takie same jak odwołanie się do tych wartości w wektorze.
> a=ts(c(5,6,4,3,6,5,7,5),start=c(14,3), frequency=7) > a[7] [1] 7 > aa[17] [1] NA |
Jeżeli chcemy zobaczyć wektor czasu, trzeba użyć funkcji time(szereg.czasowy).
> a=ts(c(3,2,5,6,4,3,6,5,7,5),start=c(10,5), frequency=7) > a Time Series: Start = c(10, 5) End = c(11, 7) Frequency = 7 [1] 3 2 5 6 4 3 6 5 7 5> time(a) Time Series: Start = c(10, 5) End = c(11, 7) Frequency = 7 [1] 10.57143 10.71429 10.85714 11.00000 11.14286 11.28571 11.42857 11.57143 11.71429 11.85714 > c(time(a)[7],a[7]) [1] 11.42857 6.00000 |
Jeżeli chcemy wyświetlić początek pomiarów należy użyć funkcji start(). Funkcja end() pokazuje koniec obserwacji. Funkcja frequency() pokaże częstotliwość pomiarów w jednostce czasu, a funkcja deltat() co jaki czas wykonywane były pomiary.
> a=ts(c("a","a","b","a","c","b","c"),start=c(28.6,0.5), frequency=15) > a Time Series: Start = 28.5666666666667 End = 28.9666666666667 Frequency = 15 [1] a a b a c b c > start(a) [1] 28.56667 > end(a) [1] 28.96667 > frequency(a) [1] 15 > deltat(a) [1] 0.06666667 |
Edycja szeregów czasowych
Poprzez odwołanie szereg[n] można zamienić wartość n-tego wyrazu czynnika
> b=ts(1:10,start=3,frequency=4) > b Qtr1 Qtr2 Qtr3 Qtr4 3 1 2 3 4 4 5 6 7 8 5 9 10 > b[6]=15 > b Qtr1 Qtr2 Qtr3 Qtr4 3 1 2 3 4 4 5 15 7 8 5 9 10 |
Metoda tą nie da się zamienić wielkości związanych z czasem (start(szereg.czasowy), frequency(szereg.czasowy) i innych)
> b=ts(1:10,start=c(32),frequency=5) > b Time Series: Start = c(32, 1) End = c(33, 5) Frequency = 5 [1] 1 2 3 4 5 6 7 8 9 10 > start(b) [1] 32 1 > start(b)=33 Błąd w poleceniu 'start(b) = 33':nie udało się znaleźć funkcji 'start<-' > frequency(b) [1] 5 > frequency(b)=6 Błąd w poleceniu 'frequency(b) = 6':nie udało się znaleźć funkcji 'frequency<-' |
Gdy istnieje konieczność poprawienia danych czasowych (start, frequency) należy utworzyć nowy szereg czasowy na wektorze as.vectos(szereg.czasowy).
> b=ts(1:10,start=c(32),frequency=5) > b > b Time Series: Start = c(32, 1) End = c(33, 5) Frequency = 5 [1] 1 2 3 4 5 6 7 8 9 10 > b=ts(as.vector(b), start=33, frequency=6) > b Time Series: Start = c(33, 1) End = c(34, 4) Frequency = 6 [1] 1 2 3 4 5 6 7 8 9 10 |
Wykrawanie fragmentu szeregu czasowego wykonuje się za pomocą funkcji window(), w której dwa parametry liczbowe oznaczają początek i koniec czasu jakich wykrojone dane dotyczą.
> b=ts(1:10,start=c(3,2),frequency=4) > b Qtr1 Qtr2 Qtr3 Qtr4 3 1 2 3 4 4 5 6 7 5 8 9 10 > c=window(b, start=3.75, end=5) > c Qtr1 Qtr2 Qtr3 Qtr4 3 3 4 4 5 6 7 5 8 > d=window(b, 3.2, 5) > d Qtr1 Qtr2 Qtr3 Qtr4 3 1 2 3 4 4 5 6 7 5 8 Komunikat ostrzegawczy: W poleceniu 'window.default(x, ...)': argument 'start' nie został zmieniony |
Może zaistnieć potrzeba utworzenia szeregu czasowego z co drugiego lub co trzeciego wyrazu istniejącego już szeregu. Wykonuje się to także funkcją window() z opcją frequency.
> b=ts(1:100,start=c(1900,1),frequency=12) > b Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1900 1 2 3 4 5 6 7 8 9 10 11 12 1901 13 14 15 16 17 18 19 20 21 22 23 24 1902 25 26 27 28 29 30 31 32 33 34 35 36 1903 37 38 39 40 41 42 43 44 45 46 47 48 1904 49 50 51 52 53 54 55 56 57 58 59 60 1905 61 62 63 64 65 66 67 68 69 70 71 72 1906 73 74 75 76 77 78 79 80 81 82 83 84 1907 85 86 87 88 89 90 91 92 93 94 95 96 1908 97 98 99 100 > window(b, frequency=2) Time Series: Start = c(1900, 1) End = c(1908, 1) Frequency = 2 [1] 1 7 13 19 25 31 37 43 49 55 61 67 73 79 85 91 97 |
Wszelkie łączenia szeregów czasowych polegają na dokładnym dopasowaniu momentów czasowych. Takie dopasowanie momentów czasowych dwóch szeregów umożliwiają funkcje ts.union() i ts.intersect(). Tworzą one obiekty typu: wielokrotny szereg czasowy (mts) tożsamy z macierzą lub baza danych (po użyciu opcji dframe=TRUE). Posiadają kolumnę danych czasowych i dwie kolumnami danych z jednego lub drugiego szeregu i ewentualnie wartości NA. Oba szeregi muszą mieć tę samą częstotliwość i, a ich zakresy czasowe pokrywać się częściowo.
> aa=ts(1:10,-5,frequency=0.5) > aa Time Series: Start = -5 End = 13 Frequency = 0.5 [1] 1 2 3 4 5 6 7 8 9 10 > bb=ts(11:20,1,frequency=0.5) > bb Time Series: Start = 0 End = 18 Frequency = 0.5 [1] 11 12 13 14 15 16 17 18 19 20 > ts.union(aa,bb) Time Series: Start = -5 End = 17 Frequency = 0.5 aa bb -5 1 NA -3 2 NA -1 3 NA 1 4 11 3 5 12 5 6 13 7 7 14 9 8 15 11 9 16 13 10 17 15 NA 18 17 NA 19 19 NA 20 > ts.intersect(aa,bb) Time Series: Start = 1 End = 13 Frequency = 0.5 aa bb 1 4 11 3 5 12 5 6 13 7 7 14 9 8 15 11 9 16 13 10 17 > bb=ts(11:20,0,frequency=0.5) > ts.intersect(aa,bb) Błąd w poleceniu '.cbind.ts(list(...), .makeNamesTs(...), dframe = dframe, union = FALSE)': liczba pozycji do zastąpienia nie jest wielokrotnością długości zamiany |
Ostatni komunikat związany był z tym, że po poprawce szereg czasowy bb dotyczył liczb parzystych, a czas w szeregu czasowym aa był liczony liczbami nieparzystymi. Niezrozumiały język tego komunikatu wynika z tego, że jest to dosłowne tłumaczenie informacji o wyniku funkcji sprawdzającej zachodzenie na siebie wektorów czasowych.
Po zrobieniu takiej macierzy (bazy danych) w zależności od potrzeb można dodać osobną kolumnę i wpisać do niej średnie, sumy lub wyniki innych działań, ale będzie to wyjaśnione w rozdziałach omawiających macierze i bazy danych.
Działania na szeregach czasowych
Na szeregach czasowych można wykonać takie same działania jak na wektorach. Dotyczą one jednak tylko przekształceń danych, a nie wektora czasu.
Przy działaniu miedzy szeregiem czasowym a liczba lub wektorem liczb obowiązują podobne zasady przy działaniu między wektorami. Gdy wektor jest krótszy od szeregu czasowego, jest wielokrotnie powielany aż osiągnie długość szeregu lub ja przewyższy. Następnie działania wykonywane są między odpowiadającymi sobie wyrazami. W przypadku gdy wektor jest dłuższy od szeregu czasowego działanie nie zostaje wykonane.
> aa=ts(1:5, c(2000,3) ,frequency=4) > aa Qtr1 Qtr2 Qtr3 Qtr4 2000 1 2 2001 3 4 5 > aa*10 Qtr1 Qtr2 Qtr3 Qtr4 2000 10 20 2001 30 40 50 > aa*c(10,20,30) Qtr1 Qtr2 Qtr3 Qtr4 2000 10 40 2001 90 40 100 Komunikat ostrzegawczy: W poleceniu '`*.default`(aa, c(10, 20, 30))': długość dłuszego obiektu nie jest wielokrotnością długości krótszego obiektu > aa*c(10,20,30,40,50) Qtr1 Qtr2 Qtr3 Qtr4 2000 10 40 2001 90 160 250 > aa*c(10,20,30,40,50,60) Błąd w poleceniu '`*.default`(aa, c(10, 20, 30, 40, 50, 60))': niezgodność długości szeregu czasowego/wektora |
Na liczbowych szeregach czasowych i wektorach można w podobny sposób wykonywać działania +, -, *, /, ^, %%, %/%.
Można wykonywać działania między dwoma szeregami czasowymi, o ile ich wektory czasu całkowicie się pokrywają.
> bb=ts(1:7, 2000, frequency=5) > bb Time Series: Start = c(2000, 1) End = c(2001, 2) Frequency = 5 [1] 1 2 3 4 5 6 7 > cc=ts(8:2, 2000, frequency=5) Time Series: Start = c(2000, 1) End = c(2001, 2) Frequency = 5 [1] 8 7 6 5 4 3 2 > bb+cc Time Series: Start = c(2000, 1) End = c(2001, 2) Frequency = 5 [1] 9 9 9 9 9 9 9 > bb*cc Time Series: Start = c(2000, 1) End = c(2001, 2) Frequency = 5 [1] 8 14 18 20 20 18 14 > cc=ts(8:2, 2000, frequency=6) > cc Time Series: Start = c(2000, 1) End = c(2001, 1) Frequency = 6 [1] 8 7 6 5 4 3 2 > bb+cc Błąd w poleceniu '.cbind.ts(list(e1, e2), c(deparse(substitute(e1))[1L], deparse(substitute(e2))[1L]), ': nie wszystkie szeregi mają tę samą częstotliwość |
Funkcje na szeregach czasowych
Podstawowe funkcje analizujące typ obiektu i typ jego elementów: mode(), typeof(), class() i str() zastosowane dla szeregów czasowych dają następujące odpowiedzi:
> cc=ts(c(7,5,4,3,6,5,7,8,9,10,7,6,5), 1999,frequency=5) > cc Time Series: Start = c(1999, 1) End = c(2001, 3) Frequency = 5 [1] 7 5 4 3 6 5 7 8 9 10 7 6 5 > mode(cc) [1] "numeric" > typeof(cc) [1] "double" > class(cc) [1] "ts" > str(cc) Time-Series [1:13] from 1999 to 2001: 7 5 4 3 6 5 7 8 9 10 ... |
Podstawowe funkcje pokazujące cechy szeregu czasowego to:
- length() – liczba danych
- start() – czas (data) pierwszego pomiaru
- end() – czas (data) ostatniego moniaru
- frequency() – liczba pomiarów w jednostce czasu
- deltat() – czas między kolejnymi pomiarami
> aa=ts(1:24, c(12,3), frequency=6) > aa Time Series: Start = c(12, 3) End = c(16, 2) Frequency = 6 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 > length(aa) [1] 24 > start(aa) [1] 12 3 > end(aa) [1] 16 2 > frequency(aa) 6 > deltat(aa) 0.166667 |
Funkcja as.vector pokazuje wektor danych bez przyporządkowanych mu wartości czasu. Funkcja time() pokazuje czasu, jako szereg czasowy liczb rzeczywistych z ułamkiem dziesiętnym równym wielokrotnościom liczby deltat. Aby uzyskać wektor czasu należy użyć formuły as.vector(time())
> ee=ts(letters[1:12], c(0,3), frequency=7) > ee Time Series: Start = c(0, 3) End = c(1, 7) Frequency = 7 [1] a b c d e f g h i j k l > as.vector(ee) [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" > time(ee) Time Series: Start = c(0, 3) End = c(1, 7) Frequency = 7 [1] 0.2857143 0.4285714 0.5714286 0.7142857 0.8571429 1.0000000 1.1428571 1.2857143 [9] 1.4285714 1.5714286 1.7142857 1.8571429 > as.vector(time(ee)) [1] 0.2857143 0.4285714 0.5714286 0.7142857 0.8571429 1.0000000 1.1428571 1.2857143 [9] 1.4285714 1.5714286 1.7142857 1.8571429 |
Szeregi czasowe o liczbowych wartościach można przekształcić za pomocą funkcji matematycznych. Obowiązują tu zasady takie same, jak w przypadku wektorów. Przekształcenia te nie dotyczą wektora czasu związanego z szeregiem czasowym.
> aa=ts(c(1.4, 1.4, 5.6, 5.6, 9.9, 9.9), 2000, frequency=3) > aa Time Series: Start = c(2000, 1) End = c(2001, 3) Frequency = 3 [1] 1.4 1.4 5.6 5.6 9.9 9.9 > log(aa) Time Series: Start = c(2000, 1) End = c(2001, 3) Frequency = 3 [1] 0.3364722 0.3364722 1.7227666 1.7227666 2.2925348 2.2925348 > sin(aa) Time Series: Start = c(2000, 1) End = c(2001, 3) Frequency = 3 [1] 0.9854497 0.9854497 -0.6312666 -0.6312666 -0.4575359 -0.4575359 > gamma(aa) Time Series: Start = c(2000, 1) End = c(2001, 3) Frequency = 3 [1] 8.872638e-01 8.872638e-01 6.155392e+01 6.155392e+01 2.898677e+05 2.898677e+05 |
Typowe funkcje statystyczne działają na szeregach czasowych tak samo, jak na wektorach.
> ss=ts(c(5.2, 4.3, 2.9, 7.2, -2.1, 5.1, 4.7, -3.7, 0.8, -7.2), 2018, frequency=5) > ss Time Series: Start = c(2018, 1) End = c(2019, 5) Frequency = 5 [1] 5.2 4.3 2.9 7.2 -2.1 5.1 4.7 -3.7 0.8 -7.2 > mean(ss) [1] 1.72 > var(ss) [1] 21.65289 > sd(ss) [1] 4.653266 > min(ss) [1] -7.2 > which.min(ss) [1] 10 |
Szeregi czasowe, ze względu na zależność danych od siebie, podlegają odrębnej analizie statystycznej. Traktuje się je, jako realizacje jakiegoś procesu stochastycznego (czyli poszczególne elementy nie są losowane z jakiejś populacji możliwych wyników pomiarów, ale cały ciąg zostaje wylosowany z jakiegoś zbioru możliwych ciągów). Wypracowano dla nich mnóstwo odrębnych metod analiz statystycznych, głównie w takich dziedzinach nauki jak: socjologia, bankowość, nauka o gospodarce i finansach. Chodzi w nich przede wszystkim o możliwość przewidywania dalszych wartości szeregu czasowego na podstawie dotychczasowym jego przebiegu. W podstawowym kursie statystyki dla biologów nie ma niestety miejsca na omówienie tych zagadnień i studenci mający tego typu dane do opracowania, sami muszą się zmierzyć z tym problemem.
R jest programem, do którego można ściągnąć pakiety związane z analizą szeregów czasowych. Wraz z nimi R stanowi największy pakiet statystyczny analizujący takie obiekty. Omówienie możliwości R, w zakresie analizy szeregów czasowych, znajduje się na stronie https://cran.r-project.org/web/views/TimeSeries.html. Teoretyczne zagadnienia omówiono na stronie https://cran.r-project.org/web/packages/timeSeries/index.html, gdzie też znajduje się link do podręcznika statystycznego poświęconego szeregom czasowym.