[英]Decompose xts hourly time series
I want to decompose hourly time series with decompose
, ets
, or stl
or whatever function. 我想用
decompose
, ets
或stl
或任何函数来分解每小时的时间序列。 Here is an example code and its output: 这是一个示例代码及其输出:
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"
Why does the timezone for time_index
change back to CEST? 为什么
time_index
的时区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
When I call tzone
or indexTZ
there is no timezone but the index
clearly show that the times are defined with a timezone. 当我调用
tzone
或indexTZ
,没有时区,但index
清楚地表明时间是用时区定义的。
Also, why does only ets
work? 另外,为什么只有
ets
工作? Can it be used to decompose a time series? 它可以用来分解时间序列吗?
Why does the timezone for
time_index
change back to CEST?为什么
time_index
的时区time_index
改回CEST?
Because you didn't specify tz=
in your call to as.POSIXct
. 因为您在调用
as.POSIXct
时没有指定tz=
。 It will only pick up the timezone from the string if it's specified by offset from UTC (eg -0800). 如果通过与UTC的偏移(例如-0800)指定,它将仅从字符串中获取时区。 See
?strptime
. 看
?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"
When I call
tzone
orindexTZ
there is no timezone but theindex
clearly show that the times are defined with a timezone.当我调用
tzone
或indexTZ
,没有时区,但index
清楚地表明时间是用时区定义的。
All POSIXct objects have a timezone. 所有POSIXct对象都有一个时区。 A timezone of
""
simply means R wasn't able to determine a specific timezone, so it is using the timezone specified by your operating system. 时区
""
仅表示R无法确定特定时区,因此它使用操作系统指定的时区。 See ?timezone
. 见
?timezone
。
Only the ets
function works because your xts object doesn't have a properly defined frequency
attribute. 只有
ets
函数有效,因为你的xts对象没有正确定义的frequency
属性。 This is a known limitation of xts objects, and I have plans to address them over the next several months. 这是xts对象的已知限制,我计划在接下来的几个月内解决它们。 You can work around the current issues by explicitly specifying the
frequency
attribute after calling the xts constructor. 您可以通过在调用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
You can use tbats
to decompose hourly data: 您可以使用
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)
Additionally, using msts
instead of xts
allows you to specify multiple seasons/cycles, fore instance hourly as well as daily: c(24, 24*7)
此外,使用
msts
而不是xts
可以指定多个季节/周期,例如每小时和每天: c(24, 24*7)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.