欢迎光临散文网 会员登陆 & 注册

使用R语言进行时间序列(arima,指数平滑)分析

2020-12-25 23:22 作者:拓端tecdat  | 我要投稿

原文:http://tecdat.cn/?p=3609

 

读时间序列数据

您要分析时间序列数据的第一件事就是将其读入R,并绘制时间序列。您可以使用scan()函数将数据读入R,该函数假定连续时间点的数据位于包含一列的简单文本文件中。

 

数据集如下所示:

仅显示了文件的前几行。前三行包含对数据的一些注释,当我们将数据读入R时我们想要忽略它。我们可以通过使用scan()函数的“skip”参数来使用它,它指定了多少行。要忽略的文件顶部。要将文件读入R,忽略前三行,我们键入:

在这种情况下,英国42位连续国王的死亡年龄已被读入变量“国王”。

一旦将时间序列数据读入R,下一步就是将数据存储在R中的时间序列对象中,这样就可以使用R的许多函数来分析时间序列数据。要将数据存储在时间序列对象中,我们使用R中的ts()函数。例如,要将数据存储在变量'kings'中作为R中的时间序列对象,我们键入:

您所拥有的时间序列数据集可能是以不到一年的固定间隔收集的,例如,每月或每季度。在这种情况下,您可以使用ts()函数中的'frequency'参数指定每年收集数据的次数。对于月度时间序列数据,您设置频率= 12,而对于季度时间序列数据,您设置频率= 4。

您还可以使用ts()函数中的“start”参数指定收集数据的第一年和该年度的第一个时间间隔。例如,如果第一个数据点对应于1986年第二季度,则设置start = c(1986,2)。

 

同样,  1987年1月至1993年12月澳大利亚昆士兰州海滩度假小镇纪念品商店的月销售额(来自Wheelwright和Hyndman的原始数据, 1998)。我们可以通过输入以下内容将数据读入R:

绘制时间序列

一旦你将时间序列读入R,下一步通常是制作时间序列数据的图,你可以用R中的plot.ts()函数做。

例如,为了绘制英国42位连续国王的死亡时间序列,我们输入:

此搜索

我们可以从时间图中看出,可以使用加性模型来描述该时间序列,因为数据中的随机波动在大小上随时间大致恒定。

同样,为了绘制纽约市每月出生人数的时间序列,我们输入:

图像2

从这个时间序列我们可以看出,每月出生人数似乎有季节性变化:每年夏天都有一个高峰,每个冬天都有一个低谷。同样,似乎这个时间序列可能是用加性模型来描述的,因为季节性波动的大小随着时间的推移大致不变,似乎并不依赖于时间序列的水平,随机波动似乎也是随着时间的推移大小不变。

同样,为了绘制澳大利亚昆士兰州海滩度假小镇纪念品商店每月销售的时间序列,我们输入:

图像4

在这种情况下,似乎加法模型不适合描述这个时间序列,因为季节性波动和随机波动的大小似乎随着时间序列的水平而增加。因此,我们可能需要转换时间序列以获得可以使用加法模型描述的变换时间序列。例如,我们可以通过计算原始数据的自然日志来转换时间序列:

图像5

在这里我们可以看到,对数变换时间序列中的季节性波动和随机波动的大小似乎随着时间的推移大致不变,并且不依赖于时间序列的水平。因此,可以使用加法模型来描述对数变换的时间序列。

分解时间序列

分解时间序列意味着将其分成其组成部分,这些组成部分通常是趋势分量和不规则分量,如果是季节性时间序列,则是季节性分量。

分解非季节性数据

非季节性时间序列由趋势分量和不规则分量组成。分解时间序列涉及尝试将时间序列分成这些分量,即估计趋势分量和不规则分量。

为了估计可以使用加性模型描述的非季节性时间序列的趋势分量,通常使用平滑方法,例如计算时间序列的简单移动平均值。

“TTR”R包中的SmA()函数可用于使用简单的移动平均值来平滑时间序列数据。要使用此功能,我们首先需要安装“TTR”R软件包 。一旦安装了“TTR”R软件包,就可以输入以下命令加载“TTR”R软件包:

然后,您可以使用“SmA()”功能来平滑时间序列数据。要使用SmA()函数,需要使用参数“n”指定简单移动平均值的顺序(跨度)。例如,要计算5阶的简单移动平均值,我们在SmA()函数中设置n = 5。

例如,如上所述,英国42位连续国王的死亡年龄的时间序列出现是非季节性的,并且可能使用加性模型来描述,因为数据中的随机波动大小基本上是恒定的。时间:

此搜索

因此,我们可以尝试通过使用简单移动平均线进行平滑来估计此时间序列的趋势分量。要使用3阶简单移动平均值平滑时间序列,并绘制平滑时间序列数据,我们键入:

image6

在使用3阶简单移动平均值平滑的时间序列中,似乎存在相当多的随机波动。因此,为了更准确地估计趋势分量,我们可能希望尝试使用简单的移动平均值来平滑数据。更高阶。这需要一些试错,才能找到合适的平滑量。例如,我们可以尝试使用8阶的简单移动平均线:

image7

使用8阶简单移动平均值进行平滑的数据可以更清晰地显示趋势分量,我们可以看到英国国王的死亡年龄似乎已经从大约55岁降至大约38岁在最后的20位国王中,然后在第40位国王在时间序列的统治结束之后增加到大约73岁。

分解季节性数据

季节性时间序列由趋势组件,季节性组件和不规则组件组成。分解时间序列意味着将时间序列分成这三个组成部分:即估计这三个组成部分。

为了估计可以使用加性模型描述的季节性时间序列的趋势分量和季节性分量,我们可以使用R中的“decompose()”函数。该函数估计时间序列的趋势,季节和不规则分量。可以使用加性模型来描述。

函数“decompose()”返回一个列表对象作为结果,其中季节性组件,趋势组件和不规则组件的估计值存储在该列表对象的命名元素中,称为“季节性”,“趋势”和“随机” “ 分别。

例如,如上所述,纽约市每月出生人数的时间序列是季节性的,每年夏季和每年冬季都会出现高峰,并且可能使用加性模型来描述,因为季节性和随机波动似乎是随着时间的推移大小不变:

图像2

为了估计这个时间序列的趋势,季节性和不规则成分,我们输入:

季节性,趋势和不规则成分的估计值现在存储在变量birthstimeseriescomponents $ seasonal,birthstimeseriescomponents $ trend和birthstimeseriescomponents $ random中。例如,我们可以通过键入以下内容输出季节性组件的估计值:

估计的季节性因素是在1月至12月期间给出的,并且每年都是相同的。最大的季节性因素是7月份(约1.46),最低的是2月份(约-2.08),表明7月出生率似乎达到高峰,2月出生低谷。

我们可以使用“plot()”函数绘制时间序列的估计趋势,季节和不规则分量,例如:

image8

上图显示了原始时间序列(顶部),估计趋势分量(从顶部开始的第二个),估计的季节性分量(从顶部开始的第三个)和估计的不规则分量(底部)。我们看到估计的趋势分量显示从1947年的大约24小幅下降到1948年的大约22小幅下降,随后从1959年开始稳步增加到大约27。

季节性调整

如果您有可以使用附加模型描述的季节性时间序列,则可以通过估计季节性成分来季节性地调整时间序列,并从原始时间序列中减去估计的季节性成分。我们可以使用“decompose()”函数计算的季节性成分的估计来做到这一点。

例如,要季节性调整纽约市每月出生人数的时间序列,我们可以使用“decompose()”估算季节性成分,然后从原始时间序列中减去季节性成分:

然后我们可以使用“plot()”函数绘制经季节性调整的时间序列,输入:

图像9

您可以看到季节性变化已从经季节性调整的时间序列中删除。经季节性调整的时间序列现在只包含趋势分量和不规则分量。

使用指数平滑的预测

指数平滑可用于对时间序列数据进行短期预测。

简单的指数平滑

如果您有一个时间序列可以使用具有恒定水平且没有季节性的附加模型来描述,则可以使用简单的指数平滑来进行短期预测。

简单指数平滑方法提供了一种估计当前时间点的水平的方法。平滑由参数alpha控制; 用于估计当前时间点的水平。alpha的值; α值接近于0意味着在对未来值进行预测时,最近的观察值很小。

 

image10

你可以从图中看到大致恒定的水平(平均值保持恒定在25英寸左右)。随着时间的推移,时间序列中的随机波动似乎大致不变,因此使用加性模型描述数据可能是合适的。因此,我们可以使用简单的指数平滑进行预测。

为了使用R中的简单指数平滑进行预测,我们可以使用R中的“HoltWinters()”函数拟合一个简单的指数平滑预测模型。要使用HoltWinters()进行简单的指数平滑,我们需要设置参数beta = FALSE和HoltWinters()函数中的gamma = FALSE(β和gamma参数用于Holt的指数平滑,或Holt-Winters指数平滑,如下所述)。

HoltWinters()函数返回一个列表变量,该变量包含多个命名元素。

例如,要使用简单的指数平滑来预测伦敦年降雨量的时间序列,我们输入:

HoltWinters()的输出告诉我们alpha参数的估计值约为0.024。这非常接近零,告诉我们预测是基于最近和最近的观察结果(虽然对最近的观察更加重视)。

默认情况下,HoltWinters()仅对我们原始时间序列所涵盖的相同时间段进行预测。在这种情况下,我们的原始时间序列包括1813年至1912年伦敦的降雨量,所以预测也是1813年至1912年。

在上面的例子中,我们将HoltWinters()函数的输出存储在列表变量“rainseriesforecasts”中。HoltWinters()的预测存储在这个名为“fits”的列表变量的命名元素中,因此我们可以通过输入以下内容来获取它们的值:

我们可以通过键入以下内容来绘制原始时间序列与预测:

图像11

该图显示原始时间序列为黑色,预测显示为红线。预测的时间序列比原始数据的时间序列要平滑得多。

作为预测准确性的度量,我们可以计算样本内预测误差的平方误差之和,即我们原始时间序列所涵盖的时间段的预测误差。平方误差之和存储在名为“SSE”的列表变量“rainseriesforecasts”的命名元素中,因此我们可以通过键入以下内容来获取其值:

也就是说,这里的平方误差之和为1828.855。

在简单的指数平滑中,通常使用时间序列中的第一个值作为级别的初始值。例如,在伦敦的降雨时间序列中,1813年降雨量的第一个值为23.56(英寸)。您可以使用“l.start”参数指定HoltWinters()函数中水平的初始值。例如,要将级别的初始值设置为23.56进行预测,我们键入:

如上所述,默认情况下,HoltWinters()仅对原始数据所涵盖的时间段进行预测,即降雨时间序列为1813-1912。我们可以使用R“forecast”包中的“forecast.HoltWinters()”函数对更多时间点进行预测。要使用forecast.HoltWinters()函数,我们首先需要安装“预测”R包(有关如何安装R包的说明,请参阅如何安装R包)。

安装“预测”R软件包后,您可以键入以下命令加载“预测”R软件包:

当使用forecast.HoltWinters()函数作为其第一个参数(输入)时,您将使用HoltWinters()函数传递给您已经拟合的预测模型。例如,在降雨时间序列的情况下,我们将使用HoltWinters()的预测模型存储在变量“rainseriesforecasts”中。您可以使用forecast.HoltWinters()中的“h”参数指定要进行预测的其他时间点数。例如,要使用forecast.HoltWinters()预测1814-1820(8年以上)的降雨量,我们输入:

forecast.HoltWinters()函数为您提供一年的预测,预测的预测间隔为80%,预测的预测间隔为95%。例如,1920年的预测降雨量约为24.68英寸,95%的预测间隔为(16.24,33.11)。

要绘制forecast.HoltWinters()所做的预测,我们可以使用“plot.forecast()”函数:

image12

这里1913-1920的预测绘制为蓝线,80%预测间隔绘制为橙色阴影区域,95%预测间隔绘制为黄色阴影区域。

对于每个时间点,“预测误差”被计算为观测值减去预测值。我们只能计算原始时间序列所涵盖的时间段的预测误差,即降雨数据的1813-1912。如上所述,预测模型准确性的一个度量是样本内预测误差的平方误差和(SSE)。

样本内预测错误存储在forecast.HoltWinters()返回的列表变量的命名元素“residuals”中。如果无法改进预测模型,则连续预测的预测误差之间不应存在相关性。换句话说,如果连续预测的预测误差之间存在相关性,则可能通过另一种预测技术可以改进简单的指数平滑预测。

为了弄清楚是否是这种情况,我们可以获得滞后1-20的样本内预测误差的相关图。我们可以使用R中的“acf()”函数计算预测误差的相关图。要指定我们想要查看的最大滞后,我们在acf()中使用“lag.max”参数。

例如,为了计算伦敦降雨数据的样本内预测误差的相关图,我们输入:

image13

您可以从示例相关图中看到滞后3处的自相关刚刚触及显着边界。为了测试是否存在滞后1-20的非零相关性的重要证据,我们可以进行Ljung-Box测试。这可以使用“Box.test()”函数在R中完成。我们想要查看的最大延迟是使用Box.test()函数中的“lag”参数指定的。例如,要测试是否存在滞后1-20的非零自相关,对于伦敦降雨数据的样本内预测误差,我们键入:

这里的Ljung-Box检验统计量为17.4,p值为0.6,因此几乎没有证据表明样本预测误差在1-20落后存在非零自相关。

为了确保预测模型无法改进,检查预测误差是否正态分布均值为零和恒定方差也是一个好主意。要检查预测误差是否具有恒定方差,我们可以制作样本内预测误差的时间图:

image18

该图显示样本内预测误差似乎随时间变化大致不变,尽管时间序列(1820-1830)开始时波动的大小可能略小于后期日期(例如1840年) -1850)。

为了检查预测误差是否正态分布为均值为零,我们可以绘制预测误差的直方图,其中覆盖的正态曲线具有平均零和标准差与预测误差的分布相同。为此,我们可以在下面定义一个R函数“plotForecastErrors()”:

您必须将上述功能复制到R中才能使用它。然后,您可以使用plotForecastErrors()绘制降雨预测的预测误差的直方图(具有重叠的正常曲线):

image19

该图显示预测误差的分布大致以零为中心,并且或多或少地正态分布,尽管与正常曲线相比,它似乎略微偏向右侧。然而,右倾斜相对较小,因此预测误差通常以均值0分布是合理的。

Ljung-Box测试表明,样本内预测误差中几乎没有非零自相关的证据,预测误差的分布似乎正常分布为均值为零。这表明简单的指数平滑方法为伦敦降雨提供了一个充分的预测模型,这可能无法改进。此外,80%和95%预测区间基于的假设(预测误差中没有自相关,预测误差通常以均值零和恒定方差分布)可能是有效的。

霍尔特的指数平滑

如果您的时间序列可以使用趋势增加或减少且没有季节性的加法模型来描述,则可以使用Holt的指数平滑来进行短期预测。

霍尔特的指数平滑估计当前时间点的水平和斜率。平滑由两个参数α控制,用于估计当前时间点的水平,β用于估计当前时间点的趋势分量的斜率b。与简单的指数平滑一样,参数alpha和beta的值介于0和1之间,接近0的值意味着在对未来值进行预测时,对最近的观察值的重要性很小。

时间序列的一个例子可以使用具有趋势和没有季节性的加法模型来描述女性裙子在1866年到1911年的年度直径的时间序列。 过输入以下内容读入并绘制R中的数据:

image14

从图中我们可以看出,直径从1866年的约600增加到1880年的约1050,之后在1911年,下摆直径减少到约520。

为了进行预测,我们可以使用R中的HoltWinters()函数拟合预测模型。要使用HoltWinters()进行Holt的指数平滑,我们需要设置参数gamma = FALSE(gamma参数用于Holt-Winters指数平滑,如下所述)。

例如,要使用Holt的指数平滑来拟合裙摆直径的预测模型,我们键入:

α的估计值为0.84,β的估计值为1.00。这些都很高,告诉我们水平的当前值和趋势分量的斜率b的估计主要基于时间序列中的最近观察。这具有良好的直观感,因为时间序列的水平和斜率都会随着时间的推移而发生很大变化。样本内预测误差的平方和误差的值是16954。

我们可以将原始时间序列绘制为黑色线条,其中预测值为红线,通过键入:

image15

我们从图中可以看出,样本内预测与观测值非常吻合,尽管它们往往略微落后于观测值。

如果需要,可以使用HoltWinters()函数的“l.start”和“b.start”参数指定趋势分量的级别和斜率b的初始值。通常将水平的初始值设置为时间序列中的第一个值(裙边数据为608),并将斜率的初始值设置为第二个值减去第一个值(裙边数据为9)。例如,为了使用Holt的指数平滑拟合裙边折边数据的预测模型,水平的初始值为608,趋势分量的斜率b为9,我们输入:

对于简单的指数平滑,我们可以使用“forecast”包中的forecast.HoltWinters()函数对原始时间序列未涵盖的未来时间进行预测。例如,我们的裙摆下摆的时间序列数据是1866年至1911年,因此我们可以预测1912年至1930年(另外19个数据点),并通过输入以下内容绘制:

image16

预测显示为蓝线,80%预测区间为橙色阴影区域,95%预测区间为黄色阴影区域。

对于简单的指数平滑,我们可以通过检查样本内预测误差是否在滞后1-20处显示非零自相关来检查是否可以改进预测模型。例如,对于裙边折边数据,我们可以制作一个相关图,并通过键入以下内容来执行Ljung-Box测试:

image17

此处相关图显示滞后5处的样本内预测误差的样本自相关超过了显着性边界。然而,我们预计前20个国家中20个自相关中有一个仅仅偶然地超过95%的显着性界限。实际上,当我们进行Ljung-Box检验时,p值为0.47,表明在1-20落后的样本内预测误差中几乎没有证据表明存在非零自相关。

对于简单的指数平滑,我们还应检查预测误差随时间的变化是否恒定,并且通常以均值0分布。我们可以通过制作预测误差的时间图和预测误差分布的直方图以及覆盖的正常曲线来做到这一点:


预测误差的时间图表明预测误差随时间变化大致不变。预测误差的直方图表明,预测误差通常以均值零和常数方差分布是合理的。

因此,Ljung-Box测试表明,预测误差中几乎没有自相关的证据,而预测误差的时间图和直方图表明,预测误差通常以均值零和常数方差分布是合理的。因此,我们可以得出结论,霍尔特的指数平滑为裙摆直径提供了足够的预测模型,这可能无法改进。此外,这意味着80%和95%预测区间所基于的假设可能是有效的。

Holt-Winters指数平滑

如果您有一个时间序列可以使用增加或减少趋势和季节性的加法模型来描述,您可以使用Holt-Winters指数平滑来进行短期预测。

Holt-Winters指数平滑估计当前时间点的水平,斜率和季节性分量。平滑由三个参数控制:α,β和γ,分别用于当前时间点的水平估计,趋势分量的斜率b和季节分量。参数alpha,beta和gamma都具有介于0和1之间的值,并且接近0的值意味着在对未来值进行预测时对最近的观察值的权重相对较小。

可以使用具有趋势和季节性的附加模型描述的时间序列的示例是澳大利亚昆士兰州的海滩度假小镇纪念品商店的月销售日志的时间序列(如上所述):

为了进行预测,我们可以使用HoltWinters()函数拟合预测模型。例如,为了拟合纪念品商店每月销售日志的预测模型,我们输入:

α,β和γ的估计值分别为0.41,0.00和0.96。α(0.41)的值相对较低,表明当前时间点的水平估计是基于最近的观察和更远的过去的一些观察。β的值为0.00,表示趋势分量的斜率b的估计值不在时间序列上更新,而是设置为等于其初始值。这具有良好的直观感,因为水平在时间序列上发生了相当大的变化,但趋势分量的斜率b保持大致相同。相反,伽马值(0.96)很高,表明当前时间点的季节性成分估计仅基于最近的观察。

对于简单的指数平滑和Holt的指数平滑,我们可以将原始时间序列绘制为黑色线条,预测值为红线,顶部为:

我们从图中看到,Holt-Winters指数法非常成功地预测了季节性峰值,这种峰值大致发生在每年的11月。

为了对未包含在原始时间序列中的未来时间进行预测,我们在“预测”包中使用“forecast.HoltWinters()”函数。例如,纪念品销售的原始数据是从1987年1月到1993年12月。如果我们想要预测1994年1月至1998年12月(48个月以上),并绘制预测图,我们将输入:


还有问题吗? 联系我们!

 

最受欢迎的见解

1.在python中使用lstm和pytorch进行时间序列预测

2.python中利用长短期记忆模型lstm进行时间序列预测分析

3.使用r语言进行时间序列(arima,指数平滑)分析

4.r语言多元copula-garch-模型时间序列预测

5.r语言copulas和金融时间序列案例

6.使用r语言随机波动模型sv处理时间序列中的随机波动

7.r语言时间序列tar阈值自回归模型

8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

9.python3用arima模型进行时间序列预测

使用R语言进行时间序列(arima,指数平滑)分析的评论 (共 条)

分享到微博请遵守国家法律