如何做主成分分析加"置信區間"?

2021-03-02 基迪奧生物
使用R語言為PCA散點圖加置信區間的方法,我知道的有三種,分別是使用ggplot2、ggord和 ggfortify三個R包去繪製。後面兩個R包是基於ggplot2的快捷方法,接下來就以R自帶的Iris數據集為例,看下如何繪製的。
使用R自帶數據集 iris 的前4列進行主成分分析,主要使用R的prcomp()基礎函數。

ord <- prcomp(iris[, 1:4])
summary(ord)


我們看到PC1的方差解釋率達92.46%,PC2的方差解釋率為5.31%,主成分分析就做完了,是不是非常簡單!接下來進行數據可視化。

#提取不同記錄的PC1~PC4數值,即點的橫縱坐標值;
dt<-ord$x
head(dt)
#將iris數據集的第5列數據合併進來;
df<-data.frame(dt,iris$Species)
head(df)

#生成坐標軸標題;
summ<-summary(ord)
xlab<-paste0("PC1(",round(summ$importance[2,1]*100,2),"%)")
ylab<-paste0("PC2(",round(summ$importance[2,2]*100,2),"%)")

#載入ggplot2包;
library(ggplot2)

p1<-ggplot(data = df,aes(x=df$PC1,y=df$PC2,color=df$iris.Species))+
stat_ellipse(aes(fill=df$iris.Species),
type = "norm", geom ="polygon",alpha=0.2,color=NA)+
geom_point()+labs(x=xlab,y=ylab,color="")+
guides(fill=F)
p1

初始的繪製效果如下,當然你可以做進一步的個性化調整,這裡不做贅述。

#載入所需R包;
library(ggord)
#繪製散點圖;repel避免標籤重疊;
p2 <- ggord(ord, iris$Species,coord_fix=F,labcol = 'purple', repel = TRUE)
p2

#改變箭頭(特徵向量)的scaling(箭頭大小), arrow length(箭頭長度), line color, size(粗細), type;

p3 <- ggord(ord, iris$Species,coord_fix=F,labcol = 'purple', repel = TRUE,
arrow = 0.25, vec_ext = 2,
veccol = 'blue', veclsz = 0.5, vectyp = 'solid')
p3

#隱藏箭頭;
p4 <- ggord(ord, grp_in = iris$Species,coord_fix=F,
arrow=0, vec_ext =0,txt=NULL)
p4

#自定義點的大小和顏色、透明度;
p5 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL)
p5

#改變置信橢圓透明度;
p6 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE)
p6

#自定義置信橢圓描邊的樣式;
p7 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE,polylntyp="dashed")
p7

#或者讓描邊與分組建立映射關係;
p8 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,poly = FALSE,polylntyp=iris$Species)
p8


#添加多邊形區域;
p9 <- ggord(ord, iris$Species,coord_fix=F,
cols = c('purple', 'orange', 'blue'), size=2,alpha=0.7,
arrow=0, vec_ext =0,txt=NULL,ellipse = FALSE, hull = TRUE)
p9

#自定義點的樣式;
#隱藏網格線;
library(ggplot2)
p10<-p9+scale_shape_manual('Groups', values = c(0, 1, 2))+
theme(panel.grid=element_blank())
p10

ggord在GitHub(https://github.com/fawda123/ggord)上,需要換種方式安裝。

#所需R包的安裝;
#install.packages('devtools')
library(devtools)
#install_github('fawda123/ggord')
library(ggord)

如果以上的方法出錯,可嘗試本地安裝的方法。將R包下載下來後,準備用一種非常詭異的方法進行本地安裝。首先,把安裝包複製到R的安裝目錄中,我這裡是(64位):「C:\Program Files\R\R-3.6.2\bin\x64」, 然後在Windows搜索「cmd」,打開命令提示符窗口,cd到「C:\Program Files\R\R-3.6.2\bin\x64」文件中,執行rcmd INSTALL ggord-1.1.4.tar.gz 命令進行本地安裝,如下:

#安裝ggfortify包;
#install.packages("ggfortify")
#載入ggfortify包;
library(ggfortify)

#快速繪製主成分散點圖;
autoplot(ord, data = iris, colour = 'Species')


#添加特徵向量;
autoplot(ord, data = iris, colour = 'Species',
loadings = TRUE, loadings.colour = 'blue',
loadings.label = TRUE, loadings.label.size = 3)

#載入cluster包;
#添加K-means聚類結果;給定 frame = TRUE,可以把每個集群圈出來。
library(cluster)
autoplot(fanny(iris[-5], 3), frame = TRUE)


#你也可以通過 frame.type 來選擇圈的類型。
#更多選擇請參照ggplot2::stat_ellipse裡面的frame.type的type關鍵詞。
autoplot(pam(iris[-5], 3), frame = TRUE, frame.type = 'norm')


#添加Fisher局部判別分析聚類;
#lfda包支持一系列的Fisher局部判別分析方法,包括半監督lfda,非線性lfda。
#install.packages("lfda")
library(lfda)
# Fisher局部判別分析 (LFDA)
model <- lfda(iris[-5], iris[, 5], 4, metric="plain")
autoplot(model, data = iris, frame = TRUE, frame.colour = 'Species')

最後,以上繪圖效果只是初步結果,大家還可利用ggplot2的theme()函數做進一步的個性化分析。這三個R包個人覺得ggord可能更快捷一些,如果需要進一步做聚類,推薦使用ggfortify 。https://terrytangyuan.github.io/2015/11/24/ggfortify-intro/

實用科研工具推薦      
詳實生信軟體教程分享
前沿創新組學文章解讀
獨家生信視頻教程發布

相關焦點

  • Python數據分析:置信度與置信區間如何區分?
    那怎麼才能知道這一條流水線的質量,那就是抽樣,抽取整條流水線上的部分手機進行檢驗,會得到一個合格率,然後用這個合格率去估計整條流水線的合格率,同樣這種方式也是點估計。那現在是不是大概理解點估計的意思了,就是用隨機抽樣的樣本的計算出來的指標值去估計整體指標情況。
  • 「置信區間」是什麼?(修訂版)
    這個時候,需要計算「置信區間」。換言之,顯著度檢驗只告訴我們可以有多大的信心認為「總體參數不是0」,是個否定答案;置信區間告訴我們可以有多大的信心認為「總體參數大約是什麼」,是個肯定答案。否定也好,肯定也好,都是以「信心度」為標誌的概率答案,不是以「必然」、「絕對」為標誌的確定答案。 總而言之,計算「置信區間」,是「顯著度檢驗」的後續分析。
  • 通俗易懂學Python,置信度與置信區間
    -今天這篇聊聊統計學裡面的置信度和置信區間,好像沒怎寫過統計學的東西,這篇試著寫一寫。在講置信度和置信區間之前先講講點估計,那什麼是點估計呢?給你舉兩個例子你就知道了。比如說我有 95% 的把握估計我高考分數是 600-650,這裡的置信區間就是 [600,650],置信度就是 95%。一般置信度和置信區間是同向的,啥意思呢?就是置信度和置信區間一般是相同趨勢。當置信度很高時,置信區間也會很大;當置信區間很大時,置信度也會很高。
  • 線性回歸分析詳解9:顯著性水平、置信度、置信區間及其計算方法
    許栩原創專欄《從入門到高手:線性回歸分析詳解》第9章,總體回歸、置信度、置信區間及其計算方法。多元回歸方程求解後,我們分別確認了回歸方程的精度和進行了回歸方程的顯著性驗證,接下來,需要計算置信區間。置信區間是回歸分析的一個重要概念,但是,將回歸分析應用到需求預測時,並不強求引入置信區間,也就是說,用回歸分析做需求預測時,可以不進行置信區間的計算,而直接進行後續的預測步驟。所以,從這一點來說,大家可以跳過本章,直接進入專欄的第10章,用線性回歸分析進行預測。
  • 區間估計、置信區間
    點估計與區間估計刮獎猜測點估計就是單猜某一張彩票是大獎,區間估計就是將點估計的範圍擴大,可以一盒一盒、一個區域、一座城市,說白了就是設置一個半徑。下面採用置信區間構造區間估計但是這個區間多大會影響到所有估計中包含真值的比例,比如由樣本均值的抽樣分布可知,在重複抽樣或者無限總體抽樣的情況下,樣本均值的期望等於總體均值。
  • 華玉振:與"擺地攤"感同身受
    當共和國總理在莊嚴的全國人大會議上,宣布城市管理要為"擺地攤"寬容時,我的眼睛溼了。三十四年前剛畢業的那年夏天,在家鄉小集鎮的稅務所,因拒絕"出外勤"向"地攤"收稅的風波又勾起我的回憶。所長安排我"出外勤"上街。所謂"出外勤",就是上街丶入村丶進廠,挨家挨戶收稅。我從小厭煩稅務官。據父母講太祖父、祖父都曾經因為挑擔擺攤賣杏、賣黃花菜而被稅務官盤剝過。
  • 通俗易懂告訴你:何為95%置信區間?
    那麼由此我們就引出了其他兩個關鍵詞:置信區間和置信水平其中(8.7cm,9.2cm)我們就可以理解成置信區間,那麼95%就是置信水平。由樣本統計量所構造的總體參數的估計區間為置信區間。由於統計學家在某種程度上確定這個區間會包含真正的總體參數,所以取名置信區間。在統計中,一個概率樣本的置信區間(Confidence interval)是對這個樣本的某個總體參數的區間估計。置信區間展現的是這個參數的真實值有一定概率落在測量結果的周圍的程度。置信區間給出的被測量參數的測量值的可信程度,即前面所要求的"一定概率"。這個概率被稱為置信水平。
  • "我,36歲,和甜蜜男談了一場戀愛,傾家蕩產!"
    但你想不到的是,最先關注到這個數據的,不是單身女性自己,而是"殺豬盤"的騙子。他們將這一億單身女性當做了"獵物",開啟了自己的"宰割"之路。科學家的研究成果,需要經過千百次的實驗獲得,而騙子的騙局同樣需要總結經驗。
  • 靈敏度和特異度的置信區間怎麼算?
    作者:王瑩   前言   很多醫學生及醫生經常會對診斷實驗進行評價,評價診斷試驗的常用指標及計算方法都比較容易掌握,但是少有人知道其相應的95%的置信區間的計算方法。
  • 「I love You」的真正意思其實不是 "我愛你"
    肯定會有人說:"這個啊,地球人都是知道!"我愛你"唄是的,我們知道這是一句告白的話,是我們表達愛的方式,它是一句放之四海皆準的宣言,既是世界最美的語言,也是情人之間表達情感最直接的語言. 但是,你知道嗎,這8個字母其實是有特殊意義的.當你聽到或當你說出這句話的時候,是否知道它還有更深一層的涵義呢?
  • "生孩子"也要AA制嗎?
    她是這樣寫的:"我懷孕六個月了,沒上班在家待著,自己也沒多少存款,我老公今天說生孩子的時候花的醫療費用我倆一人出一半,平攤,我很震驚,想了一天都沒想通他怎麼會這樣說,為什麼呢?"看了之後,我也驚著了。難道是自己落伍了,跟不上潮流了嗎?還是現在的夫妻樣樣都實行AA制,包括生孩子呢?左思右想不得其解,於是便將這故事當新聞說與朋友聽。朋友聽後一陣哈哈大笑,我被朋友笑懵了,問他很好笑嗎?
  • 網絡"遊戲"的泛濫,你孩子的人生是否被偷換了概念?
    人類的生命本質是公平的,但是這種本質的公平已經被"經濟"所打破。這"經濟"當然不僅僅指的是金錢和物質,它當然包含一種無形的、也是比金錢更具威力的"經濟"~那就是"名"。所謂的"名",當然是指那些出了名的人名,統一稱呼為"名人"。名人當然也就不同於一般的人名,他們具備一呼百應的能力。特別是在當下的網絡時代,這名人效應尤為明顯。
  • "我談了一場戀愛卻傾家蕩產!"比仙人跳悲劇 10000倍的,居然是這種騙局!
    "殺豬盤"騙錢騙情,讓受害人最後輸的一無所有,真是太可惡了!他們每個人都有一款手寫詳細的"培訓手冊"。從「開發」客戶到後路的每一個步都有劇本。更匪夷所思的是,甚至警察來了如何第一時間藏好手機都設想好了。騙子們的日常工作,就是吃飯,睡覺,上廁所,經營"殺豬盤"。他們與時俱進,隨時調整劇本方案。詳細分析單身女性的特質,感情空虛,有些積蓄,一直沒有遇到自己的靈魂伴侶,心理脆弱。緊緊扣住這些特質,流水化作業。
  • 親身經歷,分享我是怎麼從"躺贏式家長"到「模範家長」的
    剛接觸這個詞時,是在熱搜上看到,看對於"躺贏式家長"的種種分析,才發現我在育兒過程中完全就是從"躺贏"到"模範&34;,一個完全的「模範式家長」
  • 從心理學上看程璐思文離婚:兩個"好人"是很難維繫婚姻的
    02從心理學情感分析他其實是可以給自己休息,暫時不面對觀眾"強顏歡笑"的,畢竟婚姻的解散,對於這個好人來說也是一個"重傷"。他的難受,他的遺憾,在鏡頭前是無法真實呈現出來的,畢竟觀眾不喜歡,觀眾要看的是輕鬆有趣。
  • "兒臣" 的帳單與 "額娘" 的神回復火了 !
    只是深知"父母之愛子,則為之計深遠",你的起點是父母懷抱,你的未來是修齊治平,弘毅致遠。所以額娘才狠心讓你歷練,吾兒可知"有多殘忍有多愛"。當然,吾兒自立並非始於今年今日,是家風使然。額娘一介弱女,尚能十九歲離家三千裡獨自求學,深信吾兒勝之。
  • 這個母親的"瘋狂"舉動,卻引得旁人拍手稱讚
    1 啼哭的女孩和"瘋狂"的母親 幾天前,我正陪著孩子購物,突然聽到一陣小孩的哭聲。我們先來分析一下講、道、理這三個字。 講,當然是從嘴巴裡說出來,讓人耳朵裡聽進去。 我們都知道,孩子最早的學習來自於模仿一一主要是看,然後是聽。因為眼睛接受信息提供給大腦處理的速度,要遠遠比耳朵傳輸的要快。
  • 科普|為什麼自閉患兒總是"聽不懂話"?
    ",而"聽不懂"好像變成了星孩的生活日程,當父母叫孩子做某件事時,孩子就只會呆站在一旁。其實,星孩"聽不懂"有時是因為父母給孩子的指令超出孩子認知可以理解的程度,所以才會聽不懂。可偏偏讓孩子學會聽指令可以訓練孩子的服從性,服從性又是社交團體中重要的一環,也是日後當孩子進入到校園生活時,能不能融入環境的重要條件之一,父母總不能就這樣不管孩子聽不懂話吧!但是要怎麼說孩子才能聽得懂呢?
  • 用R語言做主成分分析
    主成分分析,就是一種降維的分析方法,其考察多個變量間相關性的一種多元統計方法,研究如何通過少數幾個主成分來揭示多個變量間的內部結構,即從原始變量中導出少數幾個主成分,使它們儘可能多地保留原始變量的信息,且彼此間互不相關。舉個例子來說明:拿到一個生物信息系的本科生期末考試成績單,裡面有三列,一列是對學科的興趣程度,一列是複習時間,還有一列是考試成績。
  • 如何正確應用SPSS 軟體做主成分分析
    如何正確應用SPSS 軟體做主成分分析 作者:李小勝  陳珍珍