imetime series data mining主要包括decompose(分析数据的各个成分,例如趋势,周期性),prediction(预测未来的值),classification(对有序数据序列的feature提取与分类),clustering(相似数列聚类)等。时序数据prediction(forecast,预测)使用最广泛的两个算法: Holt-Winters 和 ARIMA。其它的常用函数说明如下:
- stats::ts() --生成时序对象
- stats::start() --返回时间序列的开始时间
- stats::end() --返回时间序列的开始时间
- stats::frequency --返回时间序列中时间点的个数
- stats::window() --对时间序列取子集
- graphics::plot() --画出时间序列拆线图
- stats::monthplot() --画出时序中的季节项
- forecast::seasonplot --生成季节图
- stats::stl() -- 用 LOESS光滑将时序分解为季节项、趋势项和随机项。局限之处——只能处理相加模型
- stats::decompose() -- 对相加与相乘模型都可以直接进行季节分解
- forecast::ma() -- 拟合一个简单的移动平均模型
- stats::HoltWinters() -- 三次平滑指数法,拟合指数平常模型
- forecast::ets() -- 拟合指数平滑模型,同时也可以自动选取最优模型
- forecast::accuracy() -- 返回时序的拟合优度度量
- tseries::adf.test() -- 对序列做ADF检验以判断其是否平稳
- stats::lag() -- 返回取过指定滞后项后的时序
- base::diff() -- 返回取过滞后项和差分后的序列
- forecast::ndiffs() -- 找到最优差分次数以移除序列中的趋势项
- forecast::acf() -- 估计自相关函数
- forecast::pacf() -- 估计偏自相关函数
- stats::arima() -- 似合 ARIMA模型
- forecast::auto.arima() --自动选择 ARIMA模型,可能不准确
- forecast::forecast() --预测时序的未来值
- stats::Box.test() -- 进行Ljung-Box 检验以判断模型的残差是否独立
- tseries::bds.test() -- 进行BDS检验以判断序列中的随机变量是否服从独立分布
stats::ts(): 生成时序对象
ts(data, frequency=n, start=x, end=y, names=c(a,b,c,...))
- data: 观察到的时间序列值的向量或矩阵。
- frequency: 频次,n=1 为年, n=4为季度,n=7 为周, n=12 为月等
- start: 起始时点
> t <- ts(testSrc$tp,start = c(2016,1),frequency= 12)
> start(t)
[1] 2016 1
> end(t)
[1] 2017 12
> frequency(t)
[1] 12
- 按天时间段
> library(zoo)
> zoo <- zoo(testSrc$dp,order.by = as.Date(as.character(testSrc$biztime), format='%Y-%m-%d'))
> ts <- ts(zoo)
> str(ts)
Time-Series [1:742] from 1 to 742: 62772 57541 59310 66895 71020 ...
- attr(*, "index")= Date[1:742], format: "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" ...
- 另一种写法:
xl<- ts(testSrc$dp,start=c(2016,01,01),frequency=365)
str(xl)
stats::decompose() 对相加与相乘模型都可以直接进行季节分解
decompose(x, type = c("additive", "multiplicative"), filter = NULL)
xl<- ts(testSrc$dp,start=c(2016,01,01),frequency=365)
##季节分解
ml <- decompose(xl,c("multiplicative"))
plot(ml)
- 在分解季节成分的基础上,如果有需要的话,我们可以对时间序列进行季节因素调整,将这一部分信息从原始数据中去除。
xl<- ts(testSrc$dp,start=c(2016,01,01),frequency=365)
##季节分解
ml <- decompose(xl,c("multiplicative"))
plot(ml)
data2 <- xl - ml$seasonal
par(mfrow=c(1,2))
plot(xl)
plot(data2)
forecast::ets():拟合指数平滑模型
ets(ts, model="ZZZ",.....)
- 限制模型的字母有三个。第一个字母代表误差项,第二个字母代表趋势项,第三个字母则代表季节项。
- 可选的字母包括:相加模型(A)、相乘模型(M)、无(N)、自动选择(Z)。
通过ets()函数自动选取对原始数据拟合优度最高的模型。
> library(forecast)
> x <- ets(data2)
Warning message:
In ets(data2) :
I can't handle data with frequency greater than 24. Seasonality will be ignored. Try stlf() if you need seasonal forecasts.
> x
ETS(M,A,N)
Call:
ets(y = data2)
Smoothing parameters:
alpha = 0.9999
beta = 1e-04
Initial states:
l = 60125.3605
b = 1757.7865
sigma: 0.0459
AIC AICc BIC
20049.03 20049.12 20072.08
> plot(x)
- 效果图
- 预测
> pre <- forecast(x,h=30)
> pre$mean
Time Series:
Start = c(2018, 13)
End = c(2018, 42)
Frequency = 365
[1] 2159078 2160914 2162751 2164588 2166424 2168261 2170097 2171934 2173771 2175607 2177444 2179281 2181117 2182954 2184790
[16] 2186627 2188464 2190300 2192137 2193974 2195810 2197647 2199483 2201320 2203157 2204993 2206830 2208667 2210503 2212340
> plot(pre)