《R語言入門》的讀書筆記
本書的重點內容及感悟:
第一章 導言
1、R是一個有著統計分析功能及強大作圖功能的軟件系統。R內含了許多實用的統計分析及作圖參數。作圖參數能將產生的展示在一個獨立的窗口中。并能將之保存為各種形式的文件(jpg,png,bmp,ps,pdf,emf,pictex,xfig),具體形式取決于操作系統。統計分析的結果也能被直接顯示出來,一些中間(如P-值,回歸系統,殘差等)既可保存到專門的文件中,也可以直接用作進一步的分析。
2、在R語言中,使用者可以使用循環(huán)語句來連續(xù)分析多個數據集,也可將多個不同的統計函數結合在一個語句中執(zhí)行更復雜的分析。R使用者還可以借鑒網上提供的用S編寫的大量程序,而且大多數都能被R直接調用。
3、非專業(yè)人員起初可能覺得R相對比較復雜,其實,R的一個非常突出的優(yōu)點正是它的靈活性。一般的軟件往往會直接展示分析的結果,而R則將這些結果都存在一個對象object里面,所以常常在分析執(zhí)行結束后并不顯示任何結果。使用者可能會對此感到困惑,其實這樣的特點是非常有用的,因為我們可以選擇的從結果中只抽出我們感興趣的部分。例如,我們要運行20個回歸分析而只想比較其回歸系統,在R中就可以選擇只顯示所有分析得出的回歸系統,這樣結果僅僅占了一排,而用有些軟件可能會一下打開20個窗口。
第二章 基本原理與概念
1、基本原理
因為R是一種編程語言,一些對編程不太熟悉的人可能會望而卻步,這種障礙其實是完全沒有必要的。首先R是一種解釋型語言,而不是編譯語言,也就意味著輸入的命令能夠執(zhí)行,而不需要像一些語言要首先構成一個完整的程序形式。第二、R的語法非常簡單和直觀。例如,線性回歸的命令lm(y~x)表示以x為自變量,y為因變量來擬合一個線性模型。合法的R函數總是帶有圓括號的形式,即使括號內沒有內容(如,ls())。如果直接輸入函數名而不輸入括號,R則會自動顯示該函數的一些具體內容。
在R中進行的所有操作都是針對存儲在活動內存中的對象的。對數據,結果或圖表的輸入與輸出都是通過在對計算機硬盤中的文件讀寫而實現。用戶通過輸入一些命令調用函數,分析得出的結果可以被直接顯示在屏幕上,也可以被存入某個對象對被寫入硬盤。因為產生的結果本身就是一種對象,所以它們也能被視為數據并能像一般數據那樣被處理分析。數據文件即可從本地磁盤讀取也可通過網絡傳輸從遠程服務器端獲得。
所有能使用的R函數都被包含在一個庫(library)中,該庫存放在磁盤的/library目錄下,這個目錄下含有具有各種功能的包,各個包也是按照目錄的方式組織起來的。其中名為base包含可以算是R的核心,因為它內嵌了R語言中所有像數據讀寫與操作這些最基本的函數。在上述目錄中的每一個包內,都有一個目錄R,這個目錄里又都含有一個與此包同名的文件(如/library/base/r/base)。該文件正是存放所有函數的地方。
R語言中最簡單的命令莫過于通過輸入一個對象的名字來顯示其內容了。例如,一個名為n的對象,其內容是數值10;
>n
[1] 10
該命令的功能在這里于函數print相似,輸出結果與print(n)相同。對象的名字必須是以一個字母開頭,中間可以包含字母,數字,點,及下劃線。因為R對對旬的名字區(qū)分大小寫。所以x和X就可以代表兩個完全不同的對象。
2、對象的產生,排列及刪除
一個對象可以通過賦值操作來產生。
>n<-15 ? ? //該符號可以是從左到右的方向,也可以相反。>5->n是一樣的。如果該對象存在,那么它以膠的值將會自動被新值沖掉(這種修改只會影響內存中的數據,操作結果暫時不會被保存到硬盤中)。在R中給對象賦值有多種形式,可以是直接賦一個數值,也可以是一個算式或一個函數的結果。>n<-15+2或>n<-15+rnom(1)。運行rnom(1)將產生一個服從平均數為0,標準差為1的標準正態(tài)分布的隨機變量。
>n<-15;name<-15+5;m<-1
函數ls的功能是顯示所有在內存中的對象:只會列出對象。注意在R中應該用分號來隔開同一行中的不同命令語句。如果只要顯示出在名稱中帶有某個指定字符的對象。>ls(pat="m")。如果進一步限為顯示在名稱中以某個字母開關的對象,則可:>ls(pat="^m")。運行函數ls.str()將會展示內存中所有對象的詳細信息。
在ls.str()將會列出關于對象的所有信息,包括數據框、矩陣、數據列表的列數信息,因此展示結果可能會很長。ls.str(pat="^m",max.level=-1)就可以避免這種情況了。
要在內存中刪除某個對象,可利用函數rm:運行rm(x)將會刪除對象x,運行rm(x,y)將會刪除對象x和y。而運行rm(list=ls())則會刪除內存中的所有對象。
3、在線幫助
R中給予的在線幫助能提供關于如何使用函數的非常有用的信息。關于某個特定函數的幫助能夠直接被調出來。如運行>?lm會立即顯示關于函數lm()的幫助頁面。
第三章 R的數據操作
1、對象
R通過一些對象來運行,當然首先這些對象是用它們的名稱和內容來刻畫的,其次也通過對象的數據類型即屬性來刻畫。對象的類型和長度可以分別通過函數mode和length得到.
對象的類型:向量是一個變量,其意思也即人們通常認為的那樣;因子是一個分類變量;數組是一個k維的數據表;矩陣是數組的一個特例,其維數k=2。注意,數組或者矩陣中的所有元素都必須是同一種類型的;數據框是由一個或幾個向量或因子構成。它們必須是等長的。但可以是不同的數據類型。ts是時間序列數據,它包含一些額外的屬性,例如頻率和時間;列表可以包含任何類型的對象,包括列表。對于一個向量,用它的類型和長度足夠描述數據;而對其它的對象則另需一些額外信息。
2、在文件中讀寫數據
函數read.table用來創(chuàng)建一個數據框,所以它是讀取表格形式的數據的主要方法。>mydata<-read.table("data.dat")。將創(chuàng)建一個數據框名為mydata,數據框中每個變量也都將命令。
函數scan比read.table要更加靈活,它們的區(qū)別之一是前者可以指定變量的類型。區(qū)別之二是scan()可以用來創(chuàng)建不同的對象,向量、矩陣、數據框,列表....
3、存儲數據
函數write.table可以在文件中寫入一個對象,一般是寫一個數據框,也可以是其它類型的對象(向量,矩陣)。若想用更簡單的方法將一個對象寫入文件,可以使用命令write(x,file="data.txt"),其中x是對象的名字。
4、生成數據
1)規(guī)則序列
函數seq可以生成實數序列。如:>seq(1,5,0.5)。其中第一個數字表示序列的起點,第二個表示終點,第三個是生成序列的步長。還可以用函數c直接輸入數值。如:>c(1,1.5,2.0,2.5,6,5)。如果想用鍵盤輸入一些數據也是可以以,只需要直接使用默認選項的scan函數。如:>z<-scan()。函數req用來創(chuàng)建一個所有元素都相同的向量。如:>req(1,30)。函數sequence創(chuàng)建一系列連接的整數序列。每個序列都以給定參數的數值結尾。>sequence(4:5)。函數gl(生成不同的水平/層次數據)十分有用。因為它能產生規(guī)則的因子序列。如:>gl(3,5)
2)隨機序列
在統計學中,產生隨機數據是很有用的,R可以產生多種不同分布下的隨機數序列。
5、使用對象
1)創(chuàng)建對象
在創(chuàng)建一個對象時有可能指定它的數據類型,長度、類別等等的。從處理對象的角度時是很有趣的。舉例來說,我們可以創(chuàng)建一個空的對象并逐步修改其中的元素。
向量(vector):函數vector有兩個參數。類型和長度。創(chuàng)建的向量中元素值取決于參數所指定的數據類型。數值型向量則元素值都為0,邏輯型都為FALSE,字符型都為""。
因子(factor):一個因子不僅包括分類變量本身還包括變量不同的可能水平(因為他們在數據中不出現)。
矩陣(Matrix):一個矩陣實際上是有一個附加屬性(維數dim)的向量,維數即為一個長度為2的向量,用來指定矩陣的行數和列數。一個矩陣可以用函數matrix來創(chuàng)建。
數據框(Data frame):用函數data.frame來創(chuàng)建。數據框中的向量必須有相同的長度,如果其中有一個比其它的短,它將“循環(huán)”整數次(以使得其長度與其它向量相同)。
最后:注意數據框和矩陣一樣有維數這個屬性。
列表(List):列表可以用list函數來創(chuàng)建,方法與創(chuàng)建數據框類似。它對其中包含的對象沒有什么限制。
時間序列(Time-series):函數ts可以由向量(一元時間序列)或者矩陣(多元時間序列)創(chuàng)建一個ts型對象。并且有一些表明序列特征的選項(帶有缺省值)。
表達式(Espression):表達式類型的對象在R中有著很基礎的地位,是R能夠解釋的字符序列。隨后用eval()對創(chuàng)建的表達式進行求值。
2)對象的類型轉換
as.something這種形式的函數可以完成轉換。as.numeric將轉換為數值型。as.logical將轉換為邏輯型。as.character將轉換為字符型。對于一個字符型因子來說是很有意義的。要想將一個數值型向量并且保持最初指定的水平值,就必須先轉換成字符型然后再轉換成數值型。如:as.numeric(as.character(fac))
3)運算符
運算符分為數學運算、比較運算、邏輯運算。identical比較數據的內在關系,如果對象是嚴格相同的返回TRUE,否則返回FALSE。all.equal用來判斷兩個對象是否“近似相等”,返回結果為TRUE或者對二者差異的描述。后一個函數在比較數值型變量時考慮到了計算過程中的近似。在計算機中數據變量的比較有時很令人驚奇。
4)訪問一個對象的數值:下標系統
下標系統可以用來有效、靈活且有選擇性地訪問一個對象中的元素;下標可以是數值型的或邏輯型的。下標本身也可以是一個數值型向量。
如果x是一個矩陣或者數據框,第i行第j列的值可以通過x[i,j]來訪問。要訪問一個給定的行或列所有的值,只要忽略適當的下標(不要忘記逗號!)
對于列表,訪問不同的元素(可以是任何類型的對象)可以通過單一的或者雙重的方括號來實現;它們的區(qū)別是:單個括號返回一個列表,而雙重括號將提取列表中的對象。如:my.list[1:2]將返回一個列表,包含原始列表的第1個和第2個元素。而my.list[[1:2]]不會給出期望的結果。
5)訪問對象的名稱
names是一個和對象有同樣長度的向量并且可以通過函數names來訪問。如果一個對象的元素有名稱,它們可以通過名稱被提取,和使用一樣。實際上,因為原始對象的屬性將被保留,所以這里的“提取”應該叫作“取子集”更合適。如果列表中的對象有名稱,這種方法也將在列表中起作用。
6)數據編輯器
我們可以使用一個類似于電子表格的圖形編輯器去編輯一個“數據”對象。例如,如果X是一個矩陣,命令data.entry(X)將打開一個圖形編輯器并且可以通過點擊適當的單元格修改數值或者添加新的行或列。
7)數學運算和一些簡單的函數
在R中有很多用來處理數據的函數,前面我們已經看到了最簡單的一個函數c,它用來連接列在圓括號中的對象。
8)矩陣運算
R中有矩陣計算和處理的工具,函數rbind()和cbind()分別用上下或左右的方式合并向量或矩陣。
兩矩陣乘積的運算符是“%*%”。矩陣的轉置由函數t完成,這個函數也可以作用于數據框。函數diag可以用來提取或修正一個矩陣的對象元,或者創(chuàng)建一個對象矩陣。R中也有一些用于矩陣計算的專門的函數。我們可以使用solve來矩陣的逆,用qr來分解矩陣,用eigen來計算特征值和特征向量,用svd來做奇異值分解。
第四章 R繪圖
繪圖函數的工作方式與文本前面描述的工作方式為不同,不能把繪圖函數的結果賦給一個對象,其結果直接輸出到一個繪圖設備上。繪圖設備是一個繪圖的窗口或是一個文件。
1、管理繪圖
1)打開多個繪圖設備:當繪圖函數開始執(zhí)行,如果沒有打開繪圖設備,那么R將打開一個繪圖窗口來展示這個圖形。繪圖設備可以用適當的函數打開??捎玫睦L圖設備種類取決于操作系統。在Unix/Linux下,繪圖窗口稱為xl1,而在windows下稱為windows。在所有情況下,都可以用命令xl1()來打開一個繪圖窗口。最后打開的設備將成為當前的繪圖設備,隨后的所有圖形都在這上面顯示。
顯示的數字是設備的編號,要改變當前設備必須使用這些編號,為了解當前設備用。dev.list()顯示所有設備;dev.cur()顯示當前設備;dev.set()改變當前設備;dev.off()關閉一個設備。
2)圖形的分割
函數split.screen()分割當前的繪圖設備。erase.screen()刪除最后繪制的圖形。函數layout把當前的圖形窗口分割為多個部分,圖形將一次顯示在各部分中,它主要的自變量是一個元素都是整數值的矩陣,元素指示子窗口的編號。
2、繪圖函數/繪圖函數
第五章 R的統計分析
包stats包括一系列基本的統計分析函數;經典的假設檢驗,線性模型(包括最小二乘法回歸,廣義線性模型,和方差分析),統計分布,匯總統計,層次聚類,時間序列分析,非線性最小二乘法和多元分析。其他的R包還提供了一些上述統計方法以外的統計方法。
1、關于方差的一個簡單例子
在包stats里面的方差分析函數是aov。通過函數data把數據導入內存后,首先對數據進行平方根轉換。然后再進行分析。前面腳本運行的結果不會在屏幕上顯示,因為它們都被賦給對象aov.spray。函數plot()和termplot()展示分析結果的統計圖。
2、泛型函數
和許多統計編程語言不同的是,R函數將輸入對象的屬性作為輸入參數。類是最應該注意關注的一個屬性。R統計函數常常返回一個類名與函數名相同的對象。我們用來解析結果的函數對特定的類對象有特定的行為。這些函數被稱為泛型。泛型函數很少對對象進行任何操作:它們調用自變量所屬類的對應函數。
3、包
隨R基本安裝環(huán)境發(fā)布的標準包。其中一些包在R啟動時就直接調入內存;這些可用通過函數search顯示。其他包需要載入后才能使用。
第六章 R編程實踐
1、相比下拉菜單式的程序,R的一個優(yōu)勢在于它可以把一系列連接的操作簡單的程序化。這一點上和所有其他計算機編程語言是一致的,但R有一些特性使得非專業(yè)人士也可以很簡單的編程程序。
2、用R寫和程序
一般情況下,一個R程序以ASCII格式保存,擴展名為‘.R’。如果一個工作要重復好多次,用R程序是一個不錯的選擇。
3、編寫你自己的函數
大多數R的工作是通過函數來實現,而且這些函數的輸入參數都放在一個括弧里。用戶可以編寫他們自己的函數,并且這些函數和R里面的其他函數有一樣的特性。編寫自己的函數可以讓你有效的,靈活的與合理的使用R。