ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rで確率モデル】疑似乱数の生成

昨日,名古屋に出張しました.新幹線は,コロナ前と比べればまだ空いていますが,海外の旅行者も戻ってきて,席が埋まってきたように感じます.ということで,今回は,Rで乱数を生成するコマンドの整理です.疑似乱数を使って下の図のような,中心極限定理の数値実験もやってみます.

一様乱数に従う乱数の和の分布.赤い破線は正規分布
指数分布に従う乱数の和の分布.赤い破線は正規分布

疑似乱数生成コマンドは頭文字 r

 Rで確率分布を扱うコマンド表記には基本ルールがあります.乱数を生成するときは,頭文字はrです.コマンドの頭文字は以下のルールになってます.

頭文字 意味
r 疑似乱数の生成
d 確率密度関数
p 確率分布関数
q クォンタイル関数 (確率分布関数の逆関数)

この頭文字の後に,分布を表す文字列が続きます.例えば,正規乱数を生成したいときは,正規分布を意味する文字列normの頭にrを付けて, rnormとなります.その他の分布については,以下を参考にしてください.

分布 Rでの表記 パラメタ
正規分布 norm 平均mean標準偏差sd
一様分布 unif 最小値min,最大値max
t分布 t 自由度df,非心度ncp
F分布 f 自由度df1df2
指数分布 exp イベント発生率rate
対数正規分布 lnorm 対数平均meanlog,対数標準偏差sdlog
ワイブル分布 weibull 位置location,スケールscale
カイ2乗分布 chisq 自由度df,非心ncp
ガンマ分布 gamma 形状shape,スケールscale
ベータ分布 beta 形状shape1shape2,非心ncp
コーシー分布 cauchy 位置location,スケールscale
ロジスティック分布 logis 位置location,スケールscale

 パッケージを使って利用可能になる分布もあります.パッケージを使いたいときは,Rで一度だけ,

install.packages("パッケージ名")

を実行して,パッケージをインストールしてください.実際に使うときは,Rを起動するたびに,

require(パッケージ名)

を実行してください.

 パッケージを使って利用可能な分布は以下のようなものがあります (私が知っているものだけです).

分布 Rでの表記 パッケージのインストール
安定分布 stable install.packages("stabledist")
ラプラス分布 (両側指数) dexp install.packages("nimble")
Gumbel分布 gumbel install.packages("gumbel")
フレシェ分布 frechet install.packages("VGAM")
正規分布 (逆ガウス) invgauss install.packages("statmod")
逆ガンマ分布 invgamma install.packages("invgamma")
逆カイ2乗分布 invchisq install.packages("invgamma")
逆指数分布 invexp install.packages("invgamma")

 乱数を生成するときは,上のRでの表記の前にrをつけてください.必要なパラメタは,

?コマンド

を実行して調べてください.

中心極限定理の数値

 乱数を生成して,中心極限定理を体験してみます.中心極限定理は,分散が有限な確率変数をたくさん足すと,正規分布で近似できるようになるというものです.

 ここでは,確率変数をXの独立なコピーをX_iとして,

 \displaystyle S_N = \frac{X_1 + X_2 + \cdots + X_N}{\sqrt{N}}

で計算される,S_Nの分布を描いてみます.

一様分布の和

 X[-1, 1]区間の一様乱数で,S_Nの分布を描いてみます.下の図のように,Nが増えると,正規分布 (赤破線)の確率密度関数のグラフと良く一致することが分かります.

 >

一様乱数に従う確率変数の和の確率密度関数.赤破線は正規分布のフィット.

 サンプルのRスクリプトです.

# 和をとる変数の数 (Nの値を増やしてみてください)
N <- 1
###################
# 繰り返し回数
N.rep <- 10000
###
x.means <- c()
for(i in 1:N.rep){ # 繰り返し
###################
# 一様乱数(-1, 1)
# (この部分の分布を替えて実験してみてください)
x <- runif(N,-1, 1)
x.means[i] <- sum(x)/sqrt(N)
} # 繰り返し終わり
###################
# xの平均値x.meansの分布
hist(x.means,probability=TRUE,breaks="FD",main=paste("Sum of",N,"variables"),border=4,col=4)
# 正規分布の当てはめ
mu.est <- mean(x.means)
sig.est <- sd(x.means)
curve(dnorm(x,mu.est,sig.est),col=2,add=TRUE,lwd=2,lty=2)

ガンマ分布の和

 次は,非対称なガンマ分布 (shape=2.5)で実験した結果です.上のRスクリプトrunif(N,-1, 1)の部分を,rgamma(N,shape=2.5)に変更しました.この例でも,下の図のように,Nが増えると,正規分布 (赤破線)の確率密度関数のグラフと良く一致することが分かります.

ガンマ分布に従う確率変数の和の確率密度関数.赤破線は正規分布のフィット.

コーシー分布の和

 コーシー分布は,超裾の厚い分布です.下の図のようにコーシー分布に従う乱数の和をとっても,正規分布に近づく傾向はみられません.理由を考えてみてください.ヒントはレヴィーの安定分布です.

コーシー分布に従う確率変数の和の確率密度関数.赤破線は正規分布のフィット.