R語言基礎入門(全)

R 是門語言,也是個環境。個人認爲R有點像matlab。

R自帶多種統計學及數字分析功能。R的功能也可以通過安裝包(Packages,用戶撰寫的功能)增強,個人感覺這個就是插件。因爲S的血緣,R比其他統計學或數學專用的編程語言有更強的面向對象(面向對象程序設計)功能。R的另一強項是繪圖功能,製圖具有印刷的質素,也可加入數學符號。雖然R主要用於統計分析或者開發統計相關的軟件,但也有人用作矩陣計算。其分析速度可媲美專用於矩陣計算的自由軟件GNU Octave和商業軟件MATLAB。

R是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、源代碼開放的軟件,它是一個用於統計計算和統計製圖的優秀工具。

R 是統計領域廣泛使用的誕生於 1980年左右的 S 語言的一個分支。R是S語言的一種實現。S語言是由 AT&T貝爾實驗室開發的一種用來進行數據探索、統計分析、作圖的解釋型語言。最初S語言的實現版本主要是S-PLUS。S-PLUS是一個商業軟件,它基於S語言,並由MathSoft公司的統計科學部進一步完善。後來Auckland大學的Robert Gentleman 和 Ross Ihaka 及其他志願人員開發了一個R系統。R的使用與S-PLUS有很多類似之處,兩個軟件有一定的兼容性。S-PLUS的使用手冊,只要經過不多的修改就能成爲 R的使用手冊。所以有人說:R,是S-PLUS的一個“克隆”。但是請不要忘了:R is free。

R是一套完整的數據處理、計算和製圖軟件系統。其功能包括:數據存儲和處理系統;數組運算工具(其向量、矩陣運算方面功能尤其強大);完整連貫的統計分析工具;優秀的統計製圖功能;簡便而強大的編程語言:可操縱數據的輸入和輸入,可實現分支、循環,用戶可自定義功能。

與其說R是一種統計軟件,還不如說R是一種數學計算的環境,因爲R並不是僅僅提供若干統計程序、使用者只需指定數據庫和若干參數便可進行一個統計分析。R的思想是:它可以提供一些集成的統計工具,但更大量的是它提供各種數學計算、統計計算的函數,從而使使用者能靈活機動的進行數據分析,甚至創造出符合需要的新的統計計算方法。

該語言的語法表面上類似 C,但在語義上是函數設計語言的(functional programming language)的變種並且和Lisp 以及 APL有很強的兼容性。特別的是,它允許在“語言上計算”(computing on the language)。這使得它可以把表達式作爲函數的輸入參數,而這種做法對統計模擬和繪圖非常有用。

R是一個免費的自由軟件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免費下載和使用的,在那兒可以下載到R的安裝程序、各種外掛程序和文檔。在R的安裝程序中只包含了8個基礎模塊,其他外在模塊可以通過CRAN獲得。

CRAN爲Comprehensive R Archive Network(R綜合典藏網)的簡稱。它除了收藏了R的可執行文件下載版、源代碼和說明文件,也收錄了各種用戶撰寫的軟件包。現時,全球有超過一百個CRAN鏡像站。

以下轉自http://www.cnblogs.com/wentingtu/archive/2012/03/03/2377969.html

R語言基礎入門之一:引言

 
1 什麼是R語言
R語言是一個開源的數據分析環境,起初是由數位統計學家建立起來,以更好的進行統計計算和繪圖,這篇wiki中包含了一些基本情況的介紹。由於R可以通過安裝擴展包(Packages)而得到增強,所以其功能已經遠遠不限於統計分析,如果感興趣的話可以到官方網站瞭解關於其功能的更多信息。

至於R語言名稱的由來則是根據兩位主要作者的首字母(Robert Gentleman and Ross Ihaka),但過於簡短的關鍵詞也造成在搜索引擎中很不容易找到相關的資料。不過這個專門的搜索網站可以幫到你。


2 爲什麼要學習R語言
可能你想說,“我已經學會了spss/sas/stata...,爲什麼還要去學習R呢?”如下幾方面可能會吸引到你:

  • R是免費開源軟件:現在很多學術期刊都對分析軟件有版權要求,而免費的分析工具可以使你在這方面不會有什麼擔心。另一方面,如果學術界出現一種新的數據分析方法,那麼要過很長一段時間纔會出現在商業軟件中。但開源軟件的好處就在於,很快就會有人將這種方法編寫成擴展包,或者你自己就可以做這件工作。
  • 命令行工作方式:許多人喜歡類似SPSS菜單式的操作,這對於初學者來說很方便入門,但對於數據分析來說,命令行操作會更加的靈活,更容易進行編程和自動化處理。而且命令行操作會更容易耍酷,不是嘛,一般人看到你在狂敲一推代碼後得到一個分析結果,對你投來的目光是會不一樣的。
  • 小巧而精悍:R語言的安裝包更小,大約不到40M,相比其它幾個大傢伙它算是非常小巧精悍了。目前R語言非常受到專業人士歡迎,根據對數據挖掘大賽勝出者的調查可以發現,他們用的工具基本上都是R語言。此外,從最近幾次R語言大會上可以瞭解到,諮詢業、金融業、醫藥業都在大量的使用R語言,包括google/facebook的大公司都在用它。因此,學習R語言對你的職業發展一定是有幫助的。

3 R語言的下載和GUI界面
R語言安裝包可以在官方網站下載,windows版可直接點擊這個連接
在ubuntu下面安裝R則更容易,在終端裏頭運行如下命令即可
sudo apt-get update
sudo apt-get install r-base

此外,學習R語言時強烈推薦安裝Rstudio做爲R的圖形界面,關於Rstudio之前的博文有過簡單介紹,點這裏可能轉到它的官方網站。


4 R語言的學習方法
學習R並不是一件非常輕鬆的事情,初學者需要記住的就是:

  • 親手鍵入代碼並理解其意義
  • 在筆記裏記下一些重點或心得(個人推薦Evernote)
  • 堅持練習,對手邊的數據進行應用分析
  • 理解背景知識,細節很重要。

R語言基礎入門之二:數據導入和描述統計

 
1 數據導入
對初學者來講,面對一片空白的命令行窗口,第一道真正的難關也許就是數據的導入。數據導入有很多途徑,例如從網頁抓取、公共數據源獲得、文本文件導入。爲了快速入門,建議初學者採取R語言協同Excel電子表格的方法。也就是先用較爲熟悉的Excel讀取和整理你要處理的數據,然後“粘貼”到R中。

例如我們先從這個地址下載iris.csv演示數據,在Excel中打開,框選所有的樣本然後“複製”。在R語言中輸入如下命令:
data=read.table('clipboard',T)
這的裏read.table是R讀取外部數據的常用命令,T表示第一行是表頭信息,整個數據存在名爲data的變量中。另一種更方便的導入方法是利用Rstudio的功能,在workspace菜單選擇“import dataset”也是一樣的。


2 Dataframe操作
在數據導入R語言後,會以數據框(dataframe)的形式儲存。dataframe是一種R的數據格式,可以將它想象成類似統計表格,每一行都代表一個樣本點,而每一列則代表了樣本的不同屬性或特徵。初學者需要掌握的基本操作方法就是dataframe的編輯、抽取和運算。

儘管建議初學者在Excel中就把數據處理好,但有時候還是需要在R中對數據進行編輯,下面的命令可以讓你有機會修改數據並存入到新的變量newdata中:
newdata=edit(data)
另一種情況就是我們可能只關注數據的一部分,例如從原數據中抽取第20到30號樣本的Sepal.Width變量數據,因爲Sepal.Width變量是第2個變量,所以此時鍵入下面的命令即可:
newdata=data[20:30,2]
如果需要抽取所有數據的Sepal.Width變量,那麼下面兩個命令是等價的:
newdata=data[,2]
newdata=data$Sepal.Width
第三種情況是需要對數據進行一些運算,例如需要將所有樣本的Sepal.Width變量都放大10倍,我們先將原數據進行一個複製,再用$符號來提取運算對象即可:
newdata=data
newdata$Sepal.Width=newdata$Sepal.Width*10
3 描述統計
描述統計是一種從大量數據中壓縮提取信息的工具,最常用的就是summary命令,運行summary(data)得到結果如下:對於數值變量計算了五個分位點和均值,對於分類變量則計算了頻數。

也可以單獨計算Sepal.Width變量的平均值和標準差
mean(data$Sepal.Width)
sd(data$Sepal.Width)
計算分類數據Species變量的頻數表和條形圖
table(data$Species)
barplot(table(data$Species))
對於一元數值數據,繪製直方圖和箱線圖觀察其分佈是常用的方法:
hist(data$Sepal.Width)
boxplot(data$Sepal.Width)
對於二元數值數據,則可以通過散點圖來觀察規律
plot(data$Sepal.Width,Sepal.Length)
如果需要保存繪圖結果,建議使用Rstudio中的plot菜單命令,選擇save plot as image

R語言基礎入門之三:常用統計函數運算

 
在R語言中經常會用到函數,例如上節中講到的求樣本統計量就需要均值函數(mean)和標準差函數(sd)。對於二元數值數據還用到協方差(cov),對於二元分類數據則可以用交叉聯列表函數(table)。下文講述在初級統計學中最常用到的三類函數。

一、數據彙總函數
我們還是以R中自帶的iris數據爲例,輸入head(iris)你可以獲得數據的前6個樣本及對應的5個變量。取出最後兩列數據作爲講解的對象:Species表示花的種類,Petal.Width表示花瓣寬度
data=iris[,c(4,5)]
下一步我們想計算不同種類花瓣的平均寬度,可以使用tapply函數,在計算前先用attach命令將data這個數據框解包以方便直接操作其變量,而不需再用$符號。

attach(data)
tapply(X=Petal.Width,INDEX=Species,FUN=mean)
結果如下
setosa versicolor  virginica
0.246      1.326      2.026 
和tapply類似的還有sapply函數,在進一步講解前初學者還需搞清楚兩種數據表現方式,即stack(堆疊數據)和unstack(非堆疊數據),上面的data就是一個堆疊數據,每一行表示一個樣本。而非堆疊數據可以根據unstack函數轉換而來
data.unstack=unstack(data)
head(data.unstack)
你應該明白這二者之間的區別了,如果要對非堆疊數據計算不同種類花瓣的平均寬度,可以利用如下函數。
sapply(data.unstack,FUN=mean)
結果是一樣的,也就是說tapply對應於stack數據,而sapply對應於unstack數據

二、概率計算函數
如果給定一種概率分佈,通常會有四類計算問題:
  • 計算其概率密度density (d)
  • 計算其概率分佈probability(p)
  • 計算其百分位數quantile (q)
  • 隨機數模擬random (r)
記住上面四類計算對應的英文首字母,再對照下表就很容易計算各種概率問題了。

舉例來講,我們求標準正態分佈曲線下小於1的面積p(x<1),正態分佈是norm,而分佈函數是p,那麼使用pnorm(1)就得出了結果0.84;若計算扔10次硬幣實驗中有3次正面向上的概率,類似的dbinom(x=3,size=10,prob=0.5)得出0.11

三、抽樣函數
我們想從1到10中隨機抽取5個數字,那麼這樣來做:首先產生一個序列,然後用sample函數進行無放回抽取。
x=1:10
sample(x,size=5)
有放回抽取則是
sample(x,size=5,replace=T)
sample函數在建模中經常用來對樣本數據進行隨機的劃分,一部分作爲訓練數據,另一部分作爲檢驗數據。

R語言基礎入門之四:常用的統計推斷

 
通常一個研究項目能夠獲得的數據是有限的,以有限的樣本特徵來推斷總體特徵就稱爲統計推斷。推斷又可細分爲區間估計和假設檢驗,二者雖有區別,但卻是一枚硬幣的兩面,之間有着緊密的關聯。

1 對總體均值進行區間估計
假設我們從總體中抽得一個樣本,希望根據樣本均值判斷總體均值的置信區間,如下例所示:
x=rnorm(50,mean=10,sd=5)  #隨機生成50個均值爲10,標準差爲5的隨機數爲作爲研究對象
mean(x)-qt(0.975,49)*sd(x)/sqrt(50)  #根據統計學區間估計公式,得到95%置信度下的區間下界
mean(x)+qt(0.975,49)*sd(x)/sqrt(50)  #95%置信度下的區間上界
也可以直接利用R語言內置函數t.test
t.test(x,conf.level=0.95)
從如下結果可得95%置信區間爲(9.56,12.36)
One Sample t-test
data:  x
t = 15.7301, df = 49, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
  9.563346 12.364729
sample estimates:
mean of x
 10.96404 
2 對總體均值進行假設檢驗
還是以上面的X數據作爲對象,來檢驗總體均值是否爲10
t.test(x,mu=10,alternative='two.sided')  #這裏的原假設是總體均值(mu)爲10,使用雙側檢驗,得到P值爲0.17,可見P值不夠小,不能夠拒絕原假設。
T檢驗是極爲常用的檢驗方法,除了單樣本推斷之外,t.test命令還可以實現兩樣本推斷和配對樣本推斷。如果要對總體比率或總體方差進行推斷,可以使用prop.testvar.test

3 正態分佈檢驗
T檢驗的前提條件是總體服從正態分佈,因此我們有必要先檢驗正態性。而且在評價迴歸模型時,對殘差也需要檢驗正態性。檢驗正態性的函數是shapiro.test
shapiro.test(x)
結果所下:
Shapiro-Wilk normality test
data:  x
W = 0.9863, p-value = 0.8265
該檢驗的原假設是服從正態分佈,由P值爲0.82可判斷不能拒絕總體服從正態的假設

4 非參數檢驗
如果總體不服從正態分佈,那麼T檢驗就不再適用,此時我們可以利用非參數方法推斷中位數。wilcoxon.test函數可實現符號秩檢驗。
wilcox.test(x,conf.int=T)   #指定conf.int讓函數返回中位數的置信區間
wilcox.test(x,mu=1)  #指定mu讓函數返回中位數爲10的檢驗結果
5 獨立性檢驗(聯列表檢驗)
卡方分佈有一個重要應用就是根據樣本數據來檢驗兩個分類變量的獨立性,我們以CO2數據爲例來說明chisq.test函數的使用,help(CO2)可以瞭解更多信息。
data(CO2)   #讀入內置的數據包,其中Type和Treatmen是其中兩個分類變量。
chisq.test(table(CO2$Type,CO2$Treatment))   #使用卡方檢驗函數來檢驗這兩個因子之間是否獨立
結果顯示P值爲0.82,因此可以認爲兩因子之間獨立。在樣本較小的情況下,還可以使用fisher精確檢驗,對應的函數是fisher.test

R語言基礎入門之五:簡單線性迴歸

 
線性迴歸可能是數據分析中最爲常用的工具了,如果你認爲手上的數據存在着線性定量關係,不妨先畫個散點圖觀察一下,然後用線性迴歸加以分析。下面簡單介紹一下如何在R中進行線性迴歸。

1 迴歸建模
我們利用R語言中內置的trees數據,其中包含了Volume(體積)、Girth(樹圍)、Height(樹高)這三個變量,我們希望以體積爲因變量,樹圍爲自變量進行線性迴歸。

plot(Volume~Girth,data=trees,pch=16,col='red')
model=lm(Volume~Girth,data=trees)
abline(model,lty=2)
summary(model)
首先繪製了兩變量的散點圖,然後用lm函數建立線性迴歸模型,並將迴歸直線加在原圖上,最後用summary將模型結果進行了展示,從變量P值和F統計量可得迴歸模型是顯著的。但截距項不應該爲負數,所以也可以用下面方法將截距強制爲0。
model2=lm(Volume~Girth-1,data=trees)
2 模型診斷
在模型建立後會利用各種方式來檢驗模型的正確性,對殘差進行分析是常見的方法,下面我們來生成四種用於模型診斷的圖形。
par(mfrow=c(2,2))
plot(model)
par(mfrow=c(1,1)) 
這裏左上圖是殘差對擬合值作圖,整體呈現出一種先下降後下升的模式,顯示殘差中可能還存在未提煉出來的影響因素。右上圖殘差QQ圖,用以觀察殘差是否符合正態分佈。左下圖是標準化殘差對擬合值,用於判斷模型殘差是否等方差。右下圖是標準化殘差對槓桿值,虛線表示的cooks距離等高線。我們發現31號樣本有較大的影響。

3 變量變換
因爲31號樣本有着高影響力,爲了降低其影響,一種方法就是將變量進行開方變換來改善迴歸結果,從殘差標準誤到殘差圖,各項觀察都說明變換是有效的。
plot(sqrt(Volume)~Girth,data=trees,pch=16,col='red')
model2=lm(sqrt(Volume)~Girth,data=trees)
abline(model2,lty=2)
summary(model2)

4 模型預測
下面根據上述模型計算預測值以及置信區間,predict函數可以獲得模型的預測值,加入參數可以得到預測區間
plot(sqrt(Volume)~Girth,data=trees,pch=16,col='red')
model2=lm(sqrt(Volume)~Girth,data=trees)
data.pre=data.frame(predict(model2,interval='prediction'))
lines(data.pre$lwr~trees$Girth,col='blue',lty=2)
lines(data.pre$upr~trees$Girth,col='blue',lty=2)

我們還可以將樹圍和樹高都加入到模型中去,進行多元迴歸。如果要考慮的變量很多,可以用step函數進行變量篩選,它是以AIC作爲評價指標來判斷一個變量是否應該加入模型,建議使用這種自動判斷函數時要謹慎。對於嵌套模型,還可以使用anova建立方差分析表來比較模型。對於變量變換的形式,則可以使用MASS擴展包中的boxcox函數來進行COX變換。

R語言基礎入門之六(完):Logistic迴歸

 
讓我們用logistic迴歸來結束本系列的內容吧,本文用例來自於John Maindonald所著的《Data Analysis and Graphics Using R》一書,其中所用的數據集是anesthetic,數據集來自於一組醫學數據,其中變量conc表示麻醉劑的用量,move則表示手術病人是否有所移動,而我們用nomove做爲因變量,因爲研究的重點在於conc的增加是否會使nomove的概率增加。

首先載入數據集並讀取部分文件,爲了觀察兩個變量之間關係,我們可以利cdplot函數來繪製條件密度圖.

library(DAAG)
head(anesthetic)
cdplot(factor(nomove)~conc,data=anesthetic,main='條件密度圖',ylab='病人移動',xlab='麻醉劑量')

從圖中可見,隨着麻醉劑量加大,手術病人傾向於靜止。下面利用logistic迴歸進行建模,得到intercept和conc的係數爲-6.47和5.57,由此可見麻醉劑量超過1.16(6.47/5.57)時,病人靜止概率超過50%。
anes1=glm(nomove~conc,family=binomial(link='logit'),data=anesthetic)
summary(anes1)
上面的方法是使用原始的0-1數據進行建模,即每一行數據均表示一個個體,另一種是使用匯總數據進行建模,先將原始數據按下面步驟進行彙總
anestot=aggregate(anesthetic[,c('move','nomove')],by=list(conc=anesthetic$conc),FUN=sum)
anestot$conc=as.numeric(as.character(anestot$conc))
anestot$total=apply(anestot[,c('move','nomove')],1,sum)
anestot$prop=anestot$nomove/anestot$total
得到彙總數據anestot如下所示
  conc move nomove total      prop
1  0.8    6      1     7 0.1428571
2  1.0    4      1     5 0.2000000
3  1.2    2      4     6 0.6666667
4  1.4    2      4     6 0.6666667
5  1.6    0      4     4 1.0000000
6  2.5    0      2     2 1.0000000
對於彙總數據,有兩種方法可以得到同樣的結果,一種是將兩種結果的向量合併做爲因變量,如anes2模型。另一種是將比率做爲因變量,總量做爲權重進行建模,如anes3模型。這兩種建模結果是一樣的。
anes2=glm(cbind(nomove,move)~conc,family=binomial(link='logit'),data=anestot)
anes3=glm(prop~conc,family=binomial(link='logit'),weights=total,data=anestot)
根據logistic模型,我們可以使用predict函數來預測結果,下面根據上述模型來繪圖
x=seq(from=0,to=3,length.out=30)
y=predict(anes1,data.frame(conc=x),type='response')
plot(prop~conc,pch=16,col='red',data=anestot,xlim=c(0.5,3),main='Logistic迴歸曲線圖',ylab='病人靜止概率',xlab='麻醉劑量')
lines(y~x,lty=2,col='blue')
發佈了65 篇原創文章 · 獲贊 19 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章