基于时间序列的每日数据预测,但季节性是按季度变化 - 在R中。

3

我过去4年每天都有对一种产品的需求。这种需求有季度性的周期模式,如下图所示:

ploting of ts object

我想基于时间序列进行预测。以下是我的代码:

myts = ts(forecastsku1$Value,frequency=90)
fit <- stl(myts, s.window="period")
plot(fit)
fit <- decompose(myts)
plot(fit)

STL的结果

分解的结果

这里,ts不是创建4个季节因素,而是创建了90个季节因素,这不是我想要的。我想在3个月的时间段内应用相同的季节性,然后进行预测。

参考数据

dput(head(forecastsku1,100))
structure(list(date = structure(c(14625, 14626, 14627, 14628, 14629, 14630, 14631, 14632, 14633, 14634, 14635, 14636, 14637, 
14638, 14639, 14640, 14641, 14642, 14643, 14644, 14645, 14646, 14647, 14648, 14649, 14650, 14651, 14652, 14653, 14654, 14655, 
14656, 14657, 14658, 14659, 14660, 14661, 14662, 14663, 14664, 14665, 14666, 14667, 14668, 14669, 14670, 14671, 14672, 14673, 
14674, 14675, 14676, 14677, 14678, 14679, 14680, 14681, 14682, 14683, 14684, 14685, 14686, 14687, 14688, 14689, 14690, 14691, 
14692, 14693, 14694, 14695, 14696, 14697, 14698, 14699, 14700, 14701, 14702, 14703, 14704, 14705, 14706, 14707, 14708, 14709, 
14710, 14711, 14712, 14713, 14714, 14715, 14716, 14717, 14718, 14719, 14720, 14721, 14722, 14723, 14724), class = "Date"), 
Value = c(1407, 1413, 1407, 1406, 1401, 1410, 1411, 1416, 1404, 1409, 1414, 1414, 1400, 1421, 1398, 1404, 1397, 1404, 1407, 1409, 1406, 1395, 1397, 
1403, 1412, 1399, 1409, 1393, 1405, 1403, 1406, 1402, 1405, 1386, 1393, 1405, 1397, 1393, 1402, 1402, 1393, 1391, 1410, 1402, 1408, 
1394, 1404, 1398, 1406, 1389, 1401, 1391, 1394, 1384, 1377, 1390, 1395, 1399, 1384, 1397, 1398, 1384, 1377, 1394, 1398, 1394, 1391, 
1403, 1382, 1390, 1385, 1403, 1390, 1388, 1391, 1384, 1392, 1390, 1381, 1387, 1395, 1390, 1388, 1384, 1387, 1395, 1380, 1378, 1383, 
1384, 1232, 1247, 1232, 1248, 1236, 1236, 1231, 1237, 1224, 1236)), 
.Names = c("date", "Value"), row.names = 13150:13249, class = "data.frame")

有人能在这种情况下帮我吗?如果需要更多数据,请告诉我。

myts = ts(forecastsku1$Value,frequency=4)
fit <- decompose(myts)
plot(fit)

结果将是: 这里输入图片描述

请提供 dput(head(forecastsku1)) 的输出以使您的数据可重现。 - talat
你可能需要先转换你的数据。 - Rich Scriven
@beginneR - 数据已添加... - vrajs5
@RichardScriven - 这是我的问题,我该如何转换才能保留每日数据以及基于季度的季节性。 - vrajs5
@vrajs5 在 Stack Overflow 上仔细查看。已经有很多关于如何将日常数据转换为周/月数据的问题和答案,例如这里。一旦您将其转换为月度数据,您可以使用 ts(...,frequency=4) 将其转换为季度数据。 - talat
显示剩余4条评论
2个回答

2

由于您在时间序列定义中的频率为90,因此正在创建一个90季节性因素。您需要做的是在ts中指定开始和结束以及period=4,以便可以按照您想要的方式分隔观察结果。如果您成功创建了4个季节性因素,您可以明显地预测季度(4×3=12)。因此,我认为与其使用这些日期,更清晰的是使用start=c(2005,1)。希望这对您有用。


0

这是一个旧问题,但或许我的答案仍有一些价值。 您可以使用dsa包对每日数据进行季节性调整(免责声明:我是作者)。

我尝试复制了您的时间序列(或类似的东西),以便为您提供如何进行季节性调整的想法(季节性调整的设置试图适当地建模时间序列的跳跃行为):

# loading packages
library(dsa); library(xts)

# Replication of the data
set.seed(23)
data <- seq(1250, 1000, , length.out=365.25*4) + rnorm(365.25*4, 0, 5)
time <- seq(as.Date("2008-01-01"), by="days", length.out=365.25*4)    
x <- xts(data, time)
ind <- as.numeric(format(zoo::index(x), "%m")) # Indicator of day of year
x[ind==1 | ind==2 | ind==3 | ind==7 | ind==8 | ind==9] <- 
x[ind==1 | ind==2 | ind==3 | ind==7 | ind==8 | ind==9] + 200

# Seasonally adjusting the data
result <- dsa(x, fourier_number=40, reiterate3=4, reg.create=NULL, cval=30) 
sa <- result$output[,1]
xtsplot(result$output[,c(2,1)], names=c("original", "seasonally adjusted"))
output(result) # creates a html in your working directory.

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