小編上期分享了一種boxplot的作圖方法之後,收到群友的反饋,反映良好,應廣大同學的要求,我們這期繼續分享Q-Q plot的作圖方法。當然作為R語言的一個toolkit,Q-Q plot也有多種形式,我們選取了一種比較實用的style介紹給大家。
Q-Q圖或分位數曲線是一種圖形工具,它可以幫助我們評估一組數據是否合理地來自某種理論分布(例如正態或指數)。
例如,如果我們運行統計分析,假設我們的因變量是正態分布的,則可以使用正態Q-Q圖來檢查該假設。這只是外觀檢查,而不是嚴格的證明,因此有些主觀。但是,這使我們能夠一目了然地了解我們的假設是否合理,如果不是,則如何違反該假設以及哪些數據點會導致違反。Q-Q圖是通過將兩組分位數相互繪製而創建的散點圖。如果兩組分位數都來自同一分布,則應該看到這些點形成了一條大致筆直的線。以下是一個正態Q-Q圖的示例,前提是假定兩組分位數都滿足正態分布。
那麼,如何生成比較直觀的Q-Q圖呢?在R語言作該類圖的過程中,我們需要注意哪些事項。下面我們就通過一個具體的實例,給大家講解一下。希望大家在實際操作和驗證過程中有所收穫。
首先,我們看一下生成的目標圖的具體效果:
在統計分析中,我們通常會用R2(介於0~1)來檢驗目標數據和實際數據之間的差別。如果R2越大(越接近1),說明數據的擬合度越大;反之,則相關性較小。常用的統計測試方法有Spearman,KS檢測等。
在獲得了擬合度數據R2之後,我們需要比較不同方法之間的差別,比如我們有兩組R2:
可以看出,我們分別用兩種方法檢測不同基因數據與目標數據(比如基因表達量)的相關性,得到了兩組不同的R2。我們先把一組R2的Q-Q圖做出來:
以下是具體實現:
# 定義函數,用Q-Q圖描畫R2
qqplot_R2<-function(corvec,nn)
{
set.seed(12345)
## nn is the sample size, number of individuals used to compute correlation.
## needs correlation vector as input.
mm <- length(corvec)
# null correlation vector
nullcorvec = tanh(rnorm(mm)/sqrt(nn-3))
qqplot(nullcorvec^2,corvec^2, xlab=expression("Expected R"^"2"), ylab=expression("Observed predictive R"^"2"),ylim=c(0,0.825),cex=0.5); abline(0,1);
grid()
data<-data.frame(cbind(sort(corvec^2),sort(nullcorvec^2)))
colnames(data)<-c("obs","exp")
return(data)
}
# 調用上面的函數進行作圖
qqplot_R2(sqrt(exR2_1$R2),length(exR2_1$R2))
上面給出了畫出一個Q-Q圖的程序,下面我們實現同時生成兩個Q-Q plot的程序:
# 定義函數,描畫兩個Q-Q圖
qqplot_two_R2<-function(corvec1,nn1,corvec2,nn2) )
{ set.seed(12345)
corvec2=corvec2[!is.na(corvec2)]
corvec1=corvec1[!is.na(corvec1)]
mm1 <- length(corvec1)
## null correlation vector
nullcorvec1 = tanh(rnorm(mm1)/sqrt(nn1-3))
mm2 <- length(corvec2)
## null correlation vector
nullcorvec2 = tanh(rnorm(mm2)/sqrt(nn2-3))
qqplot(nullcorvec1^2,corvec1^2, xlab=expression("Expected R"^"2"), ylab=expression("Observed R"^"2 "),ylim=c(0,0.85),xlim=c(0,0.003),pch = 8,bty="n",cex = 0.5,col = rgb(29,29,29,220,maxColorValue=255)); abline(0,1,col='grey',lty=1)
points(sort(nullcorvec2^2),sort(corvec2^2),xlab=expression("Expected R"^"2"), ylab=expression("Observed R"^"2 "),ylim=c(0,0.85),xlim=c(0,0.003),pch = 8,bty="n",cex = 0.5,col = rgb(230,27,50,210,maxColorValue=255))
legend(x = "bottomright" , bty="n",legend = c("Test 1 result", "Test 2 result"), pch = 8, col = c(rgb(29,29,29,220,maxColorValue=255),rgb(230,27,50,210,maxColorValue=255)))
}
qqplot_two_R2(sqrt(exR2_1$R2),length(exR2_1$R2),
sqrt(exR2_2$R2),length(exR2_2$R2))
運行上面的程序,就可以得到一開始看到的圖形了!
以上就是關於這個q-q plot的作圖方法,希望對大家有所幫助。本文我們給出了同時製作兩個Q-Qplot的示例,類似的,大家也可以在一幅圖中描畫多個Q-Qplot,如果需要相關的code,歡迎聯繫小編。