Временные ряды и stl в R: допускаются ошибки только одномерных рядов
Я делаю анализ почасовых осадков на файле, который неорганизован. Однако мне удалось очистить его и сохранить в кадре данных (называемом CA1), который принимает форму следующим образом:
Station_ID Guage_Type Lat Long Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
1 4457700 HI 41.52 124.03 1948-07-01 8 LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0
2 4457700 HI 41.52 124.03 1948-07-05 8 LST 0 1 1 1 1 1 2.0000000 2.0000000 2.0000000 4.0000000 5.0000000 5.0000000 4 7 1 1 0 0 10 13 5 1 1 3
3 4457700 HI 41.52 124.03 1948-07-06 8 LST 1 1 1 0 1 1 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0
4 4457700 HI 41.52 124.03 1948-07-27 8 LST 3 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0
5 4457700 HI 41.52 124.03 1948-08-01 8 LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0
6 4457700 HI 41.52 124.03 1948-08-17 8 LST 0 0 0 0 0 0 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 6 1 0 0 0 0 0 0 0 0 0 0
Где от H0 до H23 представляют 24 часа в сутки (строка)
Используя только CA1 (приведенный выше кадр данных), я беру каждый день (строку) из 24 точек, транспонирую его по вертикали и объединяю оставшиеся дни (строки) в одну переменную, которую я называю dat1:
> dat1[1:48,]
H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 4 5 5 4 7 1 1 0 0 10 13 5 1 1 3
Используя переменную dat1, я ввожу ее в качестве аргумента для получения данных временного ряда:
> rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon),
frequency = 24)
Несколько вещей, на которые стоит обратить внимание:
>dim(CA1)
[1] 5636 31
>length(dat1)
[1] 135264
Таким образом, 5636*24 (общее количество баллов [24] на строку) = 135264 баллов. Длина (rainCA1) согласуется с точками выше. Однако, если я положу конец функции ts, такой как
>rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon),
end = c(1900+as.POSIXlt(CA1[5636,5])$year, 1+as.POSIXlt(CA1[5636,5])$mon),
frequency = 24)
Я получаю 1134 общей длины точек, где мне не хватает большого количества данных. Я предполагаю, что это связано с тем, что даты не являются последовательными, и поскольку я использую только месяц и год в качестве аргумента для отправной точки.
Продолжая, в том, что я считаю правильным путем, используя первое вычисление ts без аргумента end, я поставляю его как вход для stl:
>rainCA1_2 <-stl(rainCA1, "periodic")
К сожалению, я получаю ошибку:
Error in stl(rainCA1, "periodic") : only univariate series are allowed
Что я не понимаю или как это сделать. Однако, если я вернусь к функции ts и предоставлю аргумент end, stl работает без ошибок.
Я проводил исследования на многих форумах, но никто (или, насколько я понимаю) не предоставляет хорошего решения для получения атрибутов данных почасовых данных. Если кто-нибудь может мне помочь, я буду очень признателен. Спасибо!
3 ответа
Эта ошибка является результатом формы ваших данных. Пытаться > dim(rainCA1)
; Я подозреваю, что это дает что-то вроде > [1] 135264 1
, замещать rainCA1 <- ts(dat1 ...
от rainCA1 <- ts(dat1[[1]] ...
и это должно работать.
Интересно, правильно ли это происходит? Мне кажется, ваш первый заказ - получить данные в едином формате. Удостовериться ts()
получает правильный вход. Проверьте точную спецификацию ts
,
ts()
не интерпретирует форматы даты и времени. ts()
требует последовательных точек данных с фиксированным интервалом. Он использует основной счетчик и второстепенный счетчик (из которых frequency
вписаться в один основной счетчик). Например, если ваши данные почасовые и вы ожидаете сезонность на дневном уровне, frequency
равно 24 start
а также end
Поэтому, прежде всего, косметические: start
просто указывает t(0) для основного счетчика, тогда как end
означает т (конец).
Я попытался объяснить способ записи на очень простом примере, чтобы избежать подобных ошибок в другом вопросе, связанном здесь:
Если вы подадите заявку
dim()
в co2 или AirPassengers он вернет NULL. Таким образом, предлагаю вам применитьdim(rainCA1)<-NULL
У меня это срабатывало много раз.
Я нашел одно решение: time_series_var <- ts(data[, c("var_of_interest")])
а потом time_series_var <- ts(as.vector(time_series_var))
и тогда ошибка, связанная с одномерным, исчезает, поскольку размеры теперь корректны.