> sales.ts<-ts(sales1,frequency=12,start=c(2014,1)) #使用ts函数对数据将刚才数值型向量转化为一个时间序列对象,数值就是指标,然后为每一个数据加上一个日期标签,就完成时间序列的转化。Frequency等于12表示将这15个数据划分到十二个月中,超过的从第一个月开始,以此类推,start表示第一个数据所处的年和月份。
1、时间内序列-HoltWinters指数平滑法
指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但没有季节性的序列。术语“Holt-Winters法”有时特指三次指数平滑法。
Holt-Winters的思想是把数据分解成三个成分:平均水平(level),趋势(trend),周期性(seasonality)。R里面一个简单的函数stl就可以把原始数据进行分解。
有增长或者降低趋势并且存在季节性波动的时间序列的预测算法;
这种序列可以被分解为水平趋势部分、季节波动部分,因此这两个因素应该在算法中有对应的参数来控制。
Holt-Winters算法中提供了alpha、beta和gamma 来分别对应当前点的水平、趋势部分和季节部分,参数的取值范围都是0-1之间,并且参数接近0时,近期的观测值的影响权重就越小。
参数:
HoltWinters(x, alpha = NULL, beta = NULL, gamma = NULL,
seasonal = c("additive", "multiplicative"),--加法、乘法
start.periods = 3, l.start = NULL, b.start = NULL,
s.start = NULL,
optim.start = c(alpha = 0.3, beta = 0.1, gamma = 0.1),
optim.control = list())
gamma:控制是否考虑季节因素,设置为0时代表不考虑季节影响;
seasonal:考虑季节因素时,即gamma<>0时,该参数有效;
一阶Holt—Winters假设数据是stationary的(静态分布),即是普通的指数平滑。二阶算法假设数据有一个趋势,这个趋势可以是加性的(additive,线性趋势),也可以是乘性的(multiplicative,非线性趋势),只是公式里面一个小小的不同而已。 三阶算法在二阶的假设基础上,多了一个周期性的成分。同样这个周期性成分可以是additive和multiplicative的。 举个例子,如果每个二月的人数都比往年增加1000人,这就是additive;如果每个二月的人数都比往年增加120%,那么就是multiplicative。
2、R中fitted()和predict()的区别
fitted是拟合值,predict是预测值;
假设你是做的模型是y~x,给的值是(x1,x2,...,xn),(y1,y2,...,yn)
fitted()的结果是你得到相应的模型后,(x1,x2,...,xn)相应的值,也就是(y1,y2,...,yn)的估计值
predict()中你可以用(x1,x2,...,xn)的值,也可以用新的值,看下你的预测值为多少。
3、forecast 包中的时间序列模型
Rwf:Random walk model
Naïve:Naive model
Ets:ETS model
Dshw:Double-Seasonal Holt-Winters model
4、画预测值和实际值的对比趋势图
ab1=data.frame(X=c(seq_data$seq_X,rep(NA,xlen+n.ahead-nrow(seq_data))),
pred=predict_value,aver=rep(aver,xlen+n.ahead))
ab1$X[is.na(ab1$X)]<-ab1$pred[is.na(ab1$X)]
ab1$pred[is.na(ab1$pred)]<-ab1$X[is.na(ab1$pred)]
Rsquare=1-sum((ab1[,1]-ab1[,2])^2)/sum((ab1[,1]-ab1[,3])^2)
ab2=data.frame(X=c(seq_data$seq_X,rep(NA,xlen+n.ahead-nrow(seq_data))),
predict = predict_value)
if( Rsquare>0 & Rsquare<=1 & doplot==TRUE){
plot(ts(ab2$X),ylim=c(0,max(ab2$X,ab2$predict,na.rm = T)),
ylab='seq_X',
main=paste0(tit,',Rsqure=',round(Rsquare,2)))
lines(ts(ab2$predict),col=3)
lines(ab2$X*level,col=6,type='l')
lines(ab2$X*(2-level),col=6,type='l')
}
return(list(Rsquare=Rsquare,pred=ab2,model=mod,model_name=model_name))
5、常用模型
Trend:
Smooth:
Arima:
自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model,简记ARIMA),将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。ARIMA模型根据原序列是否平稳以及回归中所含部分的不同,包括移动平均过程(MA)、自回归过程(AR)、自回归移动平均过程(ARMA)以及ARIMA过程。
将预测对象随时间推移而形成的数据序列视为一个随机序列,用一定的数学模型来近似描述这个序列。这个模型一旦被识别后就可以从时间序列的过去值及现在值来预测未来值。
Arma:
自回归滑动平均模型(ARMA 模型,Auto-Regressive and Moving Average Model)是研究时间序列的重要方法,由自回归模型(简称AR模型)与滑动平均模型(简称MA模型)为基础“混合”构成。在市场研究中常用于长期追踪资料的研究,如:Panel研究中,用于消费行为模式变迁研究;在零售研究中,用于具有季节变动特征的销售量、市场规模的预测等。
Arfima: 分析具有长记忆性的时间序列;
Nonlinear: 非线性回归模型;
Nnetts:
6、ts_model:所有的这些模型都用到了,candi_arma、candi_arfima、candi_smooth、candi_trend。。。
ts-model2: 用到了candi_arfima、candi_trend(additive、multiplicative、dshw)、candi_arima。
7、其他可用方法:
STAR模型全稱為平滑轉移自回歸模型(smooth transition autoregression),是非線性時間序列模型中的參數模型,各個參數有很強的經濟背景,始於2003年諾貝爾經濟學獎得主Granger和瑞典著名統計學家於1993 年的研究論文, 此後大量的理論和應用研究發現這一模型確實很好的模擬了商業周期、匯率以及失業率等經濟、金融時間序列對均衡的偏離和回覆現象。
8、常用语法:
1、标记一个表中的日期,是否是特殊日期的处理
方法:在表中增加标签字段。
步骤:先新建一个相同行的数据框,里面含有相同行的矩阵(列数可根据需求定义),生成矩阵数据后,再用cbind()将两者合并(rbind是增加行)。
示例:
n=nrow(X)
tmp=data.frame(matrix(0,nrow = n,ncol=4))
colnames(tmp)<-c('seq_beta2','seq_beta3','seq_beta4','seq_beta5') sping=c('2011-02','2012-01','2013-02','2014-02','2015-02','2016-02','2017-01','2018-02','2019-02','2020-01','2021-02')
tmp$seq_beta2[X$seq_time %in% sping]<-1
tmp$seq_beta3[substr(X$seq_time,6,7)=='05']<-1
tmp$seq_beta4[substr(X$seq_time,6,7)=='06']<-1
tmp$seq_beta5[substr(X$seq_time,6,7)=='10']<-1
tmp$seq_beta6[substr(X$seq_time,6,7)=='11']<-1
tmp$seq_beta7[substr(X$seq_time,6,7)=='12']<-1
tmp[is.na(tmp)]<-0
X=cbind(X,tmp)
注:字段后[]里可以添加判断条件,选择某一列。
2、判断表的列数:length()。
3) RJDBC常用函数:
1、 JDBC(驱动,jar包,分隔符):加载数据库驱动
2、 dbConnect(驱动参数,url,用户名,密码,其他):连接数据库
3、 dbListTables(conn):显示连接中的所有表
4、 dbWriteTable(conn, "iris", iris, overwrite=TRUE):将数据框iris写入表iris中,overwrite覆盖原表
(append=TRUE追加,dbWriteTable(conn, "IRIS", d, overwrite=FALSE,append=TRUE)且d要与表iris的结构一致。)
5、 dbGetQuery(conn, "select count(*) from iris"):查询语句
6、 dbSendUpdate(conn,”sql语句”):执行任何非查询sql语句
7、 dbReadTable(conn, "iris"):读取表中数据
8、 dbDisconnect(conn):关闭连接
9、 dbExistsTable(conn,”iris”):是否存在表iris
10、 dbRemoveTable(conn,”iris”):删除表iris