R語言-統計分布和模擬


R語言中統計分布和模擬

前言

  很多應用都需要隨機數。像interlink connection,密碼系統、視頻游戲、人工智能、優化、問題的初始條件,金融等都需要生成隨機數。但實際上目前我們並沒有“真正”的隨機數生成器,盡管有一些偽隨機數生成器也是非常有效的。

目錄

 1. 概率統計分布概述

 2. 隨機函數模擬介紹

 3. 密度函數模擬介紹

 4. 分布函數模擬介紹

 5. 分位數函數模擬介紹

 6. 函數模擬舉例

1. 概率統計分布概述

  各種統計分布在R中的名稱,這張表取自《An Introduction to R》中概率分布一章,基本涵蓋了R中所有的概率函數。

  R給出了詳盡的統計表。R 還提供了相關函數來 計算累計概率分布函數 X <= x), 概率密度函數和分位數函數(給定 q,符合 P(X <= x) > q的最小x就是對應的分位數), 和 基於概率分布的計算機模擬。

R中的各種概率統計分布
漢文名稱 英文名稱 R對應的名字 附加參數
β分布 beta beta shape1, shape2, ncp
二項式分布 binomial binom size, prob
柯西分布 Cauchy cauchy location, scale
卡方分布 chi-squared chisq df, ncp
指數分布 exponential exp rate
F分布 F f df1, df1, ncp
Gamma(γ)分布 gamma gamma shape, scale
幾何分布 geometric geom prob
超幾何分布 hypergeometric hyper m, n, k
對數正態分布 log-normal lnorm meanlog, sdlog
Logistic分布 logistic logis location, scale
負二項式分布 negative binomial nbinom size, prob
正態分布 normal norm mean, sd
泊松分布 Poisson pois lambda
Wilcoxon分布 signed rank signrank n
t分布 Student's t t df, ncp
均勻分布 uniform unif min, max
韋伯分布 Weibull weibull shape, scale
秩和分布 Wilcoxon wilcox m, n

  概率函數介紹

  在R中各種概率函數都有統一的形式,即一套統一的 前綴+分布函數名

   d 表示密度函數(density);

   p 表示分布函數(生成相應分布的累積概率密度函數);

   q 表示分位數函數,能夠返回特定分布的分位數(quantile);

   r 表示隨機函數,生成特定分布的隨機數(random)。

  每一種分布有四個函數:d―density(密度函數),p―分布函數,q―分位數函數,r―隨機數函數。比如,正態分布的這四個函數為dnorm,pnorm,qnorm,rnorm。dnorm 表示正態分布密度函數;pnorm 表示正態分布累積概率密度函數;qnorm 表示正態分布分位數函數(即正態累積概率密度函數的逆函數);rnorm 表示正態分布隨機數。各分布后綴,前面加前綴d、p、q或r就構成函數名。

  不同的名字前綴表示不同的含義,d表示概率密度函數,p 表示 累積分布函數(cumulative distribution function,CDF),q 表 示分位函數以及 r 表示隨機模擬(random deviates)或者隨機數發生器。 dxxx 的第一個參數是xpxxx是qqxxx 是 p,和rxxx的是n(rhyperrwilcox例外,二者的參數是 nn)。偏態指數(non-centrality parameter) ncp 現在僅用於累積分布函數,大多數概率密度函數 和部分其他情況:更細節的內容可以參考幫助文檔。

  pxxx 和 qxxx 函數都有邏輯 參數 lower.taillog.pdxxx 也有一個邏輯函數 log。 它們可以用來計算所要的函數值。 例如可以通過下式計算累計(“積分的”) 風險 (hazard)函數。

	- pxxx(t, ..., lower.tail = FALSE, log.p = TRUE)

  它們也可以直接用來計算更精確的對數似然值 (dxxx(..., log = TRUE))。

  此外還有函數 ptukeyqtukey 計算 來自正態分布的樣本的標准化全距(studentized range) 的分布。

  這里是一些例子:

	> ## t分布的雙側p值
	> 2*pt(-2.43, df = 13)
	> ## F(2, 7)分布的上1%分位數
	> qf(0.99, 2, 7)

2. 隨機函數模擬介紹

  各種分布的隨機數生存函數

	rnorm(n, mean=0, sd=1)   #正態分布
	rexp(n, rate=1)   #指數
	rgamma(n, shape, rate=1, scale=1/rate)   #r 分布
	rpois(n, lambda)   #泊松
	rt(n, df, ncp)   #t 分布
	rf(n, df1, df2, ncp)   #f 分布
	rchisq(n, df, ncp=0)   #卡方分布
	rbinom(n, size, prob)   #二項分布
	rweibull(n, shape, scale=1)   #weibull 分布
	rbata(n, shape1, shape2)   #bata 分布

  均勻分布隨機數

  R語言生成均勻分布隨機數的函數是runif(),句法是:runif(n,min=0,max=1)。 n表示生成的隨機數數量,min表示均勻分布的下限,max表示均勻分布的上限;若省略參數min、max,則默認生成[0,1]上的均勻分布隨機數。

	# 例1:生成5個[0,1]的均勻分布的隨機數
	> runif(5,0,1)     
	[1] 0.5993 0.7391 0.2617 0.5077 0.7199
	# 默認生成5個[0,1]上的均勻分布隨機數
	> runif(5)         
	[1] 0.2784 0.7755 0.4107 0.8392 0.7455 
	
	# 例2:隨機產生100個均勻分布隨機數,作其概率直方圖,再添加均勻分布的密度函數線,程序如下:
	> x=runif(100) 
	> hist(x,prob=T,col=gray(.9),main="uniform on [0,1]")
	# 添加均勻分布的密度函數線
	> curve(dunif(x,0,1),add=T)  

  正態分布隨機數

  正態分布隨機數的生成函數是 rnorm() 。句法是:rnorm(n,mean=0,sd=1)。其中n表示生成的隨機數數量,mean是正態分布的均值,默認為0,sd是正態分布的標准差,默認時為1。

	# 例:隨機產生100個正態分布隨機數,作其概率直方圖,再添加正態分布的密度函數線
	
	> x=rnorm(100) 
	> hist(x,prob=T,main="normal mu=0,sigma=1") 
	> curve(dnorm(x),add=T)

  二項分布隨機數

  二項分布是指n次獨立重復貝努力試驗成功的次數的分布,每次貝努力試驗的結果只有兩個,成功和失敗,記成功的概率為p。生成二項分布隨機數的函數是:rbinom() 。句法是:rbinom(n,size,prob)。n表示生成的隨機數數量,size表示進行貝努力試驗的次數,prob表示一次貝努力試驗成功的概率。

	# 例:產生100個n為10,15,50,概率p為0.25的二項分布隨機數:
	
	> par(mfrow=c(1,3)) 
	> p=0.25 
	> for( n in c(10,20,50)) {  
		x=rbinom(100,n,p) 
	   	hist(x,prob=T,main=paste("n =",n)) 
	   	xvals=0:n 
	   	points(xvals,dbinom(xvals,n,p),type="h",lwd=3) 
	  } 
	> par(mfrow=c(1,1))

  指數分布隨機數

  R生成指數分布隨機數的函數是:rexp()。其句法是:rexp(n,lamda=1)。 n表示生成的隨機數個數,lamda=1/mean

	# 例:生成100個均值為10的指數分布隨機數
	> x=rexp(100,1/10)     
	> hist(x,prob=T,col=gray(0.9),main="均值為10的指數分布隨機數") 
	# 添加指數分布密度線
	> curve(dexp(x,1/10),add=T) 
	
	# 例:生成5個指數分布隨機數(應和下面舉例)
	> rexp(5, rate=1)
	[1] 0.6626410 1.4266883 0.2150661 1.5788140 0.4469142

3. 密度函數模擬介紹

  以指數分布(R中函數名為exp)為例進行示范

  密度函數調用形式:

	dexp(x,rate)

  參數解釋:x隨機變量,rate為指數概率密度函數的參數λ

	## 例1:繪制0到4上,參數為1的指數分布的概率密度函數圖像
	> x <- seq(0, 4, 0.5)
	> x
	[1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0
	> y <- dexp(x, rate=1)
	> y
	[1] 1.00000000 0.60653066 0.36787944 0.22313016 0.13533528
	[6] 0.08208500 0.04978707 0.03019738 0.01831564
	> plot(x,y)
	> plot(x,y,type='l')

4. 分布函數模擬介紹

  分布函數調用形式:

	pexp(x,rate, lower.tail =TRUE)

  參數解釋:x隨機變量,rate同上,參數lower.tail為一個邏輯值,TURE表示P(X ≤ x),也是默認值。

	## 例:求取上圖中x=2左側的概率密度函數曲線下方面積
	> pexp(2, rate=1)
	[1] 0.8646647

5. 分位數函數模擬介紹

  分位數函數調用形式:

	qexp(p,rate, lower.tail =True )

  參數解釋:p為概率值,其他同上

	## 例:求取參數為1的指數分布函數的85%分位數
	> qexp(0.85, rate=1)
	[1] 1.89712

6. 函數模擬舉例

  例如:指定模擬次數m=100,樣本量n=10,概率=0.25,如果要改變這些參數來重新進行模擬將會很麻煩,下面將展示如何將上面的程序形成一個模擬函數再進行模擬。

	> sim.clt <- function (m=100,n=10,p=0.25) { 
	     z = rbinom(m,n,p)                
	     x = (z-n*p)/sqrt(n*p*(1-p))         
	     hist(x,prob=T,breaks=20,main=paste("n =",n,"p =",p)) 
	     curve(dnorm(x),add=T)              
	  } 
	> sim.clt()               # 默認 m=100,n=10,p=0.25 
	> sim.clt(1000)           # 取 m=1000,n=10,p=0.25 
	> sim.clt(1000,30)        # 取 m=1000,n=30,p=0.25 
	> sim.clt(1000,30,0.5)    # 取 m=1000,n=30,p=0.5 

  模擬函數的建立方法

  若每次模擬都要編寫一個循環,非常麻煩。sim.fun()就是專門用來解決這類問題的。只需要編寫一個用來生成隨機數的函數,剩下的工作就交給sim.fun來完成。

	# m 模擬樣本次數,f需模擬的函數
	sim.fun <-function (m,f,...) { 
	    sample <-1:m 
	    for (i in 1:m) { 
	        sample[i] <-f(...) 
	     } 
	    sample 
	} 

  正態概率模擬:

  能比直方圖更好判定隨機數是否近似服從正態分布的是正態概率圖。基本思想:作實際數據的分位數與正態分布數據的分位數的散點圖,也就是作樣本分位數與理論分位數的散點圖。

  二項分布模擬:

  先編寫一個函數用來生成一個二項分布隨機的標准化值。

	> f <- function(n=10,p=0.5){s=rbinom(1,n,p); (s-n*p)/sqrt(n*p*(1-p)) }
	> xf  <- sim.fun(1000,f)       # 模擬1000個二項隨機數
	> hist(x,prob=T)

  均勻分布來模擬中心極限定理:

	> f <- function(n=10) { mean(runif(n)-1/2) / (1/sqrt(12*n)) }
	> x <- sim.fun(1000,f)        # 模擬1000個均勻隨機數
	> hist(x,prob=T) 

  正態分布:

	> f <- function(n=10,mu=0,sigma=1){ r=rnorm(n,mu,sigma); (mean(r)-mu)/(sigma/sqrt(n)) }
	
	> x <- sim.fun(1000,f)          # 模擬1000個樣本量為10的N(0,1)隨機數
	> hist(x,breaks=10,prob=T)
	
	> x <- sim.fun(1000,f,30,5,2)   # 模擬1000個樣本量為30的N(5,4)隨機數
	> hist(x,breaks=10,prob=T)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM