轉自:https://www.sohu.com/a/204161532_278730
我們先看一下別人家文章中的核密度圖。
那麼,怎麼做出這樣的圖呢?這種核密度圖到底想表達或表現什麼呢?
核密度圖的繪製
所謂“眼過千遍不如手過一遍”,數據我們這裏用Wikipedia文中的這6個數: −2.1, −1.3,−0.4,1.9,5.1,6.2。我們用ggplot2繪製這6個數的核密度圖(兩種方法,代碼對應下圖的p1和p2)、直方圖和密度圖的組合比較(下圖p3),與其“鏡像翻轉”數列“相加”後新數列的密度圖(下圖p4,橙色)。代碼如下:
> library("ggplot2", lib.loc="~/R/win-library/3.4")
> x<-c(-2.1,-1.3,-0.4,1.9,5.1,6.2)
> x
[1] -2.1 -1.3 -0.4 1.9 5.1 6.2
# 載入數據
> p<-ggplot(data=NULL,aes(x=x))
> p1<-p+geom_density(adjust=0.55,fill="#f4876a",colour="black",alpha=0.6,size=1)+xlim(-10,14)
> p1
# 第一種畫法,利用geom_density()畫的核密度圖,“面積”可填充顏色(見下圖,p1)。這裏的adjust用來調整bw(帶寬),數值爲默認值的倍數。這裏geom_density()默認的核函數爲Gaussian,關於帶寬的解釋見下文。
> p2<-p+geom_line(stat ="density",adjust=0.55,color="blue",size=1)+xlim(-10,14)
> p2
# 第二種畫法,方法相類似,最後的結果與p1一致,只是不能填充顏色(下圖p2)。
> p3<-p+geom_histogram(binwidth =2,center=1,fill="blue",color="white",alpha=0.8,size=1)
+geom_line(stat ="density",adjust=0.55,color="red",size=1)+xlim(-5,10)
> p3
# 同樣的數據,用geom_histogram()畫直方圖作比較,某種意義上可爲bw的調整做參考。
> m<-c(1,1,1,1,1,1,2,2,2,2,2,2)
> z<-c(-8.3,-6.4,-2.3,2.3,6.4,8.3)
> n<-c(z,x)
> data<-data.frame(m,n)
> data
m n
1 1 -8.3
2 1 -6.4
3 1 -2.3
4 1 2.3
5 1 6.4
6 1 8.3
7 2 -2.1
8 2 -1.3
9 2 -0.4
10 2 1.9
11 2 5.1
12 2 6.2
> p1<-ggplot(data=data,aes(x=n,group=factor(m),color=factor(m),fill=factor(m)))
> w1<-w+geom_density(adjust=0.55,alpha=0.6,size=1,colour="black")+xlim(-15,15)
> p4
# 將x這列數據乘以負1,從順序顛倒後與x相加,生成z,z和x組成數據框,繪製分組核密度圖,見p4。本文對圖表主題,文字不做調整,調整方法見上一篇文章《ggplot2繪圖學習筆記分享》,這裏不再贅述。
KDE 簡介
核密度估計(kernel density estimation,KDE)是根據已知的一列數據(x1,x2,…xn)估計其密度函數的過程,即尋找這些數的概率分佈曲線。我們最常見的密度函數莫過於正態分佈(也稱高斯分佈)的密度函數:
而密度估計就是給定一列數據,分佈未知的情況下估計其密度函數。
例如上文的6個數據:c(x1 = −2.1,x2 = −1.3, x3 = −0.4, x4 = 1.9, x5 = 5.1, x6= 6.2),我們看下這列數據的“密度”如何。
畫頻率直方圖就是一種密度估計的方法(如下圖,組距爲2),這裏的“密度”(density)可以感性得理解爲一個區間(直方圖的組距)內數據數量的多少,右圖即爲這6個數據的密度曲線(這裏簡稱爲密度圖),它是左圖的外輪廓化,數據量越多,直方圖的頂點也越接近一條線。
https://en.wikipedia.org/wiki/
直方圖和密度圖都是一組數據在座標軸上“疏密程度”的可視化,只不過直方圖用條形圖顯示,而密度圖使用擬合後的(平滑)的曲線顯示,“峯”越高,表示此處數據越“密集”。“密度”越高,如下圖。
https://en.wikipedia.org/wiki/
“核”與“帶寬”
核密度估計是用用下面的函數去估計一個分部未知的獨立樣本的分佈:
其中K,也就是“核”(kernel)表示核函數,部分常見的核函數如下圖(看到Gaussian的函數是不是覺得很眼熟?另爲,R中的kernel 有"gaussian","epanechnikov","rectangular","triangular","biweight","cosine","optcosine")。
公式裏的“h”,被稱爲“帶寬” (bandwidth,也寫作bw),爲平滑參數,可簡單理解爲直方圖的“組距”,帶寬越大麴線越平滑,見下圖。
小結
核密度估計實際上是表現一組數據的分佈情況,轉錄組中用來展示所有樣本基因的表達量丰度分佈,將FPKM取對數後替換本文第1部分繪圖的數據,即可畫出樣本中所有基因表達量的分佈圖。一般情況下,它可用來比較某個樣本跟其它樣本間的差異。
當然,也可以用於其他的數據分佈的分析,除了箱型圖,還可考慮核密度圖。
想學ggplot2作圖的童鞋可以點擊“閱讀原文”到在線課堂看周老師的視頻教程,每個視頻都可下載課件和數據。今天的就到這裏啦,若覺得本文還不錯要記得分享哦~