【下面是Word粘貼過(guò)來(lái)的內(nèi)容】 時(shí)間序列(Timeseries)是指將某種現(xiàn)象某一個(gè)統(tǒng)計(jì)指標(biāo)在不同時(shí)間上的各個(gè)數(shù)值,,按時(shí)間先后順序排列而形成的序列,。 時(shí)間序列分析(Timeseries analysis)是一種動(dòng)態(tài)數(shù)據(jù)處理的統(tǒng)計(jì)方法。該方法基于隨機(jī)過(guò)程理論和數(shù)理統(tǒng)計(jì)學(xué)方法,,研究隨機(jī)數(shù)據(jù)序列所遵從的統(tǒng)計(jì)規(guī)律,,以用于解決實(shí)際問(wèn)題。在第二次世界大戰(zhàn)前,,多用于經(jīng)濟(jì)預(yù)測(cè),。二次大戰(zhàn)中和戰(zhàn)后,在軍事科學(xué),、空間科學(xué),、氣象預(yù)報(bào)和工業(yè)自動(dòng)化等部門(mén)的應(yīng)用更加廣泛。 本章介紹時(shí)間序列數(shù)據(jù)在R中的基本表示,、處理及可視化方法,為后繼的金融時(shí)間序列預(yù)測(cè)計(jì)算做準(zhǔn)備,。 時(shí)間序列數(shù)據(jù)是按時(shí)間排序的數(shù)據(jù)采樣,。作為一個(gè)簡(jiǎn)單的例子,我們先來(lái)看看比特幣生產(chǎn)數(shù)量的變化,。 【附注:】 如果您不太清楚比特幣,,這里附一個(gè)百度百科的簡(jiǎn)單說(shuō)明: 比特幣(BitCoin)的概念最初由中本聰在2009年提出,根據(jù)中本聰?shù)乃悸吩O(shè)計(jì)發(fā)布的開(kāi)源軟件以及建構(gòu)其上的P2P網(wǎng)絡(luò),。比特幣是一種P2P形式的數(shù)字貨幣,。點(diǎn)對(duì)點(diǎn)的傳輸意味著一個(gè)去中心化的支付系統(tǒng)。 再來(lái)一段八卦: 比特幣的開(kāi)發(fā)者兼創(chuàng)始者,,是一位1949年出生的日裔美國(guó)人,。他愛(ài)好收集火車(chē)模型,職業(yè)生涯中有多處保密,,曾為大型企業(yè)還有美工軍方執(zhí)行保密的工作,。2008年中本聰在互聯(lián)網(wǎng)上一個(gè)討論信息加密的郵件組中發(fā)表了一篇文章,勾畫(huà)了比特幣系統(tǒng)的基本框架,。2009年他為該系統(tǒng)建立了一個(gè)開(kāi)放源代碼項(xiàng)目(opensource project),,正式宣告了比特幣的誕生。2010年12月12日當(dāng)比特幣漸成氣候時(shí),,他卻悄然離去,,從互聯(lián)網(wǎng)上銷(xiāo)聲匿跡。 有多種方法可以從數(shù)據(jù)源輸入時(shí)間序列數(shù)據(jù)給我們使用。最基本的方法是從硬盤(pán)的文件里讀出,。例如,,假設(shè)我們的數(shù)據(jù)文件名為“比特幣生產(chǎn)數(shù)目TOUTV.csv”,其內(nèi)容為從09年1月開(kāi)始到13年10月的比特幣生產(chǎn)數(shù)目,,用表格的形式表示為: 表格2?1比特幣生產(chǎn)數(shù)目
上面的表格僅僅列出了最開(kāi)始的幾行,,后面的數(shù)據(jù)都省略了。這是一個(gè)CSV文件,,即“逗號(hào)分隔的值(comma-separatedvalues)”,,其形式為: Date,Value 2013-10-22,1159699.0084891 2013-10-21,979061.3851226 2013-10-20,691056.4816408 2013-10-19,1066912.8245079 2013-10-18,880504.60423908 對(duì)于CSV格式的數(shù)據(jù)文件,最簡(jiǎn)單的數(shù)據(jù)輸入方法是使用read.csv()函數(shù)(假設(shè)我們的數(shù)據(jù)文件保存在E盤(pán)根目錄下): > x=read.csv("E:/比特幣生產(chǎn)數(shù)目TOUTV.csv") > x Date Value 1 2013-10-22 1159699.0 2 2013-10-21 979061.4 3 2013-10-20 691056.5 4 2013-10-19 1066912.8 5 2013-10-18 880504.6 …… 1749 2009-01-04 0.00 1750 2009-01-03 50.00 很顯然,,read.csv()函數(shù)根據(jù)給定的CSV文件的結(jié)構(gòu),,和第一行的標(biāo)題,將數(shù)據(jù)按兩列讀入,,第一列的名字就是“Date”,,第二列的名字為“Value”。兩列數(shù)據(jù)構(gòu)成一個(gè)矩形的數(shù)據(jù)結(jié)構(gòu),,這種數(shù)據(jù)結(jié)構(gòu)在R語(yǔ)言里面被稱(chēng)之為“數(shù)據(jù)框”(dataframe),;我們可以通過(guò)數(shù)據(jù)框名和列名來(lái)引用某個(gè)單獨(dú)的列,例如,,x$Date可代表第一列,,x$Value代表第二列;參見(jiàn)下面的例釋?zhuān)?/span> > x$Date [1] 2013-10-22 2013-10-21 2013-10-202013-10-19 2013-10-18 [6] 2013-10-17 2013-10-16 2013-10-152013-10-14 2013-10-13 …… [1746] 2009-01-072009-01-06 2009-01-05 2009-01-04 2009-01-03 1750 Levels:2009-01-03 2009-01-04 2009-01-05 ... 2013-10-22 > x$Value [1] 1159699.01 979061.39 691056.48 1066912.82 [5] 880504.60 912009.37 1024516.32 822209.77 …… [1745] 0.00 0.00 0.00 0.00 [1749] 0.00 50.00 我們將在下一節(jié)再詳細(xì)討論數(shù)據(jù)框,,現(xiàn)在只需要知道這么多就可以了,。如果希望將比特幣生產(chǎn)數(shù)目隨時(shí)間的數(shù)量變化繪制成圖形,可以輸入下面命令: > plot(x$Value,type="l", ylab="", xlab="") 可以注意到,,上面的指令中多了以前沒(méi)有見(jiàn)過(guò)的兩個(gè)參數(shù):xlab和ylab,;這兩個(gè)參數(shù)實(shí)際上很容易理解,他們分別是x軸和y軸的文本標(biāo)簽,。因?yàn)檫@個(gè)圖比較大,,加上標(biāo)簽以后更難以在一張頁(yè)面上顯示清楚,所以我們將這兩個(gè)參數(shù)置為空(即""),。繪圖的效果參見(jiàn)圖表2?1,。 圖表2?1比特幣的生產(chǎn)數(shù)量 出了從本地文件系統(tǒng)(例如硬盤(pán))中讀取數(shù)據(jù)外,也可以直接從Internet上面讀取,。例如,,我們還將上面的數(shù)據(jù)文件放到了Google Code里面,因此,,可以從Google Code的項(xiàng)目庫(kù)中直接讀?。?/span> >y=read.csv("https://r-finance-forecast-practice-book./svn/TOUTV.csv") 其結(jié)果是完全一樣的。當(dāng)然,你必須保證能訪(fǎng)問(wèn)Google Code——這可能不是在所有時(shí)刻都有效的,;在你不能訪(fǎng)問(wèn)Google的時(shí)候,,你會(huì)得到類(lèi)似下面的錯(cuò)誤信息: Error in file(file,"rt") : cannot open the connection In addition: Warningmessage: In file(file,"rt") : InternetOpenUrl failed: '無(wú)法與服務(wù)器建立連接' 實(shí)際上,除了read.csv()外,,R還有其它幾個(gè)類(lèi)似的函數(shù)用于從文本格式的數(shù)據(jù)文件中讀取數(shù)據(jù)。在R的控制臺(tái)(console)窗口,,鍵入?read.csv,,即可獲得關(guān)于這類(lèi)函數(shù)的幫助。這幾個(gè)類(lèi)似的函數(shù)包括: read.csv(file, header= TRUE, sep = ",", quote = "\"", dec = ".", fill = TRUE,comment.char = "", ...)
read.csv2(file, header= TRUE, sep = ";", quote = "\"", dec = ",", fill = TRUE,comment.char = "", ...)
read.delim(file,header = TRUE, sep = "\t", quote = "\"", dec = ".", fill = TRUE,comment.char = "", ...)
read.delim2(file,header = TRUE, sep = "\t", quote = "\"", dec = ",", fill = TRUE,comment.char = "", ...) 觀(guān)察一下這幾個(gè)函數(shù)的異同,,我們可以發(fā)現(xiàn),他們的差別僅僅在于默認(rèn)的數(shù)據(jù)分隔符,、小數(shù)點(diǎn)符號(hào)不同,其它參數(shù)都相同,。實(shí)際使用中,可以根據(jù)數(shù)據(jù)文件的具體格式選用,。實(shí)際上,也可以使用其中一種代替其它的函數(shù),,只要明確傳遞特定的參數(shù)即可。例如,,帶sep函數(shù)的read.csv(file,sep= ";", …),,指定使用分號(hào)做數(shù)據(jù)分隔符,等同于不帶sep參數(shù)的read.csv2(file,…),。 最后,,我們看看互聯(lián)網(wǎng)時(shí)代的R包還可以做些什么。 有一個(gè)用于量化投資的R包,,叫做quantmod,;安裝和加載quantmod的過(guò)程如下: >install.packages("quantmod", lib="D:/Program Files/R/R-3.0.1/library") trying URL'http://cran./bin/windows/contrib/3.0/quantmod_0.4-0.zip' Content type'application/zip' length 443166 bytes (432 Kb) opened URL downloaded 432 Kb
package ‘quantmod’successfully unpacked and MD5 sums checked …… >library("quantmod") Version 0.4-0 includednew data defaults. See ?getSymbols. Warning message: 程輯包‘quantmod’是用R版本3.0.3來(lái)建造的 上面指令信息中,install.packages()命令用于安裝quantmod,,而library()指令用于將quantmod調(diào)入內(nèi)存,。順便說(shuō)一句,上面信息中的“程輯包”就是R包,不知道為什么負(fù)責(zé)R漢化信息的人會(huì)發(fā)明這樣一個(gè)“奇特新名字”,。 好了,,quantmod加載以后,我們就可以是使用getSymbols()函數(shù)了,。 注意——現(xiàn)在是見(jiàn)證奇跡的時(shí)刻了: >getSymbols("TSLA") [1] "TSLA" > TSLA TSLA.Open TSLA.High TSLA.LowTSLA.Close TSLA.Volume TSLA.Adjusted 2010-06-29 19.00 25.00 17.54 23.89 18766300 23.89 2010-06-30 25.79 30.42 23.30 23.83 17187100 23.83 2010-07-01 25.00 25.92 20.27 21.96 8218800 21.96 …… 2014-07-15 226.73 227.65 218.10 219.58 5718500 219.58 2014-07-16 221.82 224.80 216.82 217.16 4044500 217.16 2014-07-17 216.16 220.55 213.60 215.40 4649400 215.40 這就是大名鼎鼎的特斯拉電動(dòng)車(chē)的股票數(shù)據(jù),! 然后另一個(gè)簡(jiǎn)單指令就可以繪制出它的開(kāi)盤(pán)價(jià)的走勢(shì)圖: >plot(TSLA$TSLA.Open) 繪圖效果參見(jiàn)圖表2?2。 圖表2?2特斯拉電動(dòng)車(chē)股票數(shù)據(jù) R包quantmod用于快速的量化投資模型的建立和測(cè)算,。感興趣的讀者可進(jìn)一步參考http://www./,,我們?cè)诒緯?shū)的最后(第12章: 前面說(shuō)到,,使用read.csv()函數(shù)從CSV文件讀入的矩形數(shù)據(jù)結(jié)構(gòu),在R中被稱(chēng)之為“數(shù)據(jù)框”(data.frame),,可以使用類(lèi)似矩陣的方式訪(fǎng)問(wèn)其中的元素,。因?yàn)閿?shù)據(jù)框是R中的一種非常重要的數(shù)據(jù)類(lèi)型,因此在本章我們要對(duì)數(shù)據(jù)框做更為詳細(xì)的說(shuō)明,。 為了說(shuō)清楚數(shù)據(jù)框,,首先要了解R中的“列表”(list)數(shù)據(jù)類(lèi)型。 列表是一個(gè)對(duì)象集合,,其元素由序號(hào)(下標(biāo))區(qū)分,,各元素的類(lèi)型可以是任意類(lèi)型的數(shù)據(jù)對(duì)象,甚至可以是另一個(gè)列表,。列表可以使用list()函數(shù)構(gòu)造,,例如: > rec <-list(name="李明", age=20,scores=c(85, 76, 90) ) > rec $name [1] "李明"
$age [1] 20
$scores [1] 85 76 90
> rec$age #使用名稱(chēng)引用 [1] 20
> rec$scores [1] 85 76 90
> rec[1] #使用下標(biāo)引用,返回一個(gè)子列表(注意?。,。?/span> $name [1] "李明"
> rec[[3]] #使用雙重下標(biāo)引用,返回元素值 [1] 85 76 90 在上面的例子里面,,名為rec的列表包含三個(gè)元素,,分別命名為“name”、“age”和“scores”,;我們可以通過(guò)元素的名字來(lái)引用它(例如rec$name),,也可以使用“列表名[[下標(biāo)]]”的格式引用(例如rec[[1]])。 注意:上面沒(méi)有寫(xiě)錯(cuò)哦,,是雙重方括號(hào),。 我們可以使用下面的指令來(lái)判斷一下rec$name和rec[[1]]是否真的“等同”: >rec[[1]]==rec$name [1] TRUE 上面指令中,“==”(兩個(gè)等號(hào)喲)是一個(gè)比較運(yùn)算,,表示我們要求R比較一下兩邊的值,。R的輸出結(jié)果為“真”(TRUE),,即兩種表示是有相同的值的。 有時(shí)候我們可能會(huì)混用兩種表示方式,;例如: > rec[[3]][2] #取出第3個(gè)元素(是一個(gè)向量)里面的第二個(gè)值 [1] 76 > rec[["scores"]][2]#取出score元素中的第2個(gè)值 [1] 76 在上面最后的例子中,,我們使用元素名代替雙方括號(hào)內(nèi)的下標(biāo)值,;而最后的[2]則表示,,在rec[["scores"]]這個(gè)元素(它又是一個(gè)包含三個(gè)元素的向量)中取出第二個(gè)元素,。 注意:列表數(shù)據(jù)和“向量”類(lèi)型的數(shù)據(jù)有所不同的是,引用列表元素時(shí)不能使用范圍下標(biāo),,即不能單次引用多個(gè)元素,;例如,下面的寫(xiě)法是不對(duì)的: > rec[[1:2]] Error in rec[[1:2]] :subscript out of bounds 有讀者可能會(huì)爭(zhēng)辯道:我試了試rec[1:2]的寫(xiě)法,,也是可以的?。∫?jiàn)下: > rec[1:2] $name [1] "李明"
$age [1] 20 正確的解釋是: 單重方括號(hào)的含義和雙重方括號(hào)完全不同:雙重方括號(hào)是“取出列表其中某個(gè)元素”,,其結(jié)果的數(shù)據(jù)類(lèi)型和被取出的元素一致,;單重方括號(hào)的意義是“取出一個(gè)子列表”,其數(shù)據(jù)類(lèi)型仍為“list”,。 R是一種非常靈活的語(yǔ)言,;這個(gè)特點(diǎn)在列表上也有很突出的體現(xiàn)。例如:在不引起歧義的時(shí)候,,可以使用簡(jiǎn)化的元素名來(lái)引用一個(gè)元素: > rec$score [1] 85 76 90 > rec$sc [1] 85 76 90 > rec$s [1] 85 76 90 > rec [1] TRUE TRUE TRUE 當(dāng)然,,在寫(xiě)R腳本程序的時(shí)候,還是不建議大家這樣來(lái)簡(jiǎn)化,,因?yàn)檫@樣做雖然減少了幾次敲鍵,,但是降低了程序的可讀性,不是一個(gè)好習(xí)慣,。 列表處理的靈活性還體現(xiàn)在:你可以隨心所欲地對(duì)元素重新賦值,,或者擴(kuò)充: > rec$age=22 >rec$sex="Female" > rec $name [1] "李明"
$age [1] 22
$scores [1] 85 76 90
$sex [1] "Female" 上面第一條指令修改了age元素,第二條指令新增了一個(gè)名為“sex”的元素,。 多個(gè)list對(duì)象還可以使用c()函數(shù)連接起來(lái)構(gòu)成一個(gè)新的列表;例如,,下面的指令取出rec的一個(gè)子列表,,然后和另一個(gè)只有一個(gè)元素的列表合并,賦值到一個(gè)新的變量: > d = c(rec[2],list(qq=33221122)) > d $age [1] 22
[1] 33221122 有了列表的基礎(chǔ)知識(shí),,我們就可以開(kāi)始詳細(xì)講解數(shù)據(jù)框了,。 數(shù)據(jù)框是R語(yǔ)言中類(lèi)似矩陣的一種數(shù)據(jù)結(jié)構(gòu),但矩陣的各列可以是不同類(lèi)型的數(shù)據(jù),。數(shù)據(jù)框的每列是一個(gè)變量,,每行是一個(gè)觀(guān)測(cè),,像極了我們最最常見(jiàn)的“成績(jī)單”。 數(shù)據(jù)框可以用data.frame()函數(shù)生成,,其用法與list()函數(shù)相同,。例如: > staff <-data.frame(name=c("張三", "李四","王五"), age=c(21, 24,20),height=c(181, 167, 176)) > staff name age height 1 張三 21 181 2 李四 24 167 3 王五 20 176 上面是一個(gè)有3列(即3個(gè)變量)的數(shù)據(jù)框。 換一個(gè)比較規(guī)范的說(shuō)法是:數(shù)據(jù)框是一種特殊的列表對(duì)象,,各列表成員必須是向量(數(shù)值型,、字符型、邏輯型),、因子,、數(shù)值型矩陣、列表,,或其它數(shù)據(jù)框,,其中: n 向量、因子成員為數(shù)據(jù)框提供一個(gè)變量,; u 如果向量不是數(shù)值型的,,則會(huì)被強(qiáng)制轉(zhuǎn)換為因子; n 矩陣,、列表,、數(shù)據(jù)框這樣的成員為新數(shù)據(jù)框提供了和其列數(shù)、成員數(shù),、變量數(shù)相同個(gè)數(shù)的變量,。 n 作為數(shù)據(jù)框變量的向量、因子或矩陣必須具有相同的長(zhǎng)度(行數(shù)),。 上面提到的數(shù)據(jù)類(lèi)型中,,“因子”(factor)表示分類(lèi)變量,不能用來(lái)計(jì)算而只能用來(lái)分類(lèi)或者計(jì)數(shù),;在以后用到的時(shí)候我們?cè)谧龈唧w的講解,。 對(duì)上面這些教條我們現(xiàn)在不作過(guò)多解釋?zhuān)ㄓ悬c(diǎn)詰屈聱牙);一般可以把數(shù)據(jù)框看作是一種推廣了的矩陣,,它可以用矩陣形式顯示,,也可以用對(duì)矩陣的下標(biāo)引用的方法來(lái)引用其元素或子集。下面是對(duì)數(shù)據(jù)框的變量(列)的引用的兩種形式(別忘了數(shù)據(jù)框是一個(gè)列表): > staff[[1]] [1] 張三李四王五 Levels: 李四王五張三 > class(staff[[1]]) [1] "factor" > staff$name [1] 張三李四王五 Levels: 李四王五張三
> staff[[2]] [1] 21 24 20 > class(staff[[2]])
> staff$age [1] 21 24 20 上面我們使用class()函數(shù)來(lái)顯示參數(shù)的數(shù)據(jù)類(lèi)型,。 如果使用單括號(hào),,則取出的數(shù)據(jù)類(lèi)型是一個(gè)子數(shù)據(jù)框: > staff[1] name 1 張三 2 李四 3 王五 > class(staff[1]) [1]"data.frame"
> staff[2] age 1 21 2 24 3 20 > class(staff[2]) [1]"data.frame" 如果使用雙下標(biāo)的形式,表示我們要取出數(shù)據(jù)框中的單個(gè)矩陣元素,,下標(biāo)引用方法和數(shù)學(xué)里面的矩陣元素下標(biāo)一樣,,是“[行,列]”的形式,。 > staff[2,1] [1] 李四 Levels: 李四王五張三 > class(staff[2,1]) [1] "factor"
> staff[2,2] [1] 24 > class(staff[2,2]) [1]"numeric"
> staff[2,3] [1] 167 > class(staff[2,3]) [1]"numeric" 我們還可以在單括號(hào)內(nèi)使用范圍型坐標(biāo),;仔細(xì)讀讀下面的例子,,看看范圍型坐標(biāo)是如何定為數(shù)據(jù)元素的區(qū)域的: > staff name age height 1 張三 21 181 2 李四 24 167 3 王五 20 176 > staff[1:2, 2:3] age height 1 21 181 2 24 167 >class(staff[1:2,2:3]) [1]"data.frame" 最后,我們要說(shuō)說(shuō)數(shù)據(jù)框的“變量名”和“行名”,。變量名就是列名,,由屬性names定義,此屬性一定是非空的,。行名用rownames屬性定義,。如: > names(staff) [1]"name" "age" "height" > rownames(staff) [1] "1""2" "3" 數(shù)據(jù)框的主要用途是保存數(shù)據(jù)分析建模所需要的數(shù)據(jù),因此有著特殊的重要性,。在使用數(shù)據(jù)框的變量時(shí),,雖然我們可以使用“數(shù)據(jù)框名$變量名”的記法,但是,,這樣使用比較麻煩,,R語(yǔ)言提供了attach()函數(shù)可以把數(shù)據(jù)框“連接”到當(dāng)前的名字空間(namespace,即數(shù)據(jù)變量存儲(chǔ)區(qū))內(nèi),,以方便對(duì)數(shù)據(jù)框變量的引用,;例如: > attach(staff) > age [1] 21 24 20 > c=age+10 > c [1] 31 34 30 上面的例子中,由于staff已經(jīng)連接入當(dāng)前的名字空間,,因此可以通過(guò)age直接引用其age變量,。 如果我們還希望擴(kuò)充數(shù)據(jù)框,和對(duì)列表的處理方式一樣,,可以直接對(duì)要新增的變量(列)賦值即可: > staff$futureAge=c > staff name age height futureAge 1 張三 21 181 31 2 李四 24 167 34 3 王五 20 176 30 如果需要取消連接,,只要調(diào)用detach()即可。 小竅門(mén):經(jīng)常念叨一下:“數(shù)據(jù)框就是一個(gè)列表”,,可能會(huì)幫你記住上面說(shuō)的各種引用方法,。 上面我們簡(jiǎn)要描述了和時(shí)間序列相關(guān)的R的兩種數(shù)據(jù)結(jié)構(gòu):列表和數(shù)據(jù)框。實(shí)際上,,R附加包里面還定義有多種更為復(fù)雜的時(shí)間序列類(lèi)型的數(shù)據(jù)結(jié)構(gòu),,其中比較常用的一種,定義于在stats包中,,我們?cè)趯?duì)矩陣做一個(gè)簡(jiǎn)單介紹再對(duì)它做講述,。 矩陣式R中的基本數(shù)據(jù)對(duì)象之一,用于表示和代數(shù)中的“矩陣”類(lèi)似的數(shù)據(jù),;其創(chuàng)建函數(shù)就是matrix(): matrix(data = NA, nrow= 1, ncol = 1, byrow = FALSE, dimnames = NULL) 一個(gè)簡(jiǎn)單的例子:使用4個(gè)數(shù)構(gòu)成一個(gè)矩陣,,觀(guān)察一下行數(shù)和列數(shù)是由什么參數(shù)確定的: >matrix(list(1,2,3,4)) [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4
> matrix(list(1,2,3,4),nrow=2) [,1] [,2] [1,] 1 3 [2,] 2 4
>matrix(list(1,2,3,4),nrow=2,dimnames=list(c("row1","row2"),c("col1","col2"))) col1 col2 row1 1 3 row2 2 4 從上面的例子可以看出,如果沒(méi)有指定行和列的名稱(chēng),,R直接使用類(lèi)似“[1,]”這樣的表達(dá)來(lái)表示矩陣的行,及類(lèi)似“[,1]”的形式來(lái)表示列,;而如果需要指定列名和行名,,則必須使用一個(gè)有2個(gè)元素的list做dimnames參數(shù),,并在每個(gè)元素中包含所有的名稱(chēng)。另外,,我們可以使用上面的方式來(lái)引用矩陣的行或列,,即a[1,]表示第1行,而a[,2]表示第2列等: > #設(shè)a是一個(gè)2*2矩陣 > a col1 col2 row1 1 3 row2 2 4
> a[1,] $col1 [1] 1
$col2 [1] 3
> a[,2] $row1 [1] 3
$row2 [1] 4 下面我們看看ts數(shù)據(jù)類(lèi)型,。 2.5 時(shí)間序列數(shù)據(jù)類(lèi)型ts R語(yǔ)言中時(shí)間序列數(shù)據(jù)結(jié)構(gòu)的最基本類(lèi)型是ts類(lèi)型(它的“class”屬性就是“ts”),,定義在stats包;這是一種等時(shí)間間隔采樣的數(shù)據(jù),,并且至少包括一個(gè)采樣點(diǎn),;另外,ts類(lèi)型對(duì)數(shù)值型數(shù)據(jù)的支持較好,,而對(duì)非數(shù)值型數(shù)據(jù)支持較差,。 ts()函數(shù)用于創(chuàng)建一個(gè)時(shí)間序列對(duì)象,其語(yǔ)法格式為: ts(data = NA, start =1, end = numeric(), frequency = 1, deltat = 1, ts.eps =getOption("ts.eps"), class = , names = ) ts()函數(shù)使用一個(gè)數(shù)值型向量或矩陣(由上面的“data”參數(shù)指定)來(lái)創(chuàng)建一個(gè)時(shí)間序列對(duì)象,。 start和end參數(shù)指定采樣的起始時(shí)間和結(jié)束時(shí)間,;可以使用兩個(gè)數(shù)字組成的向量來(lái)表示一個(gè)自然時(shí)間單位上的起始時(shí)間,例如,,下面的c(1959, 2)表示1959年第2季度: > a=ts(1:10,frequency = 4, start = c(1959, 2)) # 2nd Quarter of 1959 > class(a) [1] "ts" Qtr1 Qtr2 Qtr3 Qtr4 1959 1 2 3 1960 4 5 6 7 1961 8 9 10 frequency參數(shù)表示在指定的單位時(shí)間上的采樣頻率,。上面例子中frequency是4,表示在一個(gè)年度(有start指定的時(shí)間單位)上有4個(gè)觀(guān)測(cè)值,。所有data參數(shù)所指定的數(shù)據(jù),,將按照start、end,、frequency等參數(shù)指定的時(shí)間和采樣方式排列成為一個(gè)時(shí)間序列數(shù)據(jù)對(duì)象,。 作為一個(gè)被廣泛引用的例子,我們看看一家位于昆士蘭海濱度假圣地的紀(jì)念品商店從 1987到1993年的每月銷(xiāo)售數(shù)據(jù),;該數(shù)據(jù)文件最早見(jiàn)于Wheelwright andHyndman 1998年出版的《Forecast: Methods andApplications》,,其網(wǎng)址在: http:///tsdldata/data/fancy.dat 我們用該數(shù)據(jù)來(lái)演示一下ts對(duì)象的應(yīng)用方法: > souvenir <-scan("數(shù)據(jù)/fancy.dat.txt") # 或直接使用souvenir<- scan("http:///tsdldata/data/fancy.dat") Read 84 items > class(souvenir) [1]"numeric" >souvenirtimeseries <- ts(souvenir, frequency=12, start=c(1987,1)) >souvenirtimeseries Jan Feb Mar Apr May Jun 1987 1664.81 2397.53 2840.71 3547.29 3752.96 3714.74 1988 2499.81 5198.24 7225.14 4806.03 5900.88 4951.34 1989 4717.02 5702.63 9957.58 5304.78 6492.43 6630.80 1990 5921.10 5814.58 12421.25 6369.77 7609.12 7224.75 1991 4826.64 6470.23 9638.77 8821.17 8722.37 10209.48 1992 7615.03 9849.69 14558.40 11587.33 9332.56 13082.09 1993 10243.24 11266.88 21826.84 17357.33 15997.79 18601.53 Jul Aug Sep Oct Nov Dec 1987 4349.61 3566.34 5021.82 6423.48 7600.60 19756.21 1988 6179.12 4752.15 5496.43 5835.10 12600.08 28541.72 1989 7349.62 8176.62 8573.17 9690.50 15151.84 34061.01 1990 8121.22 7979.25 8093.06 8476.70 17914.66 30114.41 1991 11276.55 12552.22 11637.39 13606.89 21822.11 45060.69 1992 16732.78 19888.61 23933.38 25391.35 36024.80 80721.71 1993 26155.15 28586.52 30505.41 30821.33 46634.38 104660.67 上面的第一個(gè)指令是使用scan()函數(shù)讀取數(shù)據(jù);scan()函數(shù)的作用是從數(shù)據(jù)文件中讀入數(shù)據(jù)構(gòu)成一個(gè)向量(或列表),;數(shù)據(jù)文件可以位于本地文件系統(tǒng)中,,也可以位于網(wǎng)絡(luò)上。正如我們?cè)诘诙l指令中看到的那樣,,讀入的數(shù)據(jù)構(gòu)成了一個(gè)數(shù)值型的向量,。然后使用ts()函數(shù)將該向量轉(zhuǎn)化成為一個(gè)ts類(lèi)對(duì)象,由start指定數(shù)據(jù)的起始時(shí)間,,frequency指定每年的采樣數(shù),,這樣系統(tǒng)可以自動(dòng)地確定后繼數(shù)據(jù)的時(shí)間屬性。 附注:我們也可以在上面第一步使用已經(jīng)熟悉的read.csv()函數(shù)來(lái)讀入數(shù)據(jù),,效果是一樣的,。 下面我們來(lái)對(duì)souvenirtimeseries繪圖,。 > plot(souvenirtimeseries) >plot.ts(souvenirtimeseries) 上面兩條指令對(duì)當(dāng)前的souvenirtimeseries這個(gè)簡(jiǎn)單的數(shù)據(jù)對(duì)象來(lái)說(shuō),似乎效果是一樣的,,只是后者(plot.ts())針對(duì)時(shí)間序列數(shù)據(jù)有著更為強(qiáng)大的功能,,例如,同時(shí)進(jìn)行多個(gè)序列的繪制等,;我們暫按下不表J,。繪圖結(jié)果如圖表2?3所示。 圖表2?3時(shí)間序列對(duì)象souvenirtimeseries繪圖 從上圖中可以看出,,souvenirtimeseries存在季節(jié)性模式,,即在每年的年底都有波峰,并且這個(gè)波峰有逐年增大的趨勢(shì),。如果這種季節(jié)模式的幅度比較穩(wěn)定,,則比較容易進(jìn)行數(shù)學(xué)處理,因此,,我們對(duì)該序列進(jìn)行對(duì)數(shù)變換: >logsouvenirtimeseries <- log(souvenirtimeseries) >plot(logsouvenirtimeseries) 變換后的繪圖效果為: 圖表2?4對(duì)數(shù)變換后的圖形,,波動(dòng)幅度基本相近 從上圖可以看出,變換后的序列,,有著近似等幅的波動(dòng)特征,,這樣的模式為我們對(duì)該序列的未來(lái)值進(jìn)行預(yù)測(cè)提供了依據(jù)。 下章我們開(kāi)始介紹時(shí)間序列分析的基本方法,。 http://blog.sciencenet.cn/blog-577790-829964.html 此文來(lái)自科學(xué)網(wǎng)王樂(lè)博客,,轉(zhuǎn)載請(qǐng)注明出處。 上一篇:《金融時(shí)間序列預(yù)測(cè)》:第1章:R語(yǔ)言的閃電入門(mén) 下一篇:《金融時(shí)間序列預(yù)測(cè)》:第12章:R量化投資初步 |
|
來(lái)自: 紙?jiān)萝?/a> > 《R語(yǔ)言》