分解xts小时时间序列

4

我想使用decomposeets或者stl等函数对小时级时间序列进行分解。下面是一个示例代码及其输出:

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的时区会变回CEST?
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

当我调用tzoneindexTZ时,没有时区,但index清楚地显示时间是使用时区定义的。
另外,为什么只有ets起作用?它可以用来分解时间序列吗?
2个回答

5

为什么time_index的时区会改回CEST?

因为你在调用as.POSIXct时没有指定tz=。只有当字符串中以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对象已知的限制,我计划在接下来的几个月中解决这些问题。 在调用xts构造函数后,您可以通过显式指定“frequency”属性来解决当前的问题。
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

谢谢你的回答,Joshua :). 我有一个小问题。频率=24是告诉程序这是每小时的值吗?当我绘制分解图时,有两件事我不理解。时间值的范围是从1.0到3.5->这是什么?趋势和随机曲线具有较小的时间范围。你能解释一下发生了什么吗? - Samy Geronymos
@SamyGeronymos:我不理解分解过程,所以无法帮助处理这部分。这也意味着我选择将“frequency = 24”设置得有些随意。你可以尝试将其设置为1/24...但是,再次强调,我在这方面并不是专家。 - Joshua Ulrich
@JoshuaUlrich,请查看此处有关“frequency”属性的解释:http://robjhyndman.com/hyndsight/seasonal-periods/。 - bonna

3
您可以使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接