2015-07-23 2 views
2

Я хочу разложить почасовые временные ряды с decompose, ets, или stl или любую другую функцию. Ниже приведен пример код и его вывод:Разделить xts почасовые временные ряды

require(xts) 
require(forecast) 
time_index1 <- seq(from = as.POSIXct("2012-05-15 07:00"), 
        to = as.POSIXct("2012-05-17 18:00"), by="hour") 
head(time_index1 <- format(time_index1, format="%Y-%m-%d %H:%M:%S", 
          tz="UTC", usetz=TRUE) 
# [1] "2012-05-15 05:00:00 UTC" "2012-05-15 06:00:00 UTC" 
# [3] "2012-05-15 07:00:00 UTC" "2012-05-15 08:00:00 UTC" 
# [5] "2012-05-15 09:00:00 UTC" "2012-05-15 10:00:00 UTC" 
head(time_index <- as.POSIXct(time_index1)) 
# [1] "2012-05-15 05:00:00 CEST" "2012-05-15 06:00:00 CEST" 
# [3] "2012-05-15 07:00:00 CEST" "2012-05-15 08:00:00 CEST" 
# [5] "2012-05-15 09:00:00 CEST" "2012-05-15 10:00:00 CEST" 

Почему часовой пояс для time_index изменений обратно в ЦЭСТ?

set.seed(1) 
value <- rnorm(n = length(time_index1)) 
eventdata1 <- xts(value, order.by = time_index) 
tzone(eventdata1) 
# [1] "" 
head(index(eventdata1)) 
# [1] "2012-05-15 05:00:00 CEST" "2012-05-15 06:00:00 CEST" 
# [3] "2012-05-15 07:00:00 CEST" "2012-05-15 08:00:00 CEST" 
# [5] "2012-05-15 09:00:00 CEST" "2012-05-15 10:00:00 CEST" 
ets(eventdata1) 
# ETS(A,N,N) 
# 
# Call: 
# ets(y = eventdata1) 
# 
# Smoothing parameters: 
#  alpha = 1e-04 
# 
# Initial states: 
#  l = 0.1077 
# 
# sigma: 0.8481 
# 
#  AIC  AICc  BIC 
# 229.8835 230.0940 234.0722 
decompose(eventdata1) 
# Error in decompose(eventdata1) : 
# time series has no or less than 2 periods 
stl(eventdata1) 
# Error in stl(eventdata1) : 
# series is not periodic or has less than two periods 

Когда я называю tzone или indexTZ нет часовых поясов, но index ясно показывают, что время определяется с часовым поясом.

Кроме того, почему только ets работает? Может ли он использоваться для разложения временного ряда?

ответ

2

Почему часовой пояс для time_index возвращается в CEST?

Поскольку вы не указали tz= в своем обращении к as.POSIXct. Он выберет только часовой пояс из строки, если он задан смещением от UTC (например, -0800). См. ?strptime.

R> head(time_index <- as.POSIXct(time_index1, "UTC")) 
[1] "2012-05-15 12:00:00 UTC" "2012-05-15 13:00:00 UTC" 
[3] "2012-05-15 14:00:00 UTC" "2012-05-15 15:00:00 UTC" 
[5] "2012-05-15 16:00:00 UTC" "2012-05-15 17:00:00 UTC" 

Когда я называю tzone или indexTZ нет часовых поясов, но index ясно показывают, что время определяется с часовым поясом.

Все объекты POSIXct имеют часовой пояс. Часовой пояс "" просто означает, что R не смог определить конкретный часовой пояс, поэтому он использует часовой пояс, указанный вашей операционной системой. См. ?timezone.

Работает только функция ets, потому что ваш объект xts не имеет соответствующего атрибута frequency. Это известное ограничение объектов xts, и я планирую рассмотреть их в течение следующих нескольких месяцев. Вы можете обойти текущие проблемы, явно указав атрибут frequency после вызова конструктора xts.

R> set.seed(1) 
R> value <- rnorm(n = length(time_index1)) 
R> eventdata1 <- xts(value, order.by = time_index) 
R> attr(eventdata1, 'frequency') <- 24 # set frequency attribute 
R> decompose(as.ts(eventdata1)) # decompose expects a 'ts' object 
+0

Спасибо за ответ Джошуа :). Хотя маленький вопрос. Является ли частота = 24 значение для указания программе, что она является часовыми значениями? когда я закладываю разложение, я получаю две вещи, которые я не понимаю. Диапазон значений времени от 1.0 до 3.5 -> что это? а трендовые и случайные кривые имеют меньший временной интервал. Не могли бы вы объяснить, что здесь происходит? –

+0

@SamyGeronymos: Я не понимаю процедуру разложения, поэтому я не могу помочь с этой частью. Это также означает, что я выбрал несколько «частоту = 24» несколько произвольно. Вы можете попробовать установить его на 1/24 ... но, опять же, я не эксперт здесь. –

+0

@JoshuaUlrich, см. Объяснение атрибута 'frequency' здесь: http://robjhyndman.com/hyndsight/seasonal-periods/ – bonna

1

Вы можете использовать tbats разлагаться почасовые данные:

require(forecast) 
set.seed(1) 
time_index1 <- seq(from = as.POSIXct("2012-05-15 07:00"), 
       to = as.POSIXct("2012-05-17 18:00"), by="hour") 
value <- rnorm(n = length(time_index1)) 
eventdata1 <- msts(value, seasonal.periods = c(24)) 
seasonaldecomp <- tbats(eventdata1) 
plot(seasonaldecomp) 

Кроме того, использование msts вместо xts позволяет указать несколько сезонов/циклов, носовую экземпляр ежечасно, а также ежедневно: c(24, 24*7)

Смежные вопросы