1. 程式人生 > >如何用R語言抽取出服從一般分佈的樣本

如何用R語言抽取出服從一般分佈的樣本

在實際情況中,我們經常會遇到要求生成服從某一分佈的隨機數的問題,下面我們就用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中被定義過,是一個一般的分佈,應該如何抽樣呢?

下面就介紹如何抽取服從一般分佈的樣本。
先給定一個分佈的分佈函式:

F(x)=0x21x<00x<1x1

這是一個連續型分佈函式。

求出逆函式為:

F1(x)=x0x1

於是從該連續型分佈中抽取樣本的R程式碼如下:

> inv_F <- function(x) {
+ F <- sqrt(x)
+ return(F)
+ }
> x <- runif(10000)
> sam <- sapply(x,inv_F)
> plot(sam)

影象如下:
這裡寫圖片描述
從影象可以看出抽取的樣本服從該分佈。

下面介紹抽取服從離散型分佈的樣本:
分佈函式為:

F(x)=00.250.50.751x<66x<55x<33x<1x1

求出逆函式為:

F1(x)=65310x0.250.25<x0.50.5<x0.750.75<x1

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

從結果可以看出抽取的樣本服從該分佈。

最後介紹抽取服從奇異型分佈的樣本:
分佈函式為:

F(x)=00.1250.250.3750.5112e(x+1)x<66x<55x<33x<22x<1x1

逆函式為:

F1(x)=65321ln(22x)0x0.1250.125<x0.250.25<x0.3750.275<x0.5x>0.5

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)

影象如下:

這裡寫圖片描述

從影象和輸出結果可以看出抽取的樣本服從該分佈。