R语言时间序列中文教程可编辑.docx
《R语言时间序列中文教程可编辑.docx》由会员分享,可在线阅读,更多相关《R语言时间序列中文教程可编辑.docx(17页珍藏版)》请在冰豆网上搜索。
R语言时间序列中文教程可编辑
R语言时间序列中文教程(可编辑)
R语言时间序列中文教程
R语言时间序列中文教程李智在乔治梅森2012特别声明:
R语言是免费语言,其代码不带任何质量保证,使用R语言所产生的后果由使用者负全责。
前言R语言是一种数据分析语言,它是科学的免费的数据分析语言,是凝聚了众多研究人员心血的成熟的使用范围广泛全面的语言,也是学习者能较快受益的语言。
在R语言出现之前,数据分析的编程语言是SAS。
当时SAS的功能比较有限。
在贝尔实验室里,有一群科学家讨论提到,他们研究过程中需要用到数据分析软件。
SAS的局限也限制了他们的研究。
于是他们想,我们贝尔实验室的研究历史要比SAS长好几倍,技术力量也比SAS强好几倍,且贝尔实验室里并不缺乏训练有素的专业编程人员,那么,我们贝尔实验室为什么不自己编写数据分析语言,来满足我们应用中所需要的特殊要求呢,于是,贝尔实验室研究出了S-PLUS语言。
后来,新西兰奥克兰大学的两位教授非常青睐S-PLUS的广泛性能。
他们决定重新编写与S-PLUS相似的语言,并且使之免费,提供给全世界所有相关研究人员使用。
于是,在这两位教授努力下,一种叫做R的语言在奥克兰大学诞生了。
R基本上是S-PLUS的翻版,但R是免费的语言,所有编程研究人员都可以对R语言做出贡献,且他们已经将大量研究成果写成了R命令或脚本,因而R语言的功能比较强大,比较全面。
研究人员可免费使用R语言,可通过阅读R语言脚本源代码,学习其他人的研究成果。
笔者曾有幸在奥克兰大学受过几年熏陶,曾经向一位统计系的老师提请教过一个数据模拟方面的问题。
那位老师只用一行R语句就解答了。
R语言的强大功能非常令人惊讶。
为
了进一步推广R语言,为了方便更多研究人员学习使用R语言,我们收集了R语言时间序列分析实例,以供大家了解和学习使用。
当然,这是非常简单的模仿练习,具体操作是,用复制粘贴把本材料中R代码放入R的编程环境;材料中蓝色背景的内容是相关代码和相应输出结果。
经过反复模仿,学习者便能熟悉和学会。
需要提醒学习者的是:
建议学习者安装了R语言编程,再继续阅读本材料;执行R命令时,请删除命令的中文注解,没使用过在命令中加入中文;如果学习者是初次接触R或者Splus,建议先阅读,如果学习者比较熟悉R语言,还可以阅读优秀时间序列读物EcomometricsinR,也可以上QuickR网站。
目录R语言时间序列分析1前言1目录21.运用R语言研究JJ数据32.运用R语言研究空气污染193.运用R语言研究自动回归移动平均集成模型224.运用R语言研究全球变暖理论315.运用R语言研究非独立误差与线性回归326.运用R语言研究估计波动的频率367.运用R语言研究厄尔尼诺频率398.运用R语言研究太阳黑子周期频率401.运用R语言研究JJ数据学习R言语时间序列分析程序操作,需要从最基础、最简单的学起,例如在命令窗口中,输入并执行2+2等于4的R语言命令。
2+2[1]4执行完2+2等于4的R语言命令后,我们可以开始时间序列,即学着把玩johnson&Johnson数据。
下载jj.dat或执行下面语句。
这个数据已被人上传到因特网中。
R所需要做的只是将网址进行扫描就可以将数据读取进入R的编程环境中。
下面有3种不同读取数据的方法:
jjscan"
#readthedata读取数据jj-scan"#readthedataanotherway
第二种方法读取数据scan"-jj#andanother第三种方法读取数据使用R语言的人,有的喜欢使用[-],有的喜欢使用[-],大多数医疗系统的工作者喜欢用[],正因为如此才用了上面种不同读取数据的方法。
读取数据后,
键入并执行jj,数据在窗口便会有如下显示:
jj[1]0.710.630.850.44[5]0.610.690.92
0.55..........[77]14.04
12.9614.859.99[81]16.2014.6716.0211.61jj中有84个数据被称作
对象。
下面命令可以显示所有对象。
objects如果使用matlab,你会认为jj
是一个84行1列的向量,但实际上不是这样。
jj有次序,有长度,但没维度,
R称这些对象为向量,要小心区别。
在R里,矩阵有维度,但向量没维度。
这都
是程序语言的一些概念。
jj[1]#thefirstelement列中第一个数据[1]
0.71jj[84]#thelastelement列中最后一个数据[1]11.61jj[1:
4]#thefirst4elements列中第一至第四个数据[1]0.710.630.850.44jj[-1:
80]#everythingEXCEPTthefirst80elements列中除第80个以外的所
有数据[1]16.2014.6716.0211.61lengthjj#thenumberofelements
有多少个数据[1]84dimjj#butnodimensions...但没维度NULLnrowjj#...norows没行NULLncoljj#...andnocolumns没列NULL#
如果你要把jj转变为一个向量,执行如下操作后,维度为84行1列。
jj
as.matrixjjdimjj[1]841然后把jj转变为一个时间序列对象。
jjts
jj,start1960,frequency4#ts命令这个数据是从1960年开始,个个季度
的收入,frequency4指四个季度。
R语言的优势在于可用一条命令做很多事,
即可以把前面的命令放在一起打包执行。
其操作如下:
jjtsscan"",start1960,frequency4在上面命令里,scan可以被read.table替代。
用read.table
读取数据可生成matrix对象,还可以给每列起名字。
下面学习一下read.table,dataframes,和时间序列对象。
输入命令后,窗口会有如下显示:
jjts
read.table",start1960,frequency4helpread.tablehelptshelpdata.frame需要注意的是,Scan和read.table不一样。
Scan生成的是有维
度的向量,read.table生成的则是带有维度的数据架构。
读取jj数据的最后
要领。
如果这个数据是从1960年第三个季度开始的,所需输入命令则为ts
x,startc1960,3,frequency4;如果是一个每月每月的数据,例如数据是从
1984年6月开始的,需要输入的命令则为tsx,startc1984,6,frequency12。
输入命令后,转变后的时间序列对象为:
jjQtr1Qtr2Qtr3Qtr419600.71
0.630.850.4419610.610.690.92
0.55..........197914.0412.9614.859.99198016.2014.6716.0211.61注意到区别了吗,时间信
息,也就是4个不同的季度的数据被加载到里面了。
进行时间数据分析后,窗
口会有如下显示:
timejjQtr1Qtr2Qtr3Qtr419601960.001960.251960.501960.7519611961.001961.251961.50
1961.75............19791979.001979.251979.501979.7519801980.001980.251980.501980.75接下来输入如下组合命令。
jjtsscan",start1960,frequency4然
后进行对数据绘图:
plotjj,ylab"EarningsperShare",main"J&J"输
入以上命令后,可以看到如下结果:
再输入下面的命令,看看区别。
plotjj,type
"o",col"blue",lty"dashed"plotdifflogjj,main"loggedanddiffed"下面利用操作两个相关命令,显示区别。
x-5:
5#
sequenceofintegersfrom-5to5y5*cosx#guessparmfrowc3,2#multifiguresetup:
3rows,2cols#---plot:
plot
x,main"plotx"plotx,y,main"plotx,y"#---plot.ts:
plot.tsx,main"plot.tsx"plot.tsx,y,main"plot.tsx,y"#---ts.plot:
ts.plotx,main"ts.plotx"ts.plottsx,tsy,col1:
2,main"ts.plotx,y"#note-xandyaretsobjects#---thehelpfiles[?
andhelparethesame]:
?
plot.tshelpts.plot?
par#mightaswellskimthegraphicalparametershelpfilewhileyou'rehere从窗口中的显示可以看出,如果数
据是时间序列对象,使用plot命令就足够了;如果数据是平常序列,使用
plot.ts也可以做时间绘图。
不过,把jj数据放在一张图上,数据会随着时
间的变化上上下下跳动,能从整体上反应上升或者下降的趋势。
上文中用红色光
滑的曲线代表上升的趋势,简单明了。
这需要将过滤和光滑的技巧使用在jj数
据上。
在这里,我们用对称的移动平均值来达到过滤和光滑的目的。
下面使用公
式:
fjjt?
jjt-2+?
jjt-1+?
jjt+?
jjt+1+?
jjt+2除
此之外,lowess的过滤平滑技巧(蓝色曲线)也要使用在jj数据中。
具体操作
如下图:
kc.5,1,1,1,.5#kisthevectorofweights用
于对称移动平均的系数kk/sumk[1]0.1250.2500.2500.2500.125fjjfilterjj,sides2,k#?
filterforhelp[butyouknewthatalready]使用对称移动平均plotjjlinesfjj,col"red"#addsalinetotheexistingplot称移动平均的绘图lineslowessjj,col"blue",lty
"dashed"#lowess的绘图操作后,窗口会显示下面结果:
看完jj数据,我们
就需要开始具体分析。
第一步,我们把所有jj数据都取log值。
第二步,我们
把log值做差,即使用log值数列中第二值减去第一值,第三值减去第二值,第
四值减去第三值等等。
如果做差处理前数列里有n个数值,处理后的结果中将有
n-1个数值。
dljjdifflogjj#differencetheloggeddata做log和差的处理plot