Я искал, как определить временной ряд в R с помощью функции ts, и нашел: Ежедневный временной ряд с ts .. как указать начало и конец .
Потому что у меня есть данные сгруппированы по часам (частота = 24). Я думал, что print (ts, calendar = T) распознает от p1 до p24 как часы, а столбец будет соответствовать дням в году.
Я бы хотел написать сценарий, в котором пользователь может определить дату последнего наблюдения и продолжительность периода наблюдения в днях для данного набора данных.
library(forecast)
library(tseries)
library(lubridate)
set.seed(10)
allhours <- data.frame(hour=seq(from= as.POSIXct("2018-01-01 00:00"),
to = as.POSIXct("2018-12-25 23:00"),
by = "hours"))
allnumbers <- data.frame(num = floor(runif(nrow(allhours), min=0, max=101)))
df <- data.frame(allhours,allnumbers) # Dataset
maxDate <- as.POSIXct("2018-04-21 04:00") # Date of last observation
mylength <- 1 # days
fromDATE <- maxDate-days(mylength) # first date of observation
startp <- hour(fromDATE) # start hour
endp <- hour(maxDate) # end hour
ptime1 <- strftime(maxDate, format = "%j") # day of first observation
ptime2 <- strftime(fromDATE, format = "%j") # day of last observation
df1 <- df[df$hour>=fromDATE & df$hour <=maxDate, ] # Data for the time series
if (startp==0){
startp=24
endp=24}
my.ts <- ts(df1$num, frequency = 24, start = c(ptime1,startp), end = c(ptime2,endp))
Используя mylength = 1,2,3, .. . и так далее до 27, print (my.ts, calendar = T), кажется, делает именно то, что я ожидал, т.е. p1 = 01:00:00, ...., p23 = 23: 00: 00 и p24 = 00:00:00, а столбцы соответствуют дням. Итак, p_i, i = 1, .. 24 соответствуют времени, а столбцы слева - дням.
> print(my.ts, calendar=TRUE)# for mylength = 1 day
p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24
110 65 3 89 80 77 95 15 11 82 87 66 17 62 39 54 81 52 37 93 49
111 3 81 46 12 90
startob <- df[df$hour==fromDATE,]
> startob
hour num
2621 2018-04-20 05:00:00 65
> lastob <- df[df$hour==maxDate,]
> lastob
hour num
2645 2018-04-21 05:00:00 90
Теперь я запутался. Если я использую mylength = 28 или больше, я получаю следующий результат:
> print(my.ts,calendar = TRUE)
p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24
83 8 20 71 58 45 78 53 97 83 75 100 50 31 11 66 26 97 79 7 70
84 74 61 65 50 35 42 89 86 18 61 90 60 39 80 37 41 2 61 0 37 100 86 11 11
85 92 86 45 45 42 78 23 94 6 44 82 31 39 16 15 87 22 41 17 12 48 33 92 20
86 4 75 61 70 28 43 93 35 18 28 48 23 21 91 88 20 8 6 18 96 76 75 75 86
87 20 13 72 5 24 12 24 47 9 94 73 66 36 77 20 94 44 77 48 56 13 16 97 87
88 88 47 64 27 17 41 36 74 17 37 16 88 40 50 52 3 69 23 79 16 32 32 11 26
89 26 61 76 95 99 5 91 31 30 98 80 58 63 41 84 14 44 41 25 94 93 59 65 88
90 6 31 96 15 80 85 34 5 33 38 46 61 16 92 43 6 60 87 32 55 64 18 23 26
91 45 65 43 99 40 67 75 0 84 47 27 1 2 2 26 5 28 29 34 67 38 36 81 40
92 1 61 40 11 69 0 54 6 18 74 26 80 91 25 56 4 95 40 99 62 10 16 63 91
93 48 54 34 96 43 77 97 100 56 70 25 3 79 77 5 64 10 80 81 49 29 13 23 15
94 94 14 66 46 13 9 26 39 97 14 31 98 9 94 6 61 91 11 21 21 99 30 3 77
95 43 100 86 27 39 32 90 6 81 84 21 0 43 92 92 59 93 25 83 61 87 58 6 16
96 46 12 57 48 7 37 12 86 92 44 65 81 59 87 55 19 96 23 42 69 89 8 15 51
97 87 72 9 76 91 28 0 61 1 29 88 66 5 43 48 74 66 75 66 34 45 99 63 8
98 95 43 61 43 12 49 64 100 74 16 74 46 90 2 34 29 38 76 89 97 95 79 63 46
99 31 8 19 59 9 51 36 3 67 77 0 36 45 83 5 39 80 43 90 50 1 67 31 27
100 22 40 82 46 22 70 50 40 22 47 58 88 15 0 10 4 7 60 63 69 64 48 20 94
101 76 0 16 52 49 63 49 55 77 31 88 67 10 93 83 1 94 76 52 75 97 58 48 92
102 16 64 13 95 49 88 79 11 92 82 4 27 26 87 52 12 63 13 43 72 23 57 71 2
103 72 92 89 12 56 17 28 90 96 92 99 3 57 28 79 4 94 90 9 5 52 86 23 0
104 98 3 80 60 84 50 75 77 81 0 72 87 35 89 21 94 96 11 86 7 29 31 86 72
105 78 32 23 42 94 83 60 28 53 69 46 40 7 92 12 72 100 53 35 18 69 17 13 10
106 84 50 11 43 70 12 69 77 46 74 83 7 32 83 40 88 13 68 59 81 75 17 65 60
107 24 10 82 44 69 70 37 67 45 88 80 98 15 55 34 83 53 92 36 24 42 50 97 76
108 40 74 97 3 14 42 27 56 7 78 41 67 30 47 32 7 43 42 98 37 70 91 55 53
109 100 50 86 80 44 83 90 2 50 81 30 34 12 19 54 73 81 87 98 5 51 86 56 47
110 27 72 7 65 3 89 80 77 95 15 11 82 87 66 17 62 39 54 81 52 37 93 49 3
111 81 46 12 90 8
> startob <- df[df$hour==fromDATE,]
> startob
hour num
1974 2018-03-24 05:00:00 8
> lastob <- df[df$hour==maxDate,]
> lastob
hour num
2645 2018-04-21 05:00:00 90
Начальное наблюдение правильное, но последнее наблюдение больше не работает, так как 90 наблюдалось в 05:00:00, а не в 04:00:00, также не знаю, почему туда поставили восьмерку из первого наблюдения.
ВОПРОСЫ:
Кто-нибудь знает что пошло не так?
Почему последнее наблюдение в функции ts не соответствует таковому в наборе данных?
Влияет ли это на прогноз на следующий час? т.е. для 06: 00: 00
Лучше ли проверять, когда startp <- hour (fromDATE) или endp <- hour (maxDate) равны 0? Если я не сделаю этого, я сделаю шаг назад на один день, имеет ли это значение для прогноза? </em>
maxDate <- as.POSIXct("2018-04-21 00:00") # new maxDate where the beginning is at 00:00:00
# checked if startp <- hour(fromDATE)==0
> print(my.ts,calendar = TRUE)
p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24
110 56
111 47 27 72 7 65 3 89 80 77 95 15 11 82 87 66 17 62 39 54 81 52 37 93 49
# don't checked if startp <- hour(fromDATE)==0
> print(my.ts,calendar = TRUE)
p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24
109 56
110 47 27 72 7 65 3 89 80 77 95 15 11 82 87 66 17 62 39 54 81 52 37 93 49
Заранее спасибо.