значения в функции ts не соответствуют набору данных? - PullRequest
0 голосов
/ 12 июля 2020

Я искал, как определить временной ряд в 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

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...