本文最新版已更新至http://thinkinside.tk/2013/05/03/r_notes_1_what.html
在學習量化投資的時候,我發現了R(www.r-project.org)。R到底是什么呢?在開始之前,先看看R的神奇之處。
1. R初窺
從CRAN(The Comprehensive R Archive Network)cran.r-project.org—mirrors.html中選擇一個鏡像,然后下載合適的安裝包(R支持Linux、Mac OS X和Windows)。
安裝並運行R后,可以看到R的控制台(我的操作系統是Mac OS):
在R的控制台輸入如下命令:
> install.packages('quantmod') # 安裝quantmod包 > require(quantmod) #引用quantmod包 > getSymbols("GOOG",src="yahoo",from="2013-01-01", to='2013-04-24') #從雅虎財經獲取google的股票數據 > chartSeries(GOOG,up.col='red',dn.col='green') #顯示K線圖 > addMACD() #增加MACD圖
就能夠看到下圖的效果了:
最后,退出R:
> q()#Terminate an R Session
2. R是什么
是不是很神奇?反正當時我完全被Hold住了。
那么R到底是什么?或者說,R到底是做什么用的?從不同的角度出發,對R會有不同的描述。
- 從使用角度,R是一個有着統計分析功能及強大作圖功能的軟件,在GNU協議General Public Licence4下免費發行。
- 從編程角度,R語言是面向對象的統計編程語言,是由AT&T貝爾實驗室所創的S語言發展出的一種方言。
- 從計算角度,R 是一種為統計計算和圖形顯示而設計的語言及環境。
- 從開發角度,R 是一組開源的數據操作,計算和圖形顯示工具的整合包有各種方式可以進行編程調用。
- 從架構角度,R 是為統計計算和圖形展示而設計的一個系統。它包括一種編程語言,高級別圖形展示函數,和其它語言的接口以及調試工具。
如果一定要找到一個與R類似的軟件,那就是商業軟件Matlab。R和Matlab都是基於編程進行數據分析的工具,Matlab適用的領域更廣,而R更擅長統計分析領域。
與Matlab相比,R更具備開放性:
- R是自由軟件,Matlab是商業軟件;
- R可以方便的通過“包”進行擴展,R的核心只有25個包,但是有幾千個外部包可以調用,當然你也可以開發自己的;
- R語言比Matlab的要強大;
- R和其他編程語言/數據庫之間有很好的接口;其他語言也可以很方便的調用R的API和結果對象。
R常用於金融和統計領域。大多數人使用R就是因為它的統計功能,R的內部實現了很多經典的or時髦的統計技術。
3. R的核心概念
3.1 對象
R語言是一種面向對象的語言,所有的對象都有兩個內在屬性:元素類型和長度。
元素類型是對象內元素的基本類型,包括:數值(numeric),字符型(character),復數型(complex)、邏輯型(logical)、函數(function)等,通過mode()函數可以查看一個對象的類型。
長度是對象中元素的數目,通過函數length()可以查看對象的長度。
除了元素類型外,對象本身也有不同的“類型”,表示不同的數據結構(struct)。R中的對象類型主要包括:
向量(vector): 由一系列有序元素構成。
因子(factor):對同長的其他向量元素進行分類(分組)的向量對象。R 同時提供有序(ordered)和無序(unordered)因子。
數組(array):帶有多個下標的類型相同的元素的集合
矩陣(matrix):矩陣僅僅是一個雙下標的數組。R提供了一下函數專門處理二維數組(矩陣)。
數據框(data frame):和矩陣類似的一種結構。在數據框中,列可以是不同的對象。
時間序列(time series):包含一些額外的屬性,如頻率和時間.
列表(list):是一種泛化(general form)的向量。它沒有要求所有元素是同一類型,許多時候就是向量和列表類型。列表為統計計算的結果返回提供了一種便利的方法。
3.2 常量
R中還定義了一些常量,比如:
NA:表示不可用
Inf: 無窮
-Inf: 負無窮
TRUE:真
FALSE:假
4. R的基本使用
4.1 命令
R是一種語法非常簡單的表達式語言(expression language)。使用者通過命令(command)與R進行交互。
基本命令要么是表達式(expressions)要么就是賦值(assignments)。如果一條命令是表達式,那么它將會被解析(evaluate),並將結果顯示在屏幕上,同時清空該命令所占內存。賦值同樣會解析表達式並且把值傳給變量但結果不會自動顯示在屏幕上。
基於命令,可以用交互的方式或者批處理/腳本文件的方式使用R。
4.2 交互式使用 R
交互式shell是一種很方便的環境,可以進行各種嘗試,隨時調整過程。與Python、Ruby等語言一樣,R也提供了shell環境。本文開始的例子就是以交互的方式使用R。當打開R控制台時,R會顯示命令提示符">",此時可以輸入命令。
下面是交互式使用R的幾個例子:
例一:
> help.start() #啟動在線幫助,會打開瀏覽器。 > x <- rnorm(50); y <- rnorm(x) #產生兩個隨機向量x和y > plot(x,y) #使用x,y畫二維散點圖, 會打開一個圖形窗口 > ls() #查看當前工作空間里面的 R 對象 > rm(x,y) #清除x,y對象 >x <- 1:20 # 相當於x=(1,2,…,20)
例二:
x <- 1:20#等價於 x = (1, 2, ..., 20)。 w <- 1 + sqrt(x)/2#標准差的`權重'向量。 dummy <- data.frame(x=x, y= x + rnorm(x)*w)#創建一個由x 和 y構成的雙列數據框 dummy #查看dummy對象中的數據。 fm <- lm(y ~ x, data=dummy)#擬合 y 對 x 的簡單線性回歸 summary(fm)#查看分析結果。 fm1 <- lm(y ~ x, data=dummy, weight=1/w^2)#加權回歸 summary(fm1)#查看分析結果。 attach(dummy)#讓數據框中的列項可以像一般的變量那樣使用。 lrf <- lowess(x, y)#做一個非參局部回歸。 plot(x, y)#標准散點圖。 lines(x, lrf$y)#增加局部回歸曲線。 abline(0, 1, lty=3)#真正的回歸曲線:(截距 0,斜率 1)。 abline(coef(fm))#無權重回歸曲線。 abline(coef(fm1), col = "red")#加權回歸曲線。 detach()#將數據框從搜索路徑中去除。 plot(fitted(fm), resid(fm), xlab="Fitted values", ylab="Residuals", main="Residuals vs Fitted")一個檢驗異方差性(heteroscedasticity)的標准回歸診斷圖。 qqnorm(resid(fm), main="Residuals Rankit Plot")#用正態分值圖檢驗數據的偏度(skewness),峰度(kurtosis)和異常值(outlier)。 rm(fm, fm1, lrf, x, dummy)#再次清空。
例三: Michaelson 和 Morley 測量光速的經典實驗
filepath <- system.file("data", "morley.tab" , package="datasets")#從對象 morley 中得到實驗數據的文件路徑 filepath#查看文件路徑 file.show(filepath)#查看文件內容 mm <- read.table(filepath)#以數據框的形式讀取數據 mm$Expt <- factor(mm$Expt) mm$Run <- factor(mm$Run)#將 Expt 和 Run 改為因子。 attach(mm)#讓數據在位置 3 (默認) 可見(即可以直接訪問)。 plot(Expt, Speed, main="Speed of Light Data", xlab="Experiment No.")#用簡單的盒狀圖比較五次實驗。 fm <- aov(Speed ~ Run + Expt, data=mm)#分析隨機區組,`runs' 和 `experiments' 作為因子。 summary(fm) fm0 <- update(fm, . ~ . - Run) anova(fm0, fm)#擬合忽略 `runs' 的子模型,並且對模型更改前后進行方差分析。 detach() rm(fm, fm0)#在進行下面工作前,清空數據。 #下面是等高線和影像顯示的示例 x <- seq(-pi, pi, len=50)#x 是一個在區間 [-pi\, pi] 內等間距的50個元素的向量 y <- x f <- outer(x, y, function(x, y) cos(y)/(1 + x^2))#f 是一個方陣,行列分別被 x 和 y 索引,對應的值是函數 cos(y)/(1 + x^2) 的結果。 oldpar <- par(no.readonly = TRUE) par(pty="s")#保存圖形參數,設定圖形區域為“正方形”。 contour(x, y, f) contour(x, y, f, nlevels=15, add=TRUE)#繪制 f 的等高線;增加一些曲線顯示細節。 fa <- (f-t(f))/2#fa 是 f 的“非對稱部分”(t() 是轉置函數)。 contour(x, y, fa, nlevels=15)#畫等高線 par(oldpar)# 恢復原始的圖形參數 image(x, y, f) image(x, y, fa)#繪制一些高密度的影像顯示 objects(); rm(x, y, f, fa)#在繼續下一步前,清空數據。 th <- seq(-pi, pi, len=100) z <- exp(1i*th)#1i 表示復數 i par(pty="s") plot(z, type="l")#圖形參數是復數時,表示虛部對實部畫圖。這可能是一個圓。 w <- rnorm(100) + rnorm(100)*1i#假定我們想在這個圓里面隨機抽樣。一種方法將讓復數的虛部和實部值是標准正態隨機數 ... w <- ifelse(Mod(w) > 1, 1/w, w)#將圓外的點映射成它們的倒數。 plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+",xlab="x", ylab="y") lines(z)#所有的點都在圓中,但分布不是均勻的。 #下面采用均勻分布。現在圓盤中的點看上去均勻多了。 w <- sqrt(runif(100))*exp(2*pi*runif(100)*1i) plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+", xlab="x", ylab="y") lines(z) rm(th, w, z)#再次清空。 q()#離開 R 程序
4.3 工作空間(workspace)
R shell 可以任意地保存一個完整的環境,稱為工作空間(workspace)。前面的例子中,運行q()命令退出R時,會被詢問是否要保存工作空間:
工作空間(workspace)保存了一些環境信息。每次與R的會話(session)可以從一個全新的環境開始,也可以在原來的基礎上繼續,這些運行信息就保存在工作空間中。
如果在UNIX系統以命令行的方式啟動R,則當前目錄就是本次會話的工作空間:
$ mkdir r_test
$ cd r_test/
$ R
看看R能為工作空間保存些什么內容:
> x <- rnorm(50); y <- rnorm(x) #產生兩個隨機向量x和y
> q()
Save workspace image? [y/n/c]: y
$ ls -Al
會發現R保存了兩個隱藏文件:.RData和.Rhistory。其中.RData以二進制的方式保存了會話中的變量值,.Rhistory以文本文件的方式保存了會話中的所有命令。
如果在一個已有的工作空間中啟動R,會提示:
[原來保存的工作空間已還原]
此時可以用函數ls()和history()看到之前保存的數據和命令。
使用rm()/remove()可以刪除工作空間中的變量。
在R控制台,也可以使用函數getwd()和setwd()來獲取/設置工作空間目錄;使用list.files()查看當前目錄下的文件。
如果以GUI方式運行R控制台,可以通過菜單來加載或保存工作空間。
4.4 腳本/批處理
前面提到R可以在工作空間中保存歷史命令。其實這就是一個工作空間中的默認腳本,當加載工作空間時自動執行。
我們完全可以寫自己的腳本,指定R批量執行一些命令。通常,自己的腳本會以“.R”作為擴展名。一個最簡單的例子test.R:
x <- rnorm(50); y <- rnorm(x) #產生兩個隨機向量x和y
plot(x,y) #使用x,y畫二維散點圖, 會打開一個圖形窗口
並保存到工作空間,然后在R控制台,使用命令:
> source('test.R')
就可以執行該腳本。
> source('test.R', echo=TRUE)可以讓腳本執行時輸出更詳細的信息。
編寫腳本自動執行一些任務時,sink()函數會比較有用:
> sink("record.lis")
會把所有后續的輸出結果從控制台重定向到外部文件 record.lis 中,此時控制台中看不到命令輸出的結果。使用命令:
> sink()
可以讓輸出流重新定向到控制台。
5. 幫助系統
GNU軟件通常都會有非常好的幫助系統,無論對於初學者還是熟練者都能帶來很大的幫助。R當然也不例外。R中提供的幫助主要有以下幾種:
5.1 文檔和搜索
help.start() 命令會打開瀏覽器,顯示幫助文檔。包括一些入門的文檔,以及搜索功能(鏈接:Search Engine & Keywords)。
5.2 演示
demo()會按照包分組,列出所有可用的演示:
按照名稱可以開始演示,如:
demo(is.things)
5.3 函數幫助
如果已經知道一個函數的名稱(比如solve),需要了解其所屬的包、用途、用法、參數說明、返回值、參考文獻、相關函數以及范例等,可以使用命令
help(solve)或 ?solve
該命令會彈出一個窗口:
5.4 函數示例
對於函數,還可以使用example()執行示例,比如:
example(solve)
5.5 關鍵字和運算符
與函數的幫助類似,但是需要加上引號,如:
> ? '[[' # 等價於 help('[[')
> ?'+' #等價於 help('+')
> ?'if' #等價於 help('if')
5.6 搜索
如果不知道函數名稱,還可以進行搜索,比如:
??'analysis' #等價於 search('analysis')
5.7 官方搜索
前面的幫助都受限於本地環境已經安裝的包。如果要搜索R中所有的資源(包,函數、數學方法等),需要在R的官方網站搜索:
www.r-project.org—search.html
6. 學習資料
www.R-project.org R官方網站
cran.r-project.org—manuals.html 官方網站上的一些手冊和文檔(必看)
staff.washington.edu—Rcourse 華盛頓大學的一個R教程