歡迎點擊藍色字關注我喲~
內容提要
什麼是正態分布
如何產生服從正態分布的R數據
如何用R畫正態分布圖
正態分布曲線圖
正態分布曲線+直方圖
給正態分布圖填充顏色
對正態分布圖的特定區域填色
什麼是正態分布?正態分布由以下概率密度函數定義,其中μ是總體均值,σ2是方差。
如果隨機變量X服從正態分布,則記作:。
當μ=0,σ=1時的正態分布,稱為標準正態分布,記作:N(0,1)。標準正態分布圖如下:
圖 1. 標準正態分布圖
(用curve函數繪製)
標準正態分布圖代碼如下:
x <- seq(from=-5, to=5, by=.1)curve(dnorm(x, mean=0, sd=1), col="violet", xlim=c(-5,5), lwd=2, main="standard normal distribution", sub="curve() function")代碼分析:
首先,同樣需要構造x值,採用seq()函數,從-5至5,增量為0.1。
其次,繪圖採用curve函數。當然用plot函數繪製更方便,讓參數type="l"即可。
也許你會問,curve函數和plot函數有什麼區別呢?curve函數的y值需要提供表達式(expression,簡寫為expr),如dnorm(....),而不像plot直接給出y變量,如plot(x, y, type="l")。
另外正態分布很重要,在假設、公式推導、生活中經常會用到。還記得《機器學習》中線性回歸的概率解釋嗎?其中提到誤差項ε(i)服從正態分布(或高斯分布),有同學問為什麼誤差項服從正態分布,有個很重要的定理就是中心極限定理:當樣本數量n接近無窮大時,具有均值為μ和方差σ2總體的群體接近均值為μ和方差為σ2/n的正態分布。(which states that the population of all possible samples of size n from a population with mean μ and variance σ2 approaches a normal distribution with mean μ and σ2∕n when n approaches infinity.)
如何產生服從正態分布的R數據?R對每種分布函數(如二項式分布、超幾何分布、泊松分布等)都有4個不同的函數功能,包括概率密度函數、累積分布函數、分位數函數、隨機數函數,分別用小寫字母d、p、q和r表示。
對於正態分布而言,它的4個構造正態分布的函數為:dnorm、pnorm、qnorm、rnorm,其對應含義見表1。
表 1. 分布函數d、p、q和r的意義
同理,如果對於二項式分布,這些函數是pbinom、qbinom、dbinom以及rbinom。
使用方法:
dnorm(x, mean = 0, sd = 1, log = FALSE)
pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)rnorm(n, mean = 0, sd = 1)
*註:pnorm(q)、qnorm(p)沒有寫錯,R官方說明文檔對p、q的解釋如下:
x, q: vector of quantiles.
p: vector of probabilities.
累積分布函數(pnorm)輸入的是分位數,而分位函數輸入的是概率。
上述函數的參數說明:
那麼dnorm(密度函數)、pnorm(分布函數)、qnorm(分位數函數)與rnorm(隨機數函數)的區別是什麼?
dnorm():
對於給定的平均值和標準偏差,返回每個點處的概率分布的高度。
rnorm():
將樣本大小作為輸入並生成服從正態分布的隨機數。
pnorm():
累積分布函數(簡稱為「分布函數」)是概率密度函數的積分,其定義為:對任一隨機變量X,對於任意給定值a,所有小於a的X出現的概率和,就是隨機變量X的分布函數。
pnorm根據輸入值計算相應的累積概率,y軸表示概率。可以通過下圖形象的表示為在x點左側事件發生的總和。通常累積分布函數用大寫CDF或c.d.f表示。之所以用p表示,是因為函數返回概率值(probability)。
qnorm():
分位數函數是累積分布函數的反函數,表示給定概率值,計算獲得概率和為p的隨機變量上限。其自變量(概率值)在0到1之間取值。
圖 2. 累積分布函數與分位數函數的比較
(圖片來自https://www.face2ai.com/Math-Probability-3-3-Cumulative-Distribution-Function/)
在圖2中,左圖表示累積分布函數,X1對應的值為概率之和p。右圖表示分位數函數,p對應的X1值,即概率和為p的隨機變量上限。
如下面代碼所示:
# 累積分布函數返回值為概率# 表示小於等於1.2的點的概率之和 > pnorm(1.2, 0, 1)[1] 0.8849303> qnorm(0.89, 0, 1)[1] 1.226528 # 分位數函數輸入值為概率,返回值為分位數,# 表示概率和為0.89的隨機變量上限為了將4種函數結果可視化如下:
圖 3 dnorm、pnorm、qnorm與rnorm函數的比較
代碼如下:
op <- par(mfrow = c(2, 2))
x <- seq(from=1, to=100, by=2)density <- dnorm(x, mean(x), sd(x))plot(x, density, pch=19, xlab="x", ylab="Density", col="dark green", main="dnorm: density function", mgp = c(2, 1, 0))
x <- seq(from=1, to=100, by=2)cumulative <- pnorm(x, mean(x), sd(x))plot(x, cumulative, pch=19, xlab="x", ylab="Cumulative Probability", col="dark green", main="pnorm: distribution function", mgp = c(2, 1, 0))
probability <- cumulativequantile <- qnorm(probability, mean(probability), sd(probability))plot(probability, quantile, pch=19, col="dark green", xlab="Cumulative Probability", ylab="Quantile", main="qnorm: quantile function", mgp = c(2, 1, 0))
x <- rnorm(100)hist(x, prob=TRUE, col="dark green", xlab="random number", main="rnorm: random draws from Std Normal", mgp = c(2, 1, 0))
par(op)補充:
參數mgp表示邊距線,即坐標軸名稱、標籤與坐標軸的邊距線。默認為c(3, 1, 0)。因為剛開始畫圖的時候發現沒有x軸名稱,原因是x軸名稱與x軸相距較遠,已經出畫圖邊界了,採用默認的c(3,1,0),所以調整為c(2,1,0)。
如何用R畫正態分布圖?用R畫正態分布圖,最基本的就是用plot、curve或lines函數繪製。代碼及繪圖結果請參考圖1。
如果想繪製正態分布曲線+直方圖這種形式,需要同一張圖上分別繪製曲線圖和直方圖。
其中,直方圖用hist()函數繪製,hist是histogram直方圖的簡寫。hist函數只需提供x值即可。另外,選擇參數probability = TRUE,表示其縱坐標為概率密度表示而不是頻率(frequency)。
曲線可以用curve或lines()函數繪製,圖3採用lines()函數繪製。另外提示,如果在直方圖存在的情況下用curve畫正態分布曲線,需要添加curve(add = TRUE)的參數,表示在已存在的圖形上添加曲線。
圖 4. 正態分布直方圖+曲線圖
參考代碼如下:
x1 <- rnorm(1000, mean=10, sd=0.2)
# 先用hist()函數畫直方圖,probability=TRUE表示y軸用密度表示hist(x1, probability=TRUE, col="grey")
# x2的序列長度為100,即100個數值,從x1最小值只x1最大值x2 <- seq(min(x1), max(x1), length.out=100)y <- dnorm(x2, mean=10, sd=0.2)# 用lines()函數添加正態分布曲線lines(x2, y, col="dark green", lwd=2)由於R的plot函數只能畫線不能填充顏色,polygon()函數中的col參數可以填充多邊形的顏色。
因此,對於正態分布圖的填色建議使用ggplot2,其中的geom_area()函數可以完成填色需求,具體方法及代碼請參考上期文章如何用R給曲線填充顏色?,因此本次不再贅述。
圖 5. 用ggplot2給正態分布曲線填充顏色
給正態分布曲線的某一區域填色,就需要用到前面提到的polygon()多邊形函數了。其中,x、y分別表示多邊形頂點的坐標,另外x與y的向量長度必須相等。
首先,需要繪製正態分布曲線,可以用plot繪製,也可以用lines函數繪製。如果用lines函數,需要先將plot函數中的繪圖功能取消,即type="n"。type="n"的具體解釋請參看文章R語言plot函數中參數type="n"是什麼意思?,此處不再贅述。
其次,在正態分布曲線繪製完成後,利用polygon多邊形函數填充某一區域顏色。
最後添加x坐標軸以及其他文字說明。繪製結果如下:
圖 6. 正態分布某一區域填充顏色
代碼如下:
x <- seq(from=1, to=100, by=2)y <- dnorm(x, mean(x), sd(x))plot(x, y, type="l", axes=FALSE, xlab="score", ylab="", main="normal distribution")
i <- x >= 33 & x <= 71polygon(c(33,x[i],71), c(0,y[i],0), col="pink")axis(1, at=seq(0, 100, 20))area <- pnorm(71, mean(x), sd(x)) - pnorm(33, mean(x), sd(x))result <- paste("P(",33,"< score <", 71, ") =", signif(area, digits=3))mtext(result, 3)補充:
1、plot沒有畫坐標軸,參數為axes=FALSE。
2、為什麼polygon函數中x、y的向量是3個數值?
polygon(c(33,x[i],71), c(0,y[i],0), col="pink")
x取3個點,點分別位於x軸上、曲線上、x軸上;y取相應的3個值,分別是0、曲線上點對應的y值、0。y=0是因為點位於x軸上。
3個點相當於畫出一個三角形,按照ploygon()函數默認的順時針方向,固定x軸的2個臨界點,以左邊臨界點對應值曲線上的點為起點,沿著曲線逐步填充顏色,至右側臨界點對應曲線上的點為終止。這也就是對變量i賦值,選擇ploygon()不斷迭代畫圖的原因。
圖 7. polygon多邊形填色分解動作
圖中A、D點分別為感興趣區域的臨界值,polygon函數默認按照順時針方向,沿著曲線,從起點A經過曲線高度值最高的B點至C點,到D點結束。
3、area計算的是什麼?
area變量表示面積,用pnorm()累積分布函數計算面積,即2個臨界值的面積之差表示多邊形的面積。
4、signif又是什麼?
signif()函數是保留有效位數的函數,其中參數digit設定保留位數。如下圖代碼所示:
# 如果a為小數,signif與round效果一致,四捨五入。> a = 0.17398> signif(a, digit=3)[1] 0.174> round(a, digit=3)[1] 0.174
# 如果b為正整數,signif將3位有效數字之後的數值改為0.> b=3127531> signif(b,digit=3)[1] 3130000> round(b,digit=3)[1] 3127531signif() vs round():
signif()強調有效位數(significant digits),而round()強調小數點後的位數(the number of decimal places)。
如果數值為正整數,有效位數後的數字均用0表示,如上述代碼所示,3127531取3位有效數字後為3130000(第3位先四捨五入),而round函數後的數字沒有變化;如果數值為小數,則signif與round都是四捨五入的意思,結果相同。
總 結本文介紹了用R繪製不同需求正態分布圖的方法,如:
正態分布曲線圖:用plot()、curve()、lines()函數;
直方圖+曲線圖:用hist() + lines()或curve()函數;
曲線與x軸之間填色:用ggplot2的geom_area()函數完成;
正態分布某一區域填色:polygon()函數填色,前提是需要先用plot()設置圖形屬性。x、y向量分別取3個點,迭代繪製。
另外,本文還介紹了R中正態分布的4個函數:密度函數dnorm、累積分布函數pnorm、分位數函數qnorm以及隨機數函數rnorm。
最後,對繪圖用到的一些函數細節進行說明,如hist(x, prob=TRUE)表示縱坐標用密度表示;對曲線多邊形填充顏色,需要polygon()函數的x、y向量分別提供3個值,並對變量i賦值在感興趣的區域內,以三角形為單位迭代填色;plot的mpg參數可以調整坐標名稱與坐標軸的距離;curve(expr)輸入值為表達式而不是y值;signif()表示有效數字,而round表示小數點後保留位數。
希望這篇文章能對大家工作學習有所啟發。如有疏漏之處,還請指正。
開心~(。◕ˇ∀ˇ◕)
補充
follow 服從,如:a random variable X follows the normal distribution,隨機變量X服從正態分布
Central Limit Theorem 中心極限定理
Probability Density Function (PDF) 概率密度函數
bell shape curve 鐘形曲線
inverse function 反函數
參考網址
http://www.r-tutor.com/elementary-statistics/probability-distributions/normal-distribution
http://www.stat.umn.edu/geyer/old/5101/rlook.html
https://www.tutorialspoint.com/r/r_normal_distribution.htm
https://mattmazur.com/2014/10/25/plotting-a-normal-distribution-with-r/
https://www.statmethods.net/advgraphs/probability.html
https://www.r-bloggers.com/normal-distribution-functions/
相關文章
筆記 | 線性回歸的概率解釋(吳恩達CS229《機器學習》lecture 3-2)
R語言plot函數中參數type="n"是什麼意思?
如何用R給曲線填充顏色?
如有問題,歡迎後臺留言討論。因水平有限,如有疏漏之處還請指正。
歡迎轉發分享朋友圈,轉載需經授權,請後臺留言備註。
版權聲明:公號千萬篇,版權第一條。轉載不規範,博主兩行淚。