首页 > 解决方案 > R- 转换为 TS

问题描述

我是 R 新手,目前正在努力将一组数据转换为 TS 格式。

Call_VolumeTS10 <- ts(Forecast_Data_Test$`Call Volume`, frequency = 578, start = c(2019, 1,1), end=c(2020, 7, 31))

但是,代码没有正确地将数据转换为每日时间序列。

我的代码有问题吗?

标签: r

解决方案


正如@AlexB 所指出的,频率的值肯定是奇怪的定义。但是,您遇到的错误也与您如何定义startend.

您不能使用长度为 3 的数字向量定义startand end。它必须是长度为 2 的向量:第一个数字应该是年份(或者,一般来说,已经过去的季节数),第二个数字应该是一个数字在 1 和频率值之间。

要正确编写您的 ts,您应该使用以下代码:

Call_VolumeTS10 <- ts(Forecast_Data_Test$`Call Volume`, frequency = 365.25, start = c(2019, 1))

开始、结束和频率将定义如下:

your_data <- rnorm(578)
your_ts <- ts(your_data, start = c(2019, 1), frequency = 365.25)
tsp(your_ts)
#> [1] 2019.00 2020.58  365.25
## respectively: start end frequency

但是,我想你想定义一个ts来预测它。

问题是 365.25 的频率很少被预测方法正确处理(例如forecast::auto.arimaforecast::ets)。

可能您可能需要使用frequency = 7. 当然,在这种情况下,end时间序列定义中的值将毫无意义。

your_data <- rnorm(578)
your_ts <- ts(your_data, start = c(2019, 1), frequency = 7)
tsp(your_ts)
#> [1] 2019.000 2101.429    7.000
## respectively: start end frequency

显然,它没有任何意义。因此,以这种方式定义它会更有意义:

your_data <- rnorm(578)
your_ts <- ts(your_data, frequency = 7)
tsp(your_ts)
#> [1]  1.00000 83.42857  7.00000
## respectively: start end frequency

在这种情况下,您可以将 1.000 和 83.428 之间的差异解释为自时间序列开始以来已经过去了 82 周(加上几天)。


或者,您可以使用包中允许您定义多个频率的msts功能。forecast

library(forecast)
msts(your_ts, start = c(2019, 1), seasonal.periods = c(7, 365.25))
your_ts


#> Multi-Seasonal Time Series:
#> Start: 2019 1
#> Seasonal Periods: 7 365.25
#> Data:
#> ...

msts对象与forecast::fourier和很好地集成forecast::tbats

我建议你看看这个关于它的一些想法。


关于如何start正确书写...

“2019-01-01”是一个非常方便的日子,因为 start 的正确值将是c(2019, 1). 但是,如果您发现自己需要编写不同的开始日期,我建议您使用此代码来定义开始时间:

start = c(lubridate::year(date), as.numeric(format(date, "%j")))

date格式中的任何日期在哪里yyyy-mm-dd


推荐阅读