【R语言时间序列】季节性分解、指数平滑模型、ARIMA模型的简单示例

文摘   2024-12-15 07:46   山东  


在上一期的分享中,我们进行了时间序列常见数据类型整理及简单时间序列图的绘制的简单介绍,今天我们继续分享季节性分解、指数平滑模型、ARIMA模型的简单示例。




时间序列分析

时间序列分析‌是一种动态数据处理的统计方法,基于随机过程理论和数理统计学方法,用于研究随机数据序列所遵从的统计规律,以解决实际问题。它广泛应用于经济、商业、社会问题研究中,是研究统计指标动态特征和周期特征及相关关系的重要方法‌。


季节性分解

时间序列可以分解为三种成分:水平部分(平均值),趋势部分(上升或下降),季节性部分(周期性的重复),剩余的就是随机变动,即前三者都没法解释的“杂音”。我们常见的时间序列,根据复杂度的不同,一般上述三种成分中的一种、两种或三种组合而成。当然,你也可以把水平部分当成趋势的特例,或者趋势的一部分。那么,时间序列就可简化为两部分:趋势和季节性,以及两者之外的随机变动。

“季节性分解”过程可将一个序列分解成一个季节性成分、一个组合趋势和循环的成分和一个“误差”成分。 此过程是对比率与移动平均值方法的实现。

模型类型

 “周期性分解”过程提供两种方法来对周期性因素进行建模:乘法或加法。

一、乘法。 季节性成分是一个因子,用来与经过季节性调整的序列相乘以得到原始序列。 实际上,“趋势”会评估与序列的总体水平成正比的季节性成分。 无季节性变动的观测值的季节性成分为 1。

二、加法。 将季节性调整添加到季节调整序列中即可得到初始序列。 此调整尝试从序列中移去季节性影响,以查看可能被季节性成分“掩盖”的其他兴趣特征。 实际上,“趋势”会评估不依赖于序列的总体水平的季节性成分。 无季节性变动的观测值的季节性成分为 0。


指数平滑模型

指数平滑模型是一种在时间序列预测中应用广泛的方法,它能帮助我们分析并预测数据的未来走向。模型分为三种类型:单指数模型、双指数模型和三指数模型。

单指数模型是最基础的,它假设数据由水平项和误差项构成,水平项代表历史数据的加权平均,误差项则表示随机干扰。双指数模型进一步加入了趋势项,意味着数据除了水平和误差外,还可能有上升或下降的趋势。三指数模型则在此基础上引入了季节性因子,适用于有周期性变化的数据。


ARIMA模型

ARIMA模型(Autoregressive Integrated Moving Average Model)‌是一种用于时间序列数据分析和预测的统计模型。ARIMA模型结合了自回归(AR)、滑动平均(MA)和差分(I)三个部分,用于处理非平稳时间序列数据。

ARIMA模型的基本概念和组成部分

ARIMA模型由三个主要部分组成:

‌自回归(AR)‌:使用时间序列数据的过去值来预测未来值。

‌滑动平均(MA)‌:使用过去误差项的加权和来预测未来值。

‌差分(I)‌:通过差分操作将非平稳时间序列转化为平稳时间序列。

ARIMA模型的应用场景和优缺点

ARIMA模型适用于需要预测未来趋势的场景,如股票价格预测、天气预报、销售数据分析等。其优点包括:

‌高精度‌:通过综合考虑历史数据和误差项,能够提供较为准确的预测。

‌灵活性‌:可以通过调整参数来适应不同的数据特性。

缺点包括:

‌复杂性‌:模型参数的选择和调整较为复杂,需要专业知识。

‌过拟合‌:如果参数选择不当,可能导致模型过拟合,影响预测效果。




今天我们仍以时间序列绘图数据为例,分享季节性分解、指数平滑模型、ARIMA模型的简单示例。








#读取Excel数据进行时间序列绘图

library(readxl) #加载包

tsdata <- read_excel("C:/Users/hyy/Desktop/绘图数据.xlsx", col_names = TRUE )

tsdata







#提取各月份数据形成一维向量

tsdata <- c(tsdata$Jan,tsdata$Feb,tsdata$Mar,

tsdata$Apr,tsdata$May,tsdata$Jun,

             tsdata$Jul,tsdata$Aug,tsdata$Sep,

             tsdata$Oct,tsdata$Nov,tsdata$Dec)

tsdata








#以十二月1年频率,生成2012年1月至2023年12月数据

tsdata <- ts(tsdata,frequency=12,start=c(2012,1))

tsdata








#对时间序列进行绘图

plot(tsdata)

plot(tsdata,xlab="month",ylab="incident",

     main = "Time Series Plot",sub = "医学统计数据分析工作室")  










#使用stl()函数进行季节性分解并绘图

# 季节性分解

tss <- stl(tsdata, s.window="period") # 季节性分解

tss

plot(tss)










#内置HoltWinters()函数指数平滑模型

# 一次指数平滑模型,代表数据没有趋势和季节性

psm1 <- HoltWinters(tsdata, beta=FALSE, gamma=FALSE) 

# beta代表趋势,gamma代表季节性

# 二次指数平滑模型,指数据有趋势但没有季节性

psm2 <- HoltWinters(tsdata, gamma=FALSE)

# 三次指数平滑模型,数据既有趋势又有季节性

psm3 <- HoltWinters(tsdata)

library(forecast)

forecast(psm3, 30)

plot(forecast(psm3, 30))










#季节性绘图

library(forecast)

seasonplot(tsdata)







#“forecast”包的ets()拟合指数模型

library(forecast)

psm4 <- ets(tsdata)

forecast(psm4,30)

plot(forecast(psm4,30))










#“forecast”包的auto.arima()拟合ARIMA模型

arima1 <- auto.arima(tsdata)

forecast(arima1,30)

plot(forecast(arima1,30))










#数据太随机了,将随机数据更换为季节性数据

#读取Excel数据进行时间序列绘图

library(readxl) #加载包

tsdata2 <- read_excel("C:/Users/hyy/Desktop/时间序列数据.xlsx", 

       col_names = TRUE )

tsdata2 <- c(tsdata2$Jan,tsdata2$Feb,tsdata2$Mar,tsdata2$Apr,

    tsdata2$May,tsdata2$Jun,

            tsdata2$Jul,tsdata2$Aug,tsdata2$Sep,

       tsdata2$Oct,tsdata2$Nov,tsdata2$Dec)

tsdata2 <- ts(tsdata2,frequency=12,start=c(2012,1))

tsdata2

plot(tsdata2,xlab="month",ylab="incident",

     main = "Time Series Plot",sub = "医学统计数据分析工作室") 










#季节性绘图

library(forecast)

seasonplot(tsdata2)








#“forecast”包的ets()拟合指数模型

library(forecast)

psm5 <- ets(tsdata2)

forecast(psm5,30)

plot(forecast(psm5,30))










#“forecast”包的auto.arima()拟合ARIMA模型

arima2 <- auto.arima(tsdata2)

forecast(arima2,30)

plot(forecast(arima2,30))









医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
 最新文章