2012-05-08 4 views
6

Я делаю анализ по почасовым осадкам в файле, который неорганизован. Тем не менее, мне удалось очистить его и хранить его в dataframe (так называемый СА1), который принимает форму, как следует:Временные ряды и stl в R: допускается только одномерная серия

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 часа в сутки (строки)

Использование только СА1 (выше dataframe), Я принимаю каждый день (строки) из 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) соответствует приведенным выше пунктам. Однако, если я поставлю точку в функции Т.С., такие как

>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 вычисления без конца аргумента я поставить его в качестве входных данных для СТЛ:

>rainCA1_2 <-stl(rainCA1, "periodic") 

К сожалению, я получаю сообщение об ошибке:

Error in stl(rainCA1, "periodic") : only univariate series are allowed 

Которые я не понимаю или как это делается. Однако, если я вернусь к функции ts и предоставил конечный аргумент, stl отлично работает без каких-либо ошибок.

Я исследовал на многих форумах, но ни один (или, насколько мне известно) не дает хорошего решения для получения атрибутов данных почасовых данных. Если кто-нибудь может мне помочь, я буду очень признателен. Спасибо!

ответ

7

Эта ошибка является результатом формы ваших данных. Попробуйте > 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 обозначает t (конец).

0

Одно из решений я нашел time_series_var <- ts(data[, c("var_of_interest")]), а затем time_series_var <- ts(as.vector(time_series_var)), а затем ошибка, связанная с univariate, исчезает, поскольку размеры теперь правильны.