這裡介紹如何在 R 中的使用各種機率分佈以及基本模型配適方法。

資料的基本統計量以及各種圖形對於資料的了解有很大的幫助,但這兩種方式在資料比較複雜的狀況下會有些問題,例如當變數的數量很多時,基本的統計量無法呈現資料的詳細分布狀況,而太多的圖形則會使人難以理解,另外也無法對於未來的資料做預測。


如果我們對於資料的結構與特性有足夠的了解,就可以使用適當的統計模型來配適資料,並且使用配適出來的模型進行資料的預測,而在進行模型配適之前,我們必須先對基本的隨機變數與機率分佈有所認識。

隨機變數

隨機變數對於許多的應用來說都是很重要的,R 中也內建非常多的隨機變數產生函數,可以生成各種分佈的隨機變數。

sample 函數

sample 是一個用來產生隨機變數的函數,但是它的使用方式比較特殊。如果只指定單一個整數的參數 n,它會傳回從 1n 的隨機排列組合:

sample(6)
[1] 3 4 2 5 1 6

如果指定兩個整數參數 nm,則會產生 m 個介於 1n 的隨機整數:

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)的隨機變數。通常這類產生隨機變數的函數,其第一個參數是指定要產生的隨機變數數量,而後續的參數則是各分佈的參數,例如產生五個介於 01 的均勻分佈隨機變數:

runif(5)
[1] 0.9228195 0.8629326 0.2507834 0.7132745 0.7286481

產生五個介於 210 的均勻分佈隨機變數:

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