第十章 樣版:R 的初體驗
為了讓初學者快速進入狀況,R 官方使用手冊【An Introduction to R】提供一段樣版。簡單介紹從啟動 R,幾項簡單 的計算、繪圖,到結束 R。為了讓您認識這一份樣版,在這裡,讓我為您解說這一份樣版的全部,或是片段的對話。 樣版作者希望讀者透過【做中學】認識一些 R 環境辦得到的(doable)本事,作者強調,有些 R 的專業術語或許一開 始不熟悉,但他們保證這一份不熟悉感會很快就消失。
【建議您】這時候才安裝並且啟動 R,看看自己已經記住多少前面討論過的內容?
10.1 好整以暇 學習 R,不用急。請 R 入座、請來小老師(help.start())一起入座。端一杯咖啡。頂多再請來電子字典。
10.1.1 啟動 R
方式一:用滑鼠點一次或連續點兩次桌面上這個小圖形
方式二:點選
、 【所有程式】、【R 資料夾】 、【R 2.11.0】 。
。
10.1.2 help.start()
R 會開啟您的預設瀏覽器並且打開這一頁
這一頁讓您透過瀏覽器(諸如 IE、Firefox、Safari, Chrome、Opera)走訪 R 提供的輔助資源。如果您忘了,不急, 請再一次回顧前面的章節。
建議您,養成第一句話就是開啟【輔助系統】的好習慣,讓您好像身邊有一位助教一般地學習 R、與 R 對話。 有兩種方式開啟上述的頁面,
方式一:在主控台系統提示符號【>】之後,打入 help.start()。
方式二:點選主控台工具列之【輔助】的【Html 輔助】。
9.2 散佈圖:R 遇上平面幾何
【目標】
【程式碼】
x = rnorm(50)
y = rnorm(x)
plot(x, y)
2
10.2.1 x = rnorm(50)
產生 50 筆來自標準常態分配的亂數,並且把結果放在一個叫做 x 的向量。
R 透過括號讀入完成某一項工作必須要有的資訊。
【統計知識】
亂數是隨機取得的數字。
一般被認為是研究統計理論的假數據。
您可以想像有一個叫做【分配】或是【母體】的大袋子,裡面滿滿的數字。
【產生】兩字的意思是【從袋子裡撈一些數字出來】。
現在透過 R,您不需要真正有一個這樣滿滿數字的袋子。
只要您指定袋子(比如說,現在叫【rnorm】)跟想撈幾個(比如說,現在是 50 個),透過【R 語法】 ,rnorm(50), 就可以擁有 50 個來自標準常態分配的數字。
【rnorm】這是一個 R 專用的名字。這個名字其實是由兩個部分組成的, 【r】代表【random number】 ,而【norm】 代表【normal】標準常態分配。
這一類 R 專用的名字不會跟您定義的(專用的)名字混在一塊。當出現一樣名字的時候,R 會適時地提醒您。
出現這一類警告時,建議您改名字,意思是,把混用的名字改掉,通常把其中一個英文字母改成大寫即可。注 意:R 會分辨英文字母的大小寫。
【建議您】
學習 R 的任何一刻,只要您有機會面對 R 的主控台,就像您面對一個人一樣地對待 R,這樣您會學得很快。 經驗告訴我:學習與機器對話,剪貼別人的話就跟學數學只會代公式一樣。終究只能應付,無法升級。
我個人的習慣是像上面的那一句話之後,我會把等號左邊的物件名稱(x)再一次鍵入(x 加上 Enter 鍵),這樣 的一句話,R 會把該物件所代表的資訊列印在螢幕上。
我會發現向量 x 是由以下這 50 個來自標準常態分配的亂數所組成。
10.2.2 y = rnorm(x)
一樣,只是這時候取名為 y。括號內放置 x,是因為想得到跟向量 x 一樣多筆的亂數。
這兩個向量被用來形成 50 個二維平面上的點。
第一個點的 x 軸座標是向量 x 的第一個數字,而 y 軸座標則是向量 y 的第一個數字;接著第二個點的 x 軸座標 是向量 x 的第二個數字,而 y 軸座標則是向量 y 的第二個數字;以此類推。
同樣地,我也想知道向量 y 是哪 50 個標準常態(分配的)亂數所組成。
3
您可能無法短時間消化這麼多個這麼多位小數的數字,更別說要把它們一對一地形成 50 個二維平面上的點。 記得高中老師教過您,關於解決幾何困境第一件事就是畫一張圖,透過圖形介面促進思考進而解決疑惑。如果 只在二維平面上打點(把點標出來),統計學家叫這樣的一張圖為【散佈圖】。
10.2.3 plot(x, y)
在二維平面上把這 50 點打出來。
R 會自動跳出【圖形視窗,graphic window】 。
現在括號內出現剛剛定義完成的向量 x 跟 y,x 在前 y 在後,並且用【,】號分開,表示我們想要畫一張用向量 x 定義 x 座標、用向量 y 定義 y 座標的散佈圖。
當然您可以這樣講、這樣寫 plot(y, x)。或是 plot(x, x)。多方嘗試是熟悉 R 的不二法門。
結果大致如下:(發現老師為什麼用【大致】這樣的字眼嗎?)
10.2.4 ls()
工作空間內有那些物件。照說現在只有 x 跟 y。
向量 x 跟 y 有一個一般的稱呼,物件。
在 R 裏頭,執行特定工作的物件,我們叫做函式(function)。如 rnorm, plot, ls 等等。
【工作空間】的意思,請看下回分解! 4
【ls】代表哪一個或是哪幾個英文字呢?
您可以透過 help.start()這一句話在瀏覽器打開的那一頁,看看能不能找到相關的資訊。進入 R 的搜尋引擎:(點 哪裡?)
【建議您】
教學時我總是不斷提醒學生練習用舊知識建構新知識。在這樣的思維底下,往後這一本小冊子會不斷出現 與【Q&A】有關的問句。
(點哪裡?)就是其中一句。請跟同學討論答案,以及他們探索答案、最後得到答案的歷程。
在對話框輸入【ls】瀏覽器會會您翻到下一頁。因為【ls】確定是一個 R 合法存在的物件,所以對話框後面的 選項只留下【Object names】。
得到的回應是
您會發現最後一個就是我們要的。(您應該很開心!)接下來點選畫面中最後一筆連接:
5
所以答案是【list】。
【建議您】
研究一下老師找答案的過程。您是不是有其他更有效率的過程?
10.2.5 rm(x, y)
清除不再用得到的物件。
【討論區】rm,這個名字是哪幾個英文字的縮寫?
再一次 ls()
10.3 R 遇上迴歸分析
【目標】
【程式碼】
plot(x, y)
lines(x, lrf$y)
abline(0, 1, lty = 3)
abline(coef(fm))
abline(coef(fm1), col = "red")
plot(fitted(fm), resid(fm), xlab="Fitted values", ylab="Residuals", main="Residuals vs Fitted")
qqnorm(resid(fm), main="Residuals Rankit Plot") 6
第 10.2 節利用 rnorm 產生兩個長度一樣的向量,接著利用它們定義 50 個二維平面上的點,畫了一張這些點的散佈 圖(plot),看看工作空間內有甚麼物件(ls),最後把這兩個下一段再也用不到的物件刪除(rm)。接下來,這一節將為您 示範幾項與【迴歸建模】有關的物件與函式。
10.3.1 x = 1:20
x 是一個把數字 1,2,3,…,20 按順序排列的向量。
10.3.2 w = 1 + sqrt(x)/2
把 x 的每一個數字開根號除以 2 再加上 1,結果按順序排列後定義向量 w。
這一個向量 w,樣版作者試圖拿它來加權【迴歸誤差的標準差】。
10.3.3 dummy = data.frame(x = x, y = x+rnorm(x)*w)
經常性地分析【與 R 的對話】,有助於加速學習。
先從等號的右邊第一個字開始,data.frame。為什是它呢?如果某個概念必須用多個英文表達,R 習慣上用【.】 把這些字串起來。雖然有時候會採用縮寫的作法。因此,R 這時候想要表達的概念是 data frame。Data frame 就是我們常在統計學教科書看到的滿滿好幾行、好幾列數據的【表】 。這本小冊子從此以後,稱呼這樣的表格 為【數據表】 。
因為 R 源自於 S,所以這一類關於命名的習慣完全繼承 S 的作法。
近似 data.frame 的概念,我們已經見過 vector(向量)。
括號內有一個【,】號表示我們希望建立的數據表只有兩行。
第一行叫做 x,而且擺入之前定義好的向量 x。
第二行叫做 y,擺入 x+rnorm(x)*w 的結果。接著分析 x+rnorm(x)*w。
之前我們已經學過 rnorm(x),它會得到與向量 x 一樣長度的向量,組成分子是一些來自標準常態亂數。
符號【+】跟【*】分別是 R 裏頭的加法跟乘法。
所以,x+rnorm(x)*w 意思是先是產生一個與向量 x 同樣長度、標準常態亂數構成的向量,再【按順序】乘以向 量 w,最後【按順序】加上向量 x。
【按順序】的意思是【第一個乘以第一個;第二個乘以第二個;…;以此類推】。
最後把結果的數據表取名為 dummy。 【=】在這裡有命名的意思,也有指定的味道。因為 dummy 第一次出現, 所以命名的味道比較濃。
dummy 長甚麼樣子?
7
10.3.4 dummy
10.3.5 fm = lm(y~x, data = dummy)
取數據表 dummy 的兩行,x 跟 y,然後利用最小平方法估計 y=a+bx 中的 a 跟 b。
R 裏頭執行這一項工作的函式不只一個,lm 是其他最有名的。
這樣的工作,我們叫做【迴歸建模】 。
【lm】代表【linear model】的意思。(試著用 R 搜尋引擎確定老師沒說錯!)
工作結束之後,把整個建模的成果命名為 fm 存下來。
10.3.6 summary(fm)
【summary】是摘要的意思。現在我們不需要知道統計學家如何摘要建模的成果。不過我們可以確定 R 知道。
所以,我們把物件 fm 丟給 summary。擺入括號內就行。
結果如下,先看看豬走路:
8
10.3.7 fm1 = lm(y~x, data = dummy, weight = 1/w^2)
跟之前想估計 a 跟 b,只是這時候想利用標準差的資訊進行所謂的【加權最小平方法】 。
所以我們多寫了這一段 weight = 1/w^2,等號左邊的名字 weight 是 R 用來指定權重,等號右邊寫下權重的樣子, 1/w^2,w 的平方分之一。
一樣把結果存起來,命名為 fm1。
10.3.8 summary(fm1)
摘要的結果如下:(請比較前後兩個大摘要。)
10.3.9 attach(dummy)
這一句話的效果請看:
9
10.3.10 開始繪圖…
lrf = lowess(x, y)
plot(x, y)
lines(x, lrf$y)
abline(0, 1, lty = 3)
abline(coef(fm))
abline(coef(fm1), col = "red")
請討論。
哪一條線是哪一句話R的回應?
【lines】
【abline】
【lty】
【coef】
【col】
【$】
以上這幾個字可能代表甚麼意思?
接下來,樣版作者示範一些跟【迴歸診斷】有關的動作。
10.3.11 迴歸診斷繪圖…
detach()
plot(fitted(fm), resid(fm), xlab="Fitted values", ylab="Residuals", main="Residuals vs Fitted")
qqnorm(resid(fm), main="Residuals Rankit Plot")
10
rm(fm, fm1, lrf, x, dummy)
清乾淨,準備下一段。
10.4 R 遇上實驗數據
【目標】
【程式碼】
plot(Speed~Run+Expt, main="Speed of Light Data", xlab="Factor Level")
這一段分析一組探討光速的實驗數據。
11
10.4.1 找到數據
filepath <- system.file("data", "morley.tab" , package="datasets")
filepath
file.show(filepath)
請看這三句話的效果:
10.4.2 mm = read.table(filepath)
mm
通常進一步分析數據之前,我們會計算一些關於數據的摘要統計量(基本上是數據的基本資料)。
記得在第二段,我們認識了【summary】這一個函式,當時它幫我們摘要【迴歸建模】的結果。現在同樣也是 想要知道 mm 這一個物件的摘要資訊,可不可以蕭規曹隨,把物件 mm 丟給 summary 呢?請看
12
可以。
我們之所以可以這樣用的原因是,R 提供的程式環境是一種所謂的【物件導向】環境。物件導向的環境讓您針 對不同物件提供【摘要】功能,但不需要給不一樣的名字,R 會根據繼承的程式設計原理抓到正確的【摘要】 方法。summary 只是一個例子,已經遇過的 plot,也一樣有這樣的本事。
從上面的圖片,可以發現 mm 有三個變數,分別是 Expt, Run, Speed。因為目前它們都是數值型數據(numeric), 所以 R 給我們每一個變數的【六數摘要】。
【六數摘要】包括【最小值】 、【】、 【中位數】、【平均】、【】、 【最大值】。
10.4.3 mm$Expt = factor(mm$Expt); mm$Run = factor(mm$Run)
當您發現同樣的名字出現在等號的左右邊,表示程式作者希望把改變後的結果【回存】 ,這樣子先前該物件的 資訊就被【更新】了。
在前面的橋段,我們已經學過【$】。它的意思就是中文的【的】。
【factor】是一種統計術語,中文叫做【因子】。本質上是變數,是【(統計)實驗設計】的專業術語。
當整數型數字變成因子型數字,同樣的數字,但是本質已經不一樣。整數型數字的本質是數字,而因子型數字 的本質則是代號。
我們可以透過【class】知道某一個物件的本質。請看:
因為樣版作者後來要對【Morley】數據進行【變異數分析】 ,所以必須在那之前把整數型數字變成因子型數字。 【變異數分析】主要探討一種多個母體平均不完全相等的研究假設。關於變異數分析與實驗設計理論請參考作 者的其他著作。
改變後,再確定一下:
13
10.4.4 attach(mm)
再看一次【attach】的效果。
【比較一下】整數型的【Run】跟因子型的【Run】 ,R如何表達兩者之間的不一樣?【提示】您曾經學過哪一 招可以知道物件內含的實質內容?
10.4.5 繪製變異數分析圖
plot(Expt, Speed, main="Speed of Light Data", xlab="Experiment No.")
先看結果:
【main】做甚麼用?
【xlab】做甚麼用?
【您看到甚麼?】畫面上出現5個【盒形圖】 。一般,如果盒形圖高高低低,我們會懷疑多個母體平均全相 等的正確性。
出現5個,代表變數【Expt】有5個水準(由5個符號所定義,像這個例子是1,2,3,4,5這五個符號)。
【嘗試一下這一招】plot(Speed~Run+Expt, main="Speed of Light Data", xlab="Factor Level")
14
【請討論】您這一回得到甚麼樣的新經驗?
10.4.6 fm <- aov(Speed ~ Run + Expt, data=mm)
【aov】是R用來進行變異數分析的函式,它的用法接近之前介紹過的【lm】 。
【Speed ~ Run + Expt】意味著【反應變數】是【Speed】 ,而【解釋變數】是【Run】跟【Expt】 。一般用符號【~】 書寫統計模型, 【~】的左邊放反應變數(在實驗設計領域,通常是實驗過程中測量得到的變數,或是它們的轉 換),而【~】的右邊放各式各樣的解釋變數(在實驗設計,解釋變數通常是那些實驗過程中被控制的變數,實驗 者可以更動、變換的變數,也就是那些因子)。
跟之前一樣,把分析的結果存起來,取名為【fm】 。
10.4.7 summary(fm)
摘要變異數分析的結果:
根據這一份報表的最後一行【Pr(>F)】 ,我們發現因子【Run】不顯著。所以樣版的作者在下一句話裡,把因子 【Run】從模型中移除,再重新進行一次變異數分析。請看…
10.4.8 fm0 <- update(fm, . ~ . - Run)
【update】這個字,只要您想更新統計模型都可以用,不論您在這一句話之前用甚麼樣的建模工具。
15
10.4.9 anova(fm0, fm)
比較兩個模型之間差異的顯著性:
detach()
rm(fm, fm0)
清乾淨再出發。
10.5 R 遇上等高線圖
【目標】
【程式碼】
contour(x, y, f)
contour(x, y, fa, nlevels = 15)
image(x, y, f)
image(x, y, fa)
10.5.1 x = seq(-pi, pi, len=50)
這是 x。
16
但如何清楚知道 R 為什麼給您這樣的答案?
一樣,從等號的右手邊開始。第一個您遇到的【R 名字(R 詞彙)】叫做【seq】 。它到底是甚麼用意呢?我們再一 次尋求【R 搜尋引擎】的協助,試著找到這一個物件的使用說明或是相關文件:
您可以用【help.start()】把它叫出來,輔助網頁的入口會出現在您的瀏覽器的分頁,或是出現在新的瀏覽器視 窗;您也可以直接在網頁的網址對話框輸入【http://127.0.0.1:24445/doc/html/index.html】,一樣可以開啟輔助 網頁的入口。
進入搜尋引擎的首頁,適當勾掉不必要的選項,並且在對話框輸入【seq】,用滑鼠按下【Search】,
您會看到
第三筆就是答案了。答案是【Sequence Generation】。如果英文不好,微積分也沒學好,或是沒學過微積分, 或許您可以暫時跳過【seq】 ,繼續往下探索…
接下來,第二個字是【pi】 ,念起來有沒有一種似曾相識的感覺,它就是我們計算圓形面積會用到的那個 3.14159265。
【-】結合【pi】 ,就是 【負的 3.14159265】 ,這是樣版作者給【seq】的第一個必要的資訊,接著是【正的 3.14159265】 , 第二個必要的資訊。它們都是數字。先不管【len=50】 。
試試看,其他數字會發生甚麼事?
看出來, 【seq】有甚麼用了嗎?【請討論…】
【深入了解】請建立這兩個數字 3.01336438 跟 3.14159265 的關係? 17
【再深入了解】點出【seq】的使用說明,試圖指出【len=50】的說明以及中文意思?
最後把 50 個數字所形成的向量,指定給 x。
10.5.2 y = x
複製向量 x,並且指定給 y。
10.5.3 f = outer(x, y, function(x, y) cox(y)/(1 + x^2))
第一個字【outer】 。它的英文意思是?
它的使用說明?
基本上我們可以透過以下兩道函式得知【f】的本質:
【f】是一種數值型的矩陣。如果沒學過矩陣,上 Google 或是中文維基百科找找答案…
這是【f】的片段:
18
10.5.4 oldpar = par(no.readonly = TRUE)
【par】是您的第一個字。如果您有點煩,不想找 R 搜尋引擎,這時候是您練就【忍】功的好時機。
這一句話的主要用意,把畫圖用的預設參數放在【oldpar】,之後可以恢復 R 的預設值。
也會出現顯示【圖】的視窗(視窗標題:類似 R Graphics: Device 2 (ACTIVE))。
【深入了解】 【no.readonly】是甚麼意思?【TRUE】又是甚麼意思?
10.5.5 par(pty =”s”)
【pty】是一項畫圖用的參數,現在它被設定為【s】 。
【深入了解】 【pty】是?【s】是?
10.5.6 contour(x, y, f)
先看結果:
學過微積分的讀者,見過這種圖形,這是一種【等高線圖】。
10.5.7 contour(x, y, f, nlevels = 15, add = TRUE)
再看結果:
19
【討論區】前後兩張圖之間的不一樣在哪裡?接著回答…
【深入了解】 【nlevels】跟【add】分別是甚麼意思?
10.5.8 fa = (f – t(f))/2
【討論區】這一句話到底為了哪一樁呢?請看【fa】的等高線圖。
10.5.9 contour(x, y, fa, nlevels = 15)
【討論區】您發現【fa】跟【f】的關係了嗎?
par(oldpar)
回填畫圖用的預設參數。
10.5.10 image(x, y, f)
用影像呈現等高線圖。結果如下:
20
10.5.10 image(x, y, fa)
一樣,只是這一回想要呈現矩陣【fa】的,而不是【f】的等高線圖。
objects()
這一道函式,老師第一次使用的經驗,好像跟【ls】一樣,請問它們之間的不一樣在哪裡?
rm(x, y, f, fa)
清乾淨再出發。
10.6 R 遇上複數
【目標】
【程式碼】
plot(z, type=”l”)
plot(w, xlim=c(-1,1), ylim=c(-1,1), pch=”+”, xlab=”x”, ylab=”y”)
lines(z)
plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+", xlab="x", ylab="y")
lines(z)
這一段樣版作者試圖呈現 R 一些關於複數的運算。 21
th = seq(-pi, pi, len=100)
z = exp(1i*th)
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)
【兩張圖肩並肩】這種肩並肩的作法,R提供嗎?
rm(th, w, z)
q()
【q】到底是甚麼意思?
啟動 R(Rgui.exe)會開啟【R Console】主控台視窗(或是),每一次您這麼作,R 都會顯示一段簡短的開場白。 開場白的最後一句話就是
用 'q()' 離開 R。
簡介 R 的樣版到此結束。
22
10.6 自我介紹二部曲 10.6.1 license()、licence()
10.6.2 contributors() 有哪些人為 R 作出貢獻?
23
10.6.3 citation()
10.6.4 demo()
24
【範例】
1.
demo(Hershey)
25
2.
demo(Japanese)
26
3.
demo(graphics)
4.
demo(image)
27
5.
demo(persp)
6.
demo(plotmath)
28
7.
demo(intervals)
29
8.
demo(lattice)
9.
demo(labels)
30
10. demo(panel)
10.6.5 help()
【範例】
31
10.7 建議閱讀
32