使用带有缺失值和/或不规则时间序列的 R 预测包

机器算法验证 r 时间序列 预测 缺失数据 不均匀间隔时间序列
2022-02-11 06:13:55

R 包给我留下了深刻的印象,forecast例如zoo用于不规则时间序列和缺失值插值的包。

我的应用程序是在呼叫中心流量预测领域,所以周末的数据(几乎)总是丢失,这可以很好地处理zoo此外,一些离散点可能会丢失,我只是使用 R's NA

问题是:预测包的所有美妙魔法,例如等eta()auto.arima()似乎都期望普通ts对象,即不包含任何缺失数据的等间隔时间序列。我认为仅等空间时间序列的真实世界应用程序肯定存在,但是 - 在我看来 - 非常有限。

NA使用 中 和 中提供的任何插值函数可以轻松解决少数离散值的zoo问题forecast::interp之后,我运行预测。

我的问题:

  1. 有没有人提出更好的解决方案?
  2. (我的主要问题)至少在我的应用程序领域,呼叫中心流量预测(以及据我想象的大多数其他问题领域),时间序列不是等距的。至少我们有经常性的“工作日”计划或其他东西。处理这个问题并仍然使用预测包的所有酷魔法的最佳方法是什么?

    我应该只是“压缩”时间序列以填充周末,进行预测,然后再次“膨胀”数据以在周末重新插入 NA 值吗?(我认为那将是一种耻辱?)

    是否有计划使预测包与 Zoo 或其等不规则时间序列包完全兼容?如果是,何时以及如果不是,为什么不呢?

我对预测(和一般统计数据)很陌生,所以我可能会忽略一些重要的事情。

3个回答

在进一步统计处理之前应用插值时应该非常小心。您为插值所做的选择会给您的数据带来偏差。这是您绝对要避免的事情,因为它可能会改变您的预测质量。在我看来,对于您提到的那些缺失值,这些缺失值在时间上有规律地间隔并且对应于活动的停止,将这些天排除在您的模型之外可能更正确。在呼叫中心的小世界(您正在构建的模型)中,最好考虑时间在关闭时简单地停止,而不是发明对不存在活动的测量。另一方面,ARIMA 模型在统计上建立在数据等间距的假设之上。据我所知,ARIMA 不适合您的情况。如果您只是在实际工作日错过了一些测量值,您可能会被迫使用插值。

我不是 R 专家,所以也许有更简单的方法,但我以前遇到过。我之前所做的是实现一个函数,该函数测量实际日期之间的距离(以时间为单位)并将其保存在现有时间序列的新列中。所以我们有类似的东西:

index/date | value | distance  
01.01.2011 |  15   |   1  
02.01.2011 |  17   |   3  
05.01.2011 |  22   |   ..   

这样,如果您的时间序列尚未与实际的时间点序列(或错误格式或其他)相关联,那么您仍然可以使用它。

接下来,您编写一个为您创建新时间序列的函数,如下所示:

首先,您计算时间序列在您选择的日期之间实际有多少时间单位,并在 zoo 或 ts 或任何选择为空值的时间线中创建该时间线。

其次,您获取不完整的时间序列数组,并使用循环将值填充到正确的时间轴中,根据您选择的限制。当您遇到单位距离不是一的行(缺少天(单位))时,您填写插值。

现在,由于这是您的函数,您实际上可以选择如何进行插值。例如,您决定如果距离小于两个单位,则使用标准线性插值。如果缺少一周,您可以执行其他操作,如果达到某个缺少日期的阈值,您会发出有关数据的警告 - 真的是您想想象的任何事情。

如果循环到达结束日期,则返回新的 ts。

这种功能的优点是您可以根据间隙的长度使用不同的插值或处理程序,并以您选择的格式返回干净创建的系列。一旦编写完成,它就可以让您从任何类型的表格数据中获得干净和漂亮的 ts。希望这对您有所帮助。

正如@Remi 所指出的,在根据这些数据估计模型之前,我不会对数据进行插值。这是个坏主意。一个极端的例子:假设您有两个数据点 2013 年 1 月和 2014 年 1 月。现在在其间插入 10 个每月点:2013 年 2 月到 2013 年 12 月,并在每月日期运行回归。实际上它不会那么糟糕,但它是同一个想法:你最多只会夸大你的统计数据。

要走的路是使用处理缺失数据的时间序列方法。例如,状态空间方法。看看astsa R 包。它附带一本关于时间序列分析的优秀书籍。这将很好地处理丢失的数据。Matlab 现在在ssm中具有类似的功能。您必须学习将模型转换为状态空间形式,但是如果您想摆脱auto.arima“魔术”,无论如何都必须学习这一点。