Rの確率分布システム
かって統計の本には必ず付いていた数表はもはや必要ない。R 自身がオンライン数表である。
R における確率分布関係関数は次のような統一的命名規則を持つ。つまり、分布名を xxx とすると
| dxxx | 密度関数(離散分布なら確率関数)の値 | 
| pxxx | は累積確率分布関数値 P[X <= x] もしくは P[X > x] | 
| qxxx | クォンタイル値(確率 q に対する P[X <=x]=q または P[X > x]=q となる x の値) | 
| rxxx | (疑似)乱数 | 
例として正規分布を例にあげると
| dnorm(x, mean=0, sd=1, log = FALSE) | 
| pnorm(q, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE) | 
| qnorm(p, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE) | 
| rnorm(n, mean=0, sd=1) | 
ここで引数の意味は
| x | 密度関数を求める位置(のベクトル) | 
| q | 確率分布関数を求める位置(のベクトル) | 
| p | クォンタイル値を求める確率(のベクトル) | 
| n | 発生すべき乱数の数 | 
(分布毎に異なる)パラメータ引数
| mean | 平均(のベクトル) | 既定値は 0 | 
| sd | 標準偏差の(ベクトル) | 既定値は 1 | 
その他のオプションパラメータ
| log | 論理値 | 既定値は FALSE | もし TRUE なら確率は対数値 | 
| log.p | 論理値 | 既定値は FALSE | もし TRUE なら確率は対数値 | 
| lower.tail | 論理値 | 既定値は FALSE | TRUE なら下側確率 P[X <= x]、もし FALSE なら上側確率 P[X > x] | 
貢献パッケージには多次元確率分布を含む、更に多くの関数が提供されている。
| 分布名 | R での名前 | パラメータ | 分布名 | R での名前 | パラメータ | 
| ベータ | beta | shape1, shape2, ncp | 2項 | binom | size, prob | 
| コーシー | cauchy | location, scale | カイ自乗 | chisq | df, ncp | 
| 指数 | exp | rate | F | f | df1, df1, ncp | 
| ガンマ | gamma | shape, scale | 幾何 | geom | prob | 
| 超幾何 | hyper | m, n, k | 対数正規 | lnorm | meanlog, sdlog | 
| ロジスティック | logis | location, scale | 多項 | multinom | n, size, prob | 
| 負の2項 | nbinom | size, prob | 正規 | norm | mean, sd | 
| ポアソン | pois | lambda | t | t | df, ncp | 
| 一様 | unif | min, max | ワイブル | weibull | shape, scale | 
| ウィルコクソン | wilcox | m, n | スチューデント化範囲(チューキー) | tukey | nmenas, df, nranges | 
(tukey 分布は ptukey と qtukey のみ)
> ?rnorm > dnorm(c(-0.7, 0.5, 1,2, 2.1)) # N(0,1) の密度関数 [1] 0.31225393 0.35206533 0.24197072 0.05399097 0.04398360 > pnorm(c(-0.7, 0.5, 1,2, 2.1)) # N(0,1) の累積確率分布 [1] 0.2419637 0.6914625 0.8413447 0.9772499 0.9821356 > qnorm((0:10)/10) # N(0,1) のクォンタイル [1] -Inf -1.2815516 -0.8416212 -0.5244005 -0.2533471 0.0000000 [7] 0.2533471 0.5244005 0.8416212 1.2815516 Inf > rnorm(10) # N(0,1) の乱数 [1] -0.68562741 1.54190545 -0.75403197 0.25997618 -0.54360004 1.11077348 [7] 0.11983464 -0.05869832 -0.21042407 0.14462494 > mean(rnorm(100, mean=1, sd=1.3)) [1] 1.026899 # 平均 1 を推定 > sd(rnorm(100, mean=1, sd=1.3)) [1] 1.253605 # 標準偏差 1.3 を推定 > pnorm(1.3, mean=1:3, sd=1:3) # (mean,sd)=(1,1),(2,2),(3,3) で計算 [1] 0.6179114 0.3631693 0.2854703 > pnorm(1.3, mean=1:3, sd=1.3) # 平均にベクトル指定 [1] 0.59125296 0.29512923 0.09548885 > pnorm(1.3, mean=1.3, sd=1:3) # 標準偏差にベクトル指定 [1] 0.5 0.5 0.5 > qnorm((0:10)/10, lower.tail=FALSE) #上側クォンタイル P[X > x]=q となる x [1] Inf 1.2815516 0.8416212 0.5244005 0.2533471 0.0000000 [7] -0.2533471 -0.5244005 -0.8416212 -1.2815516 -Inf > pnorm((0:10)/10, lower.tail=FALSE, log.p=TRUE) # log P[X <-x] [1] -0.6931472 -0.7761546 -0.8657395 -0.9621028 -1.0654340 -1.1759118 [7] -1.2937038 -1.4189678 -1.5518513 -1.6924928 -1.8410216
> x <- 1:12 > sample(x) # x のランダムな並べ変え [1] 7 3 10 12 11 1 5 8 4 2 9 6 > sample(10) # 1:10 のランダムな並べ変え [1] 4 7 1 10 6 5 9 3 2 8 > sample(x, replace = TRUE) # x からのランダムな復元抽出(つまり離散一様分布乱数) [1] 11 6 9 9 8 9 4 9 8 8 2 5 # いま風にいえばブートストラップ・サンプリング > sample(1:10, prob=1:10, replace=TRUE) # 抽出比率を指定した復元抽出(つまり離散非一様分布) [1] 9 9 7 3 7 9 7 9 6 9
 > sample(c(0, 1), 100, replace = TRUE)  # 公平なコイン投げ100回のベルヌイ試行
 [1] 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0
 [38] 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1
 [75] 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1
 > sample(c("T", "H"), 100, replace = TRUE)
 [1] "H" "T" "H" "T" "H" "H" "H" "H" "T" "T" "H" "H" "H" "H" "T" "H" "H" "H"
 [19] "H" "T" "T" "T" "T" "H" "H" "H" "H" "H" "T" "H" "T" "T" "T" "T" "T" "T"
 [37] "H" "T" "T" "H" "H" "T" "H" "T" "H" "T" "T" "H" "T" "H" "H" "H" "T" "T"
 [55] "T" "T" "T" "H" "T" "T" "H" "H" "T" "H" "T" "H" "H" "H" "H" "H" "H" "H"
 [73] "H" "H" "T" "T" "H" "H" "H" "T" "H" "H" "H" "T" "H" "H" "H" "T" "H" "T"
 [91] "H" "T" "H" "T" "H" "H" "H" "T" "T" "H"
## 単純無作為抽出のパラドックス ## n=10,000, 1000,000, 10,000,000 個の同質有限集団から100個を単純無作為抽出 ## 標本標準偏差(つまり調査精度)はほとんど同一 ## 一万個の母集団の平均情報を100個の標本で調査できるなら、 ## 一千万個の(同質)母集団の平均情報も100個の標本で十分調査できる! > y <- rnorm(10000) > y1 <- sample(y, size=100); sd(y1)/sqrt(100) [1] 0.1033224 > y <- rnorm(1000000) > y1 <- sample(y, size=100); sd(y1)/sqrt(100) [1] 0.1066535 > y <- rnorm(10000000) > y1 <- sample(y, size=100); sd(y1)/sqrt(100) [1] 0.1021400