R Random Number Generation 乱数の作成

ゼミで特定の分布に従う乱数の作成法について勉強したので、備忘のため、記録しておく。特定のデータがあり、そのデータの分布に従ったデータを生成したいときに重宝する。

 

実際にやってみる。ある商品の希望買い取り価格調査を19名に対して行ったとして、そのデータの分布からシュミレーション用データを生成するプログラムを記す。(架空のデータです)

library(MASS) #for truehist()

#手順1:一様乱数の生成
data <- c(4000,6500,10000,7500,20000,3000,25000,1500,8000,4000,
          5000,5000,15000,4500,1500,3000,30000,6000,1500)
truehist(data,prob=FALSE) #観測データの分布
n <- 10^5
x <- runif(n) #一様乱数の生成

#手順2:対象のデータの密度分布を求める
d <- density(data,cut=0)

#手順3:観測データのクオンタイルからシュミレーションデータを生成
simx <- quantile(data,x)
truehist(simx,prob=FALSE) #生成したデータの分布

#確率密度の比較
sim.d <- density(simx,cut=0)
maxy <- max(d$y,sim.d$y)
plot(d,type="l",ylim=c(0,maxy),xlab="price",ylab="density",main=paste("確率密度の比較"))
lines(sim.d,type="l",col=2)
legend("topright", legend=c("observed", "simulated"), lty=1, col=1:2)

もともとのデータの確率密度と、生成したデータの確率密度を比較すると以下のようになる。最頻値付近は生成したデータの方がサンプル数が集中してしまうようだ。原因を考えなければいけないが、とりあえず保留。

f:id:nakhirot:20140227191226p:plain