rdataframe转成向量_R语⾔实战之时间序列分析
a little inspiration
前⾯的线性回归探讨的是横截⾯(cross-ctional)数据。在横截⾯数据集中,我们是在⼀个给定的时间点测量变量值。与之相反,纵向(longitudinal)数据则是随着时间的变化反复测量变量值。若持续跟踪某⼀现象,可能会获得很多了解。 对时序数据的研究包括两个基本问题: 对数据的描述 (这段时间内发⽣了什么)以及预测(接下来将会发⽣什么) 。我们可能有如下疑问。
supplyJohnson & Johnson股价在这段时间内有变化吗?
数据会受到季度影响吗?股价是不是存在某种固定的季度变化?
我们可以预测未来的股价吗?如果可以的话,准确率有多⾼?
描述时序数据和预测未来值的⽅法有很多,⽽R软件具备很多其他软件都不具备的精细时序分析⼯具。
将分析的⼏个时序数据集,这些数据集在R中都可以找到,它们各有特点,适⽤的模型也各不相同。
本⽂⾸先介绍⽣成、操作时序数据的⽅法,对它们进⾏描述并画图,将它们分解成⽔平、趋势、季节性和随机(误差)等四个不同部分。在此基础上,我们采⽤不同的统计模型对其进⾏预测。将要介绍的⽅法包括基于加权平均的指数模型,以及基于附近数据点和预测误差间关联的⾃回归积分移动平均(ARIMA)模型。我们还将介绍模型拟合和预测准确性的评价指标。
本章内容:
在 R 中⽣成时序对象
时序的平滑化和季节性分解
指数预测模型
ARIMA 预测模型
1.在 R 中⽣成时序对象
在R中分析时间序列的前提是我们将分析对象转成时间序列对象(time-ries-object),即R中⼀种包括观测值、起始时间、终⽌时间以及周期(如⽉、季度或年)的结构。只有将数据转成时间序列对象后,我们才能⽤各种时序⽅法对其进⾏分析、建模和绘图。
⼀个数值型向量或数据框中的⼀列可通过ts()函数存储为时序对象:
myries <- ts(data, start=, end=, frequency=)
日常生活英语单词
其中myries是所⽣成的时序对象,data是原始的包含观测值的数值型向量,start参数和end参数(可选)给出时序的起始时间和终⽌时间,frequency为每个单位时间所包含的观测值数量(如frequency=1对应年度数据,frequency=12对应⽉度数据,frequency=4对应季度数据) 。
sales
什么是townhou
ts()函数被⽤于⽣成时序对象,⽣成后,我们可以将它以图像的形式显⽰在屏幕上,⽣成时序对象后,我们可以通过start()、 end()、frequency()函数查看其性质,也可以通过window()函数⽣成原始数据的⼀个⼦时序。
2. 时序的平滑化和季节性分解
初三家长会班主任发言稿
正如对横截⾯数据集分析与建模的第⼀步是描述性统计和画图⼀样,对时序数据建⽴复杂模型之前也
需要对其进⾏描述和可视化。在本节中,我们将对时序进⾏平滑化以探究其总体趋势,并对其进⾏分解以观察时序中是否存在季节性因素。
ex libris>ifit
2.1 通过简单移动平均进⾏平滑处理
处理时序数据的第⼀步是画图,这⾥介绍Nile数据集。这⼀数据集是埃及阿斯旺市在1871年⾄1970年间所记录的尼罗河的年度流量。
时序数据集中通常有很显著的随机或误差成分。为了辨明数据中的规律,我们总是希望能够撇开这些波动,画出⼀条平滑曲线。画出平滑曲线的最简单办法是简单移动平均。⽐如每个数据点都可⽤这⼀点和其前后两个点的平均值来表⽰,这就是居中移动平均(centered moving average) ,它的数学表达是:
其中
是时间点t的平滑值,k=2q+1是每次⽤来平均的观测值的个数,⼀般我们会将其设为⼀个奇数(本例中为3) 。居中移动平均法的代价是,每个时序集中我们会损失最后的(k-1)/2个观测值。R中有⼏个函数都可以做简单移动平均, 包括TTR包中的SMA()函数,zoo包中的rollmean()函数,forecast包中的ma()函数。这⾥我们⽤R中⾃带的ma()函数来对Nile时序数据进⾏平滑处理。
library(forecast)
opar <- adonly = TRUE)
par(mfrow=c(2,2))
beginners
ylim <- c(min(Nile),max(Nile))
plot(Nile,main="Raw time ries")
plot(ma(Nile,3),main="Simple Moving Averages (k=3)",ylim=ylim)
plot(ma(Nile,7),main="Simple Moving Averages (k=7)",ylim=ylim)
plot(ma(Nile,15),main="Simple Moving Averages (k=15)",ylim=ylim)
par(opar)
数据总体呈下降趋势,但不同年份的变动⾮常⼤。从图像来看,随着k的增⼤,图像变得越来越平滑。
因此我们需要找到最能画出数据中规律的k,避免过平滑或者⽋平滑。这⾥并没有什么特别的科学理论来指导k的选取,我们只是需要先尝试多个不同的k,再决定⼀个最好的k。从本例的图像来看,尼罗河的流量从1892年到1900年有明显下降;其他的变动则并不是太好解读,⽐如1941年到1961年⽔量似乎略有上升,但这也可能只是⼀个随机波动。
2.2 季节性分解
对于间隔⼤于1的时序数据(即存在季节性因⼦),我们需要了解的就不仅仅是总体趋势了。此时,我们需要通过季节性分解帮助我们探究季节性波动以及总体趋势。存在季节性因素的时间序列数据(如⽉度数据、季度数据等)可以被分解为趋势因⼦、季节性因⼦和随机因⼦。趋势因⼦(trend component)能捕捉到长期变化;季节性因⼦(asonal component)能捕捉到⼀年内的周期性变化;⽽随机(误差)因⼦(irregular/error component)则能捕捉到那些不能被趋势或季节效应解释的变化。
(1) 加法模型
此时,可以通过相加模型,也可以通过相乘模型来分解数据。在相加模型中,各种因⼦之和应等于对应的时序值,即:
其中时刻t的观测值即这⼀时刻的趋势值、季节效应以及随机影响之和。
(2) 乘法模型
相乘模型则将时间序列表⽰为:
即趋势项、季节项和随机影响相乘。
brookside
图(a)中的序列没有趋势项也没有季节项,序列中的波动都表现为⼀个给定⽔平上的随机波动。图(b)的序列中有⼀个向上的趋势,以及围绕这个趋势的⼀些随机波动。图(c)的序列中有季节效应和随机波动,但并没有表现出某种趋势。图(d)的序列中则同时出现了增长性趋势、季节效应以及随机波动。图(e)的序列也同时出现了这三种因⼦,但此时时间序列通过相乘模型分解。注意(e)中序列的波动是与趋势成正⽐的,即整体增长时波动越⼤。这种基于现有⽔平的放⼤(或者缩减)决定了相乘模型更适合这类情况。
将时序分解为趋势项、季节项和随机项的常⽤⽅法是⽤LOESS光滑做季节性分解。这可以通过R中的stl()函数实现:
stl(ts, s.window=, t.window=)
其中ts是将要分解的时序,参数s.window控制季节效应变化的速度,t.window控制趋势项变化的速度。较⼩的值意味着更快的变化速度。令s.windows="periodic"可使得季节效应在各年间都⼀样。这⼀函数中,参数ts和s.windows是必须提供的。
虽然stl()函数只能处理相加模型,但这也不算⼀个多严重的限制,因为相乘模型总可以通过对数变换转换成相加模型:
⽤经过对数变换的序列拟合出的相加模型也总可以再转化回原始尺度。
林肯的故事
R中⾃带的AirPasngers序列描述了1949~1960年每个⽉国际航班的乘客(单位:千)。
plot(AirPasngers)
lAirPasngers <- log(AirPasngers)
plot(lAirPasngers,ylab="log(AirPasngers)")
fit <- stl(lAirPasngers,s.window = "period")
plot(fit)
fit$time.ries[1:12,]