首页 > > > R语言时间序列分析(十五):高级技巧总结
作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言数据高效处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书,《R语言数据高效处理指南》(黄天元)【简介_书评_在线阅读】 - 当当图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
1、时间序列具有复杂的季节性怎么办?
使用STL(mstl)进行分解,stlf函数进行预测。或者使用傅里叶项,但是这个时候无法随着时间的变化改变周期的波动性,如果需要,可以使用TBATS模型(tbats)。参考链接:11.1 Complex seasonality | Forecasting: Principles and Practice
2、如何使用神经网络模型进行时间序列预测?
使用nnetar函数可直接获得结果,原理见:11.3 Neural network models | Forecasting: Principles and Practice
3、Bagged ETS在一些场景下能够提高ETS的准确性,baggedETS()提供了直接调用的函数进行拟合。它的本质是针对原序列,生成一系列模拟序列(进行时间序列的分解,然后对残差项进行混洗重排,再还原),然后对模拟序列都进行预测后取平均。详见:11.4 Bootstrapping and bagging | Forecasting: Principles and Practice
4、如何拟合周期性较短的时间序列(周、日、半日)?
stlf是一个解决方案,可以拟合任意周期的时间序列。
也可以使用动态谐波回归模型(dynamic harmonic regression model),其实就是在动态回归模型中加入傅里叶项,其中对K值的筛选有代码:
library(fpp2)
# 以预测gasoline序列为例
bestfit <- list(aicc=Inf)
for(K in seq(25)) {
fit <- auto.arima(gasoline, xreg=fourier(gasoline, K=K),
seasonal=FALSE)
if(fit[["aicc"]] < bestfit[["aicc"]]) {
bestfit <- fit
bestK <- K
}
}
fc <- forecast(bestfit,
xreg=fourier(gasoline, K=bestK, h=104))
autoplot(fc)详见:12.1 Weekly, daily and sub-daily data | Forecasting: Principles and Practice
5、时间序列不是连续随机变量,而是整形计数的,是否有更好的方法进行预测?
其中一个解决方案是Croston方法,可以使用croston()函数进行实现,更加精细的实现见CRAN - Package tsintermittent。参考链接:12.2 Time series of counts | Forecasting: Principles and Practice。
6、预测时间序列的时候,需要限定其在一定的数值范围内,怎么办?
如果要让数值都大于零,可以先对序列进行对数化转换,再做拟合。这在fpp2包中经常通过box-cox转换并让lamda等于0实现。如果要在其它范围内,请参照相关代码(12.3 Ensuring forecasts stay within limits | Forecasting: Principles and Practice)。
7、集成学习往往能够提高模型的预测效果,具体的实现就是用多种模型进行预测,然后取其平均值作为最后的预测结果。当然集成学习还有很多延伸,比如加权法等,但是平均值已经具有很好的效果。详见:12.4 Forecast combinations | Forecasting: Principles and Practice。
8、时间序列不仅仅能够预测未来,还能够反推过去,这在一些场景中是有实际意义的(如考古、还原历史取证)。搬运部分代码,主要是构建反向时间序列和进行反向预测:
# Function to reverse time
reverse_ts <- function(y)
{
ts(rev(y), start=tsp(y)[1L], frequency=frequency(y))
}
# Function to reverse a forecast
reverse_forecast <- function(object)
{
h <- length(object[["mean"]])
f <- frequency(object[["mean"]])
object[["x"]] <- reverse_ts(object[["x"]])
object[["mean"]] <- ts(rev(object[["mean"]]),
end=tsp(object[["x"]])[1L]-1/f, frequency=f)
object[["lower"]] <- object[["lower"]][h:1L,]
object[["upper"]] <- object[["upper"]][h:1L,]
return(object)
}具体请参考:12.6 Backcasting | Forecasting: Principles and Practice。
9、时间序列特别短或特别长的时候,在预测中有什么其他技巧?
时间序列特别短的时候,请使用AICc作为筛选指标。时间序列特别长的时候,可以考虑使用新近的观测来做模型,因为很多特征趋势其实是短期的。参考:12.7 Very long and very short time series | Forecasting: Principles and Practice。
10、如果碰到缺失值或离群值怎么办?
对于缺失值而言,一般来说需要插补,可以使用na.interp()函数进行估计和插补,它的规则是使用线性插值法,如果有季节性,会先获得季节校正序列,再用线性插值法,再把季节因子加上去(By default, uses linear interpolation for non-seasonal series. For seasonal series, a robust STL decomposition is first computed. Then a linear interpolation is applied to the seasonally adjusted data, and the seasonal component is added back.)。
对于离群值而言,可以使用tsoutliers进行检测,然后根据检测的结果分析原因,再进行处理。一个方便的函数是tsclean(),它可以自动化处理缺失值和离群值,其规则为:Uses supsmu for non-seasonal series and a robust STL decomposition for seasonal series. To estimate missing values and outlier replacements, linear interpolation is used on the (possibly seasonally adjusted) series。
原文作者:;如有侵权,请联系管理员删除。