如何用R語言抽取出服從一般分佈的樣本
阿新 • • 發佈:2019-01-01
在實際情況中,我們經常會遇到要求生成服從某一分佈的隨機數的問題,下面我們就用R來生成這樣一個樣本。
首先,我們先來看如何生成服從均勻分佈的樣本,需要用到函式runif(),程式碼如下:
> runif(5)
[1] 0.09970285 0.49268793 0.56826709 0.77191564 0.33798831
如果要生成[0, 10]上的均勻分佈,程式碼如下:
> runif(5,0,10)
[1] 9.859786 8.692407 3.417506 2.696649 8.567304
類似地,在R語言中還可以用rnorm()生成服從正態分佈的樣本,用rexp()生成服從指數分佈的樣本,用rbeta()生成服從beta分佈的樣本,相同的還有rbinom(),rcauchy(),rchisq(),rf(),rgamma,rt()等一些常見的分佈。
如果要抽樣的總體的分佈沒有在R中被定義過,是一個一般的分佈,應該如何抽樣呢?
下面就介紹如何抽取服從一般分佈的樣本。
先給定一個分佈的分佈函式:
這是一個連續型分佈函式。
求出逆函式為:
於是從該連續型分佈中抽取樣本的R程式碼如下:
> inv_F <- function(x) {
+ F <- sqrt(x)
+ return(F)
+ }
> x <- runif(10000)
> sam <- sapply(x,inv_F)
> plot(sam)
影象如下:
從影象可以看出抽取的樣本服從該分佈。
下面介紹抽取服從離散型分佈的樣本:
分佈函式為:
求出逆函式為:
R程式碼如下:
> inv_F <- function(x) {
+ if(x >= 0 && x <= 0.25)
+ F <- -6
+ else if (x > 0.25 && x <= 0.5)
+ F <- -5
+ else if(x > 0.5 && x <= 0.75)
+ F <- -3
+ else if(x > 0.75 && x <= 1)
+ F <- 1
+ return(F)
+ }
> x <- runif(10000)
> sam <- sapply(x,inv_F)
> length(which(sam==-6))/10000
[1] 0.2513
> length(which(sam==-5))/10000
[1] 0.2502
> length(which(sam==-3))/10000
[1] 0.2496
> length(which(sam==1))/10000
[1] 0.2489
從結果可以看出抽取的樣本服從該分佈。
最後介紹抽取服從奇異型分佈的樣本:
分佈函式為:
逆函式為:
R程式碼如下:
> inv_F <- function(x) {
+ if(x <= 0.125)
+ F <- -6
+ else if(x > 0.125 && x <= 0.25)
+ F <- -5
+ else if(x > 0.25 && x <= 0.375)
+ F <- -3
+ else if(x > 0.375 && x <= 0.5)
+ F <- -2
+ else if(x > 0.5)
+ F <- -1-log(2-2*x)
+ return(F)
+ }
> x <- runif(10000)
> sam <- sapply(x,inv_F)
> length(which(sam==-6))/10000
[1] 0.1225
> length(which(sam==-5))/10000
[1] 0.1272
> length(which(sam==-3))/10000
[1] 0.128
> length(which(sam==-2))/10000
[1] 0.1257
> plot(sam)
影象如下:
從影象和輸出結果可以看出抽取的樣本服從該分佈。