R语言 指数平滑法
指数平滑是一种使用指数窗口函数对时间序列数据进行平滑的技术。它是一种经验法则。与简单的移动平均不同,随着时间的推移,指数函数分配的权重呈指数递减。在这里,较大的权重被放在最近的数值或观测值上,而较小的权重被放在较早的数值或观测值上。在许多窗口函数中,在信号处理中,指数平滑函数通常被应用于平滑数据,它作为一个低通滤波器,以去除高频噪声。这种方法相当直观,一般可以应用于广泛或巨大的时间序列,而且计算效率高。在这篇文章中,让我们讨论一下R编程中的指数平滑法。基于趋势和季节性的指数平滑技术有很多类型,具体如下。
- 简单指数平滑法
- 霍尔特的方法
- 霍尔特-温特的季节性方法
- 阻尼趋势法
在继续之前,需要看看复制的要求。
在R中分析的复制要求
在R语言中,本分析的先决条件是安装所需的包。我们需要在R控制台使用 install.packages() 命令来安装以下两个包。
- fpp2 (预测包将被自动加载)。
- tidyverse
在预测包下,我们将得到许多功能,这些功能将加强和帮助我们的预测。在这个分析中,我们将在 fpp2 包下处理两个数据集。它们是 “goog “数据集和 “qcement “数据集。现在我们需要使用 library() 函数在我们的R脚本中加载所需的包。在加载这两个包之后,我们将准备我们的数据集。对于这两个数据集,我们将把数据分成两组,即训练集和测试集。
现在我们准备进行分析了。
简单指数平滑法(SES)
简单指数平滑 技术用于没有趋势或季节性模式的数据。SES是所有指数平滑技术中最简单的一种。我们知道,在任何类型的指数平滑中,我们对最近的数值或观测值的权重比对旧的数值或观测值的权重要高。每一个参数的权重总是由一个 平滑参数 或 阿尔法 决定 。 在实践中,如果阿尔法在0.1和0.2之间,那么SES将表现得相当好。当α值接近0时,它被认为是缓慢的学习,因为该算法给予历史数据更多的权重。如果α值接近于1,那么它被称为快速学习,因为该算法给予最近的观察或数据更多的权重。因此,我们可以说,数据中最近的变化将对预测留下更大的影响。
在R中,为了执行简单指数平滑分析,我们需要使用 ses() 函数。为了理解这个技术,我们将看到一些例子。我们将使用goog的SES数据集。
例1 :
在这个例子中,我们为我们的初始模型设置了α=0.2和预测前移步数h=100。
输出
从上面的输出图中,我们可以注意到,我们的预测模型对未来的预测是一个平缓的估计。因此,我们可以说,从数据来看,它没有捕捉到目前的趋势。因此,为了纠正这一点,我们将使用 diff() 函数来去除数据中的趋势。
例2 :
输出
为了了解我们模型的性能,我们需要将我们的预测与验证或测试数据集进行比较。由于我们的训练数据集是有差异的,我们也需要形成或创建有差异的验证或测试集。
例3 :
这里我们要创建一个差分验证集,然后将我们的预测与验证集进行比较。在这里,我们使用循环设置了0.01-0.99的α值。我们试图了解哪个水平将使RMSE测试最小化。我们将看到,0.05将是最小的。
输出
现在,我们将尝试用α=0.05来重新拟合我们对SES的预测模型。我们会注意到α0.02和α=0.05之间的显著差异。
例4 :
输出
我们将看到,现在我们模型的预测置信区间要窄得多。
霍尔特的方法
我们已经看到,在SES中,我们必须去除长期趋势以改善模型。但在 霍尔特方法 中,我们可以在捕捉数据趋势的同时应用指数平滑法。这是一种适用于有趋势但无季节性的数据的技术。为了对数据进行预测,霍尔特方法使用了两个 平滑参数,α和β ,它们分别对应于水平成分和趋势成分。
在R语言中,为了应用霍尔特方法,我们将使用 holt() 函数。我们将再次通过一些例子来了解这一技术的工作原理。我们将再次使用goog数据集。
例1 :
输出
在上述例子中,我们没有手动设置α和β的值。但我们可以这样做。然而,如果我们提到阿尔法和贝塔的任何值,那么 holt() 函数将自动识别最佳值。在这个例子中,如果阿尔法的值是0.9967,那么它表示快速学习,如果贝塔的值是0.0001,那么它表示趋势的缓慢学习。
例子2 :
在这个例子中,我们将设置α和β的值。同时,我们将看到模型的准确性。
输出
最佳值,即β=0.0001,用于消除训练集中的错误。我们可以将我们的β值调整到这个最佳值。
例3 :
让我们尝试通过一个从0.0001到0.5的循环找到beta的最佳值 ,使RMSE测试最小。我们将看到,0.0601将是能使RMSE下降的β值。
输出
现在让我们用得到的最优β值重新构建模型。
例4 :
我们将设定β的最佳值,并与我们的原始模型比较预测的准确性。
输出
我们会发现,与原始模型相比,最优模型要保守得多。同时,最优模型的置信区间也更加极端。
霍尔特-温特的季节性方法
霍尔特-温特的季节性 方法被用于具有季节性模式和趋势的数据。这个方法可以通过使用 加法结构 或使用 乘法结构 来实现,这取决于数据集的情况。当数据的季节性模式具有相同的幅度或始终保持一致时,就采用加法结构或模型,而如果数据的季节性模式的幅度随时间的推移而增加,就采用乘法结构或模型。它使用 三个平滑参数,即α、β和γ。
在R中,我们使用 decompose() 函数来执行这种指数平滑。我们将使用qcement数据集来研究这种技术的工作。
例1 :
输出
为了创建一个处理误差、趋势和季节性的加性模型,我们将使用ets () 函数。在36个模型中,ets () 选择了最佳的加性模型。对于加性模型,ets () 的模型参数将是’AAA’。
例2 :
输出
现在我们将评估我们的模型并总结出平滑参数。我们还将检查残差并找出我们模型的准确性。
例3 :
输出
现在我们要看看乘法模型是如何使用ets () 工作的 。 为此,ets () 的模型参数将是 “MAM”。
例4 :
输出
在这里,我们将优化gamma参数,以最小化错误率。伽马的值将是0.21。同时,我们将找出准确度,并绘制预测值。
例5 :
输出
R中的阻 尼法
阻尼法使用 阻尼系数 phi 来更保守地估计预测的趋势。如果我们相信我们的加法和乘法模型将是一条平坦的线,那么它有可能是阻尼的。为了理解阻尼预测的工作原理,我们将使用 fpp2::ausair 数据集,我们将创建许多模型,并试图获得更保守的趋势线。
例子
输出