這裡介紹如何在 R 中的使用各種機率分佈以及基本模型配適方法。
資料的基本統計量以及各種圖形對於資料的了解有很大的幫助,但這兩種方式在資料比較複雜的狀況下會有些問題,例如當變數的數量很多時,基本的統計量無法呈現資料的詳細分布狀況,而太多的圖形則會使人難以理解,另外也無法對於未來的資料做預測。
如果我們對於資料的結構與特性有足夠的了解,就可以使用適當的統計模型來配適資料,並且使用配適出來的模型進行資料的預測,而在進行模型配適之前,我們必須先對基本的隨機變數與機率分佈有所認識。
隨機變數
隨機變數對於許多的應用來說都是很重要的,R 中也內建非常多的隨機變數產生函數,可以生成各種分佈的隨機變數。
sample
函數
sample
是一個用來產生隨機變數的函數,但是它的使用方式比較特殊。如果只指定單一個整數的參數 n
,它會傳回從 1
到 n
的隨機排列組合:
sample(6)
[1] 3 4 2 5 1 6
如果指定兩個整數參數 n
與 m
,則會產生 m
個介於 1
到 n
的隨機整數:
sample(6, 3)
[1] 3 4 2
在預設的狀況下,sample
會以取後不放回的方式產生隨機變數,所以每一個產生的數字都會不同,若要以後放回的方式產生隨機變數,可以加上 replace = TRUE
參數:
sample(6, 8, replace = TRUE)
[1] 2 6 1 2 2 5 2 1
sample
最常被使用的功能就是隨機抽樣,它可以從既有的向量中隨機取出樣本:
x <- c(1.2, 4.5, 6.3, 9.1, 4.6, 8.4, 5.9, 1.8) sample(x, 5)
[1] 4.6 4.5 1.8 6.3 5.9
除了數值資料外,其他各種的向量也都可以使用 sample
來做隨機抽樣。我們以內建的 letters
做示範,這個內建的向量中包含 26 個英文字母,若要從中隨機取出 5 個英文字母,可以使用 sample
函數來處理:
sample(letters, 5)
[1] "r" "i" "x" "o" "p"
sample
在隨機取樣時,也可以使用 prob
參數指定每個元素的權重:
weights <- c(1, 1, 2, 3, 5, 8, 13, 21, 8, 3, 1, 1) sample(month.abb, 3, prob = weights)
[1] "Aug" "May" "Jul"
機率分佈
R 可以產生數十種分佈的隨機變數,一般常見的隨機分佈 R 都有支援,我們可以查詢 distribution
的線上說明文件:
?distribution
另外在 R 的官方網站上也有很詳盡的說明。
大部分 R 的隨機變數產生函數都會以 r
字母開頭(r
代表隨機變數產生器 ,random number generator),然後加上分佈的名稱來作為函數的名稱,例如 runif
就是產生均勻分佈(uniform distribution)隨機變數的函數,而 rnorm
函數則會產生常態分佈(normal distribution)的隨機變數。通常這類產生隨機變數的函數,其第一個參數是指定要產生的隨機變數數量,而後續的參數則是各分佈的參數,例如產生五個介於 0
與 1
的均勻分佈隨機變數:
runif(5)
[1] 0.9228195 0.8629326 0.2507834 0.7132745 0.7286481
產生五個介於 2
與 10
的均勻分佈隨機變數:
runif(5, 2, 10)
[1] 4.601491 8.254266 8.853793 3.272245 5.628698
產生五個標準常態分佈的隨機變數:
rnorm(5)
[1] 0.9256513 -1.7038184 1.1460961 -1.2906661 -0.1514443
產生五個平均值為 3
,標準差為 8
的常態分佈隨機變數:
rnorm(5, 3, 8)
[1] -2.459081 -5.538817 -6.284891 4.256028 6.398596
偽隨機變數產生器
R 的隨機變數生成跟一般的軟體一樣都是使用偽隨機(pseudorandom)的方式,R 支援好幾種隨機變數產生方法(包含平行化的隨機變數產生),詳細說明可以參考 RNG
的線上說明:
?RNG
若需要其他不同的隨機變數產生演算法,可以參考 R 的官方網站。
若要查詢目前所使用的隨機變數產生方法,可以使用 RNGkind
函數查詢:
RNGkind()
[1] "Mersenne-Twister" "Inversion"
隨機變數產生器在產生隨機變數時,都會需要指定一個亂數種子(random seed),使用同樣的亂數種子就可以產生一樣的隨機亂數,在 R 中我們可以使用 set.seed
函數來指定亂數種子:
set.seed(1) runif(5)
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
set.seed(1) runif(5)
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
set.seed
所接受的參數是一個正整數,至於該正整數的數值是多少並不重要,重點只在於使用同樣的亂數種子就可以產生相同的亂數,確保程式每次執行的結果都會相同,這個技巧在程式的開發與驗證上相當重要。
機率分佈
除了隨機變數的生成之外,對於大部分的機率分佈 R 同時也提供一系列的機率相關函數,例如機率密度函數(probability density function,簡稱 PDF)、累積密度函數(cumulative density
function,簡稱 CDF)以及 CDF 的反函數,這些函數的命名規則跟產生隨機變數的函數類似:
r
開頭:產生隨機變數,例如rnorm
。d
開頭:機率密度函數,例如dnorm
。p
開頭:累積密度函數,例如pnorm
。q
開頭:CDF 的反函數,例如qnorm
。
繼續閱讀: 12