R中的每周和每年季节性

R中的每周和每年季节性,r,time-series,R,Time Series,我有从2007年1月1日到2016年12月31日的每日电力负荷数据。我使用ts()函数像这样加载数据 ts_load <- ts(data, start = c(2007,1), end = c(2016,12),frequency = 365) 我的问题是,我做得对吗?这是消除年度季节性的正确方法吗?消除每周季节性的正确方法是什么?几点: ts序列必须具有规则间隔的点,并且每个循环中的点数相同。问题中规定了365的频率,但某些年份,即闰年,将有366点。特别是,如果希望频率为一年,则

我有从2007年1月1日到2016年12月31日的每日电力负荷数据。我使用ts()函数像这样加载数据

ts_load <- ts(data, start = c(2007,1), end = c(2016,12),frequency = 365)
我的问题是,我做得对吗?这是消除年度季节性的正确方法吗?消除每周季节性的正确方法是什么?

几点:

  • ts
    序列必须具有规则间隔的点,并且每个循环中的点数相同。问题中规定了365的频率,但某些年份,即闰年,将有366点。特别是,如果希望频率为一年,则不能使用每日或每周数据而不进行调整,因为不同年份的天数不同,并且一年中的周数不是整数

  • decompose
    不处理多个季节性事件。如果每周你指的是去除星期一、星期二等的影响,如果每年你指的是去除一年中的第一、第二等的影响,那么你要求的是多个季节性

  • end=c(2017,12)
    指2017年的第12天,因为频率为365

forecast包中的
msts
函数可以处理多个和非整数季节性

基于R,另一种方法是通过线性模型来近似它,避免所有上述问题(但忽略相关性),我们将对此进行讨论

假设最后注释中重复显示的数据,我们定义了一周中的某一天,道琼斯指数和一年中的某一天,变量和具有截距和趋势的回归,然后在代码的最后一行构造截距加趋势加残差,以取消季节化。这不是绝对必要的,但我们使用了
scale
来去除
trend
的平均值,以便定义
data.ds
的三个术语是相互正交的——无论我们是否这样做,根据线性模型的属性,第三个术语将与其他两个术语正交

trend <- scale(seq_along(d), TRUE, FALSE)
dow <- format(d, "%a")
doy <- format(d, "%j")
fm <- lm(data ~ trend + dow + doy)
data.ds <- coef(fm)[1] + coef(fm)[2] * trend + resid(fm)

trend您可以使用dsa包中的dsa功能调整每日时间序列。与回归解决方案相比,它的优势在于,它考虑到季节的影响会随着时间的推移而变化,通常情况就是这样。
为了使用该函数,您的数据应该是xts格式(来自xts包)。因为在这种情况下,闰年不会被忽略。
代码将如下所示:

install.packages(c("xts", "dsa"))

data = rnorm(365.25*10, 100, 1)
data_xts <- xts::xts(data, seq.Date(as.Date("2007-01-01"), by="days", length.out = length(data)))

sa = dsa::dsa(data_xts, fourier_number = 24) 
# the fourier_number is used to model monthly recurring seasonal patterns in the regARIMA part

data_adjusted <- sa$output[,1]
安装包(c(“xts”、“dsa”)) 数据=rnorm(365.25*10100,1)
数据\u xts请包括实际数据(使用
dput(head(data))
以便我们提供帮助you@RAB>dput(头部(负载))c(94275、97269、98686、98262、96839、97398)请将数据添加到原始注释中。请参阅:
set.seed(123)
d <- seq(as.Date("2007-01-01"), as.Date("2016-12-31"), "day")
n <- length(d)
trend <- 1:n
seas_week <- rep(1:7, length = n)
seas_year <- rep(1:365, length = n)
noise <- rnorm(n)
data <- trend + seas_week + seas_year + noise
install.packages(c("xts", "dsa"))

data = rnorm(365.25*10, 100, 1)
data_xts <- xts::xts(data, seq.Date(as.Date("2007-01-01"), by="days", length.out = length(data)))

sa = dsa::dsa(data_xts, fourier_number = 24) 
# the fourier_number is used to model monthly recurring seasonal patterns in the regARIMA part

data_adjusted <- sa$output[,1]