如何用R畫正態分布圖?

2021-02-20 月野兔的溫暖小屋

歡迎點擊藍色字關注我喲~

內容提要

什麼是正態分布

如何產生服從正態分布的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] 3127531

    signif() 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給曲線填充顏色?

如有問題,歡迎後臺留言討論。因水平有限,如有疏漏之處還請指正。

歡迎轉發分享朋友圈,轉載需經授權,請後臺留言備註。

版權聲明:公號千萬篇,版權第一條。轉載不規範,博主兩行淚。

相關焦點

  • 搞不定Alevel正態分布?一招教你拿下!
    我們就正態分布(Normal distribution)這一個知識點,對其中常考題型跟大家分析。首先我們要明確的一點是正態分布應用的前提是我們在分析連續的數據,比如人的身高,時間等。如何快速查表得到所求概率?解決這部分概率題我們要會看表,以下為總結的公式可以供大家參考。
  • 精品圖表|Excel繪製直方圖與正態分布曲線
    今日更新:Excel繪製直方圖與正態分布曲線老樣子,還是先上幾幅不同配色的圖來看一下:作圖思路先對原始的數據進行分割(組),計算每個分組的頻數與正態分布後。原始數據原始數據源如下圖所示:操作步驟Step-01對原數據進行分組,計算頻數與正態分布。
  • 南醫大教師撩衣講解走紅 學生手臂畫肌肉分布圖
    記者多方採訪發現,在教授人體解剖學的課堂上,李雷總是充滿激情,很多時候都是手舞足蹈,講到激動處,甚至還撩起衣服,在自己身體上比劃,給學生們示範如何「定位」身體裡的器官、神經、血管。  受老師的影響,李雷的一些學生也顯得有些「走火入魔」。比如,南京醫科大學2016級大一新生——沈歸紫薇,她學的是康復治療專業,正是李雷門下的學生。「她的蓋世麒麟臂 ,已經風靡朋友圈了。」
  • 數據不滿足正態分布——如何計算中位數(四分位數間距)
    大家對於四分位數間距可能會比較陌生,一般遇到數據不符合正態分布時,手足無措。今天,我們一起來看看。思考題:相信如何獲取中位數(四分位數間距),大家都學會了,那麼問題來了:如果有的雜誌要求寫成中位數(第三四分位數-第一四分位數)呢?又該如何計算,請在留言處留言。
  • 高鐵座位分布圖 、動車座位分布圖
    高鐵座位號分布圖 字母A、F代表靠窗全路所有CRH1、2、3、5型動車組的高鐵座位表,按CRH380型動車組座席號編制規則更改,即採用數字和字母組合的方式表示座席號,其中數字表示排號,字母表示座席位置。
  • 火車知識普及之——高鐵座位分布圖 、動車座位分布圖
    >車座位號分布圖_最新動車座位分布圖高鐵座位號分布圖 字母A、F代表靠窗全路所有CRH1、2、3、5型動車組的高鐵座位表,按CRH380型動車組座席號編制規則更改,即採用數字和字母組合的方式表示座席號,其中數字表示排號,字母表示座席位置。
  • vba編程,如何畫帶箭頭直線,教你這麼做馬上學會畫流程圖
    No.1Excel中畫線條是一個很簡單的操作,其中線條分幾種不同的類型,如線條端點形狀也分不同的幾種類型。下面具體介紹一下,如何利用vba代碼進行設置線條的一些方法。適當選擇不同的枚舉類型,可以獲得不同的線條樣式,這些都是Excel自定義好的東西,只要用拿來主義進行選擇使用即可,無需我們進行任何思考。No.2下面是一個例子,對應不同的值畫一條線段。有美術基礎的你,可以發揮自己的想像,畫出任意線條。
  • 直方圖是什麼,用Excel教你製作並分析最簡單的統計圖表
    用最大值和最小值之差去除以組數,求出組距的寬度。(有些時候我們可以適當地將最小值和最大值進行放寬,以便於數據更加整齊,本例將會將最小值調整為0,最大值調整為130000)將分組數據錄入到Excel中使用用Excel分析工具庫的數據分析工具進行直方圖的繪製(如下為整個過程的錄屏動畫,供大家參考)
  • 如何用Python讀取Excel中圖片?
    那麼你知道如何使用Python讀取Excel中的圖片?又如何使用Python直接往Excel中寫入圖片?甚至使用Python製作一個Excel可視化大屏?二、Python寫入Excel圖片在講完如何用Python提取Excel中圖片之後,下面我們將講解如何用Python將圖片寫入到Excel文件中。
  • 如何用水彩畫花卉呢?南兮成人美術
    所以今天咱們就來看看水彩花卉是如何畫的,水彩畫花看上去會更加的細膩,但是到底如何用水彩去上色呢?其實還是有一定的難度的。那麼南兮就帶來了水彩花卉的步驟,是不是很貼心,嘻嘻~~第一步,我們應該準備好工具材料:鉛筆、水彩顏料、水彩紙、水彩畫筆、洗筆桶等~第二步,今天南兮準備畫的是一束鬱金香,細節還是比較多的,所以我們先用鉛筆畫一張底稿,畫的時候注意構圖,前後遮擋關係,以及主次關係。
  • 如何用圓畫一個相撲選手?看完直接跪了
    雖然對一些高手來說可能火星了,但相信大部分同學肯定沒見過,那就一起來長長見識吧:如何用圓來畫出一個相撲選手?看到我有點眼花繚亂、找不著北了,想把指南針找出來的衝動!三個點而已,就這麼「簡單」!圓的面積為什麼是πr²
  • r語言一元回歸模型專題及常見問題 - CSDN
    轉載自:http://blog.fens.me/r-linear-regression/前言在我們的日常生活中,存在大量的具有相關性的事件,比如大氣壓和海拔高度,海拔越高大氣壓強越小;人的身高和體重,普遍來看越高的人體重也越重。
  • 手繪解剖圖走紅三十分鐘手的神經分布圖躍然紙上
    不到三十分鐘的時間,一幅手的神經分布圖便畫好了。「我們學校學醫的都能畫這些圖。」「我們從2004年就開始讓學生手繪人體解剖圖了。」該校基礎醫學部人體解剖學教研室的王主任向記者介紹,他們現在每次給學生布置的作業基本上都有繪解剖圖。「在上課過程中,我們除了結合標本和模型以外,就是讓學生手繪人體解剖圖。」近日,有一組學生手繪人體解剖圖在網上流傳,不少網友紛紛留言稱讚其繪畫的相當逼真。
  • 高中地理各種氣候類型分布圖匯總!
    高中地理各種氣候類型分布圖匯總! 各種氣候類型分布圖送給大家,點開看放大更清晰喲! 世界氣候類型分布圖
  • 金華樓盤分布圖怎麼看?買房時應該注意什麼?
    [導讀]大家在準備購買金華的房子的時候,一般都會先看下金華樓盤分布圖,那麼金華樓盤分布圖怎麼看?買房時應該注意什麼呢?下面就給朋友們詳細的談談這個方面的問題。   大家在準備購買金華的房子的時候,一般都會先看下金華樓盤分布圖,那麼金華樓盤分布圖怎麼看?買房時應該注意什麼呢?下面就給朋友們詳細的談談這個方面的問題。
  • 《原神》金魚草位置分布圖
    很多玩家還不知道金魚草在哪裡採集,接下來就讓小編給大家帶來原神金魚草位置分布圖的內容,感興趣的小夥伴一起來看看吧。很多玩家還不知道金魚草在哪裡採集,接下來就讓小編給大家帶來原神金魚草位置分布圖的內容,感興趣的小夥伴一起來看看吧。
  • 蒂姆的英語課- 07 嵌入式 /r/ 發音 The intrusive -r
    用'and'把他們連接起來,你會聽到'law'後面多了一個音。來聽聽看能不能聽出來。我認為法律與秩序很重要。Yes, I think law and order is important. Law and order is very important.
  • 成都首張籃球館分布圖來了!
    成都首張籃球館分布圖來了!澎湃新聞·澎湃號·政務 成都市「首張」籃球館分布圖來了