2022-12-22时间序列分析

犹记得大学那会儿,基本上每年寒暑假都要参加数学建模竞赛,书买了不少,题做了不少,但每次只选自己能看得懂的,稍微难一点就糊弄过去甚至是直接放弃,所以到最后仍然是一个代码不会编、模型不会整的半吊子,现在想想都觉得惭愧与后悔,白白浪费了那么多光阴,唉~~~

时间序列分析(Time series analysis)这一章可谓是非常统计学,所以能把它看懂真的要了我老命,概念模型一大堆,代码实现就几行,总之学好它真难!!!
时间序列学习的一些基本知识

# 加载包
library(dplyr)
library(tidyr)
library(tseries)
library(forecast)
library(ggplot2)
library(prophet)

1. ARIMA模型

ARMA(自回归移动平均)模型针对的是平稳的一元时间序列,对于不平稳的序列数据可采用差分运算得到平稳的序列;而ARIMA(差分自回归移动平均)模型是差分运算和ARMA模型的结合。
autoplot.ts: Automatically create a ggplot for time series objects in forecast: Forecasting Functions for Time Series and Linear Models

使用ARIMA模型预测的通用过程

# 加载数据
data(Nile)
str(Nile)
autoplot(Nile) + 
    ggtitle("序列变化趋势") +
    ylab("流量") +
    xlab("年份")+
    theme(text = element_text(family = "STKaiti"))+
    theme(plot.title = element_text(hjust = 0.5))
# 白噪声检验
Box.test(Nile,type = "Ljung-Box")
## p<0.05,拒绝原假设,说明不是白噪声

# 平稳性检验,单位根检验
adf.test(Nile)
## p>0.05,接受原假设,说明序列不平稳

# 时间序列数据切分:前90年的数据用于训练模型,后10年的数据用于查看预测效果
nile_train <- window(Nile,end = 1960)
nile_test <- window(Nile,start = 1961)

# 对训练序列进行单位根检验
adf.test(nile_train,k = 1) # 训练序列
## p<0.05,拒绝原假设,说明训练序列平稳

# 建立ARIMA模型
auto.arima(nile_train)
ARIMA <- arima(nile_train,order = c(1,1,1))
summary(ARIMA)
Box.test(ARIMA$residuals,type = "Ljung-Box")
# p>0.05,即模型的残差已是白噪声数据,说明数据中的有用信息已经得到充分的提取

# 可视化模型的预测值和实际值的差距
par(family = "STKaiti")
plot(forecast(ARIMA,10),shadecols = "oldstyle")
points(nile_test,col = "red")
lines(nile_test,col = "red")
## 最后十年的预测数据与实际数据相比,差异较大,实际数据有很大的波动,而预测数据更偏向于实际数据的平均值。

2. prophet预测时间序列

# 加载数据
data(gold)
str(gold)
summary(gold) 
# 结果表明含有34个缺失值
autoplot(gold) + ggtitle("序列变化趋势")
# 显示有1个异常值


处理缺失值和离群值 | 预测: 方法与实践
Forecasting: Principles and Practice (3rd ed)

# 处理缺失值
gold2 <- na.interp(gold)
autoplot(gold2, series="Interpolated") +
  autolayer(gold, series="Original") +
  scale_color_manual(values=c('Interpolated'="red",'Original'="gray")) +
  xlab("时间") +
  theme(text = element_text(family = "STKaiti"))
# 处理离群值
tsoutliers(gold2)
gold2[768:772]
gold2[770]=494.9
autoplot(gold2) + ggtitle("序列变化趋势")
# $index
# 770
# $replacements
# 494.9
# 495 502.75 593.7 487.05 487.75

# 处理缺失值和离群值的其他方法
gold3 <- tsclean(gold)
autoplot(gold3) + ggtitle("序列变化趋势")
# 白噪声检验
Box.test(gold2,type = "Ljung-Box")
## p<0.05,拒绝原假设,说明不是白噪声

# 平稳性检验,单位根检验
adf.test(gold2)
## p>0.05,接受原假设,说明序列是非平稳的

# ARIMA模型建立
gold2_train <- window(gold2,end = 1078)
gold2_test <- window(gold2,start = 1079)
adf.test(gold2_train,k = 1)
adf.test(diff(gold2_train),k = 1)
adf.test(diff(diff(gold2_train)),k = 1)
# 从结果可以发现,在序列延迟1阶的情况下,原始数据和1阶差分数据都有单位根,且差分一次后的数据都是平稳的

auto.arima(gold2_train)
ARIMA <- arima(gold2_train,c(0,1,1))
summary(ARIMA)
Box.test(ARIMA$residuals,type = "Ljung-Box")
# 在训练集上模型的平均绝对值拟合误差MAE=2.82,非常小,说明模型在训练数据集上拟合效果非常好。
# 另外,在白噪声检验中,p>0.05,即模型的残差已经是白噪声数据,说明数据中的有用信息已经得到充分提取。

par(family = "STKaiti")
plot(forecast(ARIMA,30),shadecols = "oldstyle")
points(gold2_test,col = "red")
lines(gold2_test,col = "red")
# 数据集的70%建立模型
trainnum <- round(length(gold2)*0.7)
gold2_train <- window(gold2,end = trainnum)
gold2_test <- window(gold2,start = trainnum+1)

auto.arima(gold2_train)
ARIMA <- arima(gold2_train,c(2,1,2))
summary(ARIMA)
Box.test(ARIMA$residuals,type = "Ljung-Box")

par(family = "STKaiti")
plot(forecast(ARIMA,length(gold2)*0.3),shadecols = "oldstyle")
points(gold2_test,col = "red")
lines(gold2_test,col = "red")

# 数据集的80%建立模型
trainnum <- round(length(gold2)*0.8)
gold2_train <- window(gold2,end = trainnum)
gold2_test <- window(gold2,start = trainnum+1)

auto.arima(gold2_train)
ARIMA <- arima(gold2_train,c(1,1,2))
summary(ARIMA)
Box.test(ARIMA$residuals,type = "Ljung-Box")

par(family = "STKaiti")
plot(forecast(ARIMA,length(gold2)*0.2),shadecols = "oldstyle")
points(gold2_test,col = "red")
lines(gold2_test,col = "red")

# 数据集的90%建立模型
trainnum <- round(length(gold2)*0.9)
gold2_train <- window(gold2,end = trainnum)
gold2_test <- window(gold2,start = trainnum+1)

auto.arima(gold2_train)
ARIMA <- arima(gold2_train,c(2,1,1))
summary(ARIMA)
Box.test(ARIMA$residuals,type = "Ljung-Box")

par(family = "STKaiti")
plot(forecast(ARIMA,length(gold2)*0.1),shadecols = "oldstyle")
points(gold2_test,col = "red")
lines(gold2_test,col = "red")
## 70%和80%预测的结果与实际值相比偏大,90%预测的结果更偏向于实际值的平均值。
70%数据集

80%数据集

90%数据集
# 使用prophet包建立预测模型
gold <- gold2 %>% as.data.frame
colnames(gold) <- "y"
gold$ds <- row.names(gold)
gold$ds <- as.yearmon.default(gold$ds)
head(gold)
tail(gold)

model <- prophet(gold)
future <- make_future_dataframe(model,periods = 30)
forecast <- predict(model,future)
options(repr.plot.width=12, repr.plot.height=5)
plot(model,forecast)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354