PCA 簡介
PCA(Principal Component Analysis),即主成分分析。PCA是一種研究數據相似性或差異性的可視化方法,採取降維的思想,PCA 可以找到距離矩陣中最主要的座標,把複雜的數據用一系列的特徵值和特徵向量進行排序後,選擇主要的前幾位特徵值,來表示樣品之間的關係。通過 PCA 可以觀察個體或羣體間的差異。PC 後面的百分數表示對應特徵向量對數據的解釋量,此值越大越好。
和PCA類似的數據降維方法還有MDS和PCoA。它們三者之間的區別聯繫如下圖。
PCA creates plots based on correlations among samples.
MDS and PCoA create plots based on distances among samples.
PCA算法
PCA的計算過程比較複雜,可以參考B站up主上傳的YouTube上的視頻(點擊觀看)作爲參考。PS:YouTube上的StatQuest系列視頻及其通俗易懂,強推。
PCA在R語言中的實現
(R代碼下載:點擊下載)
data.matrix <- matrix(nrow = 100,ncol = 10) #創建一個100行10列的空矩陣
colnames(data.matrix) <- c(paste("wt",1:5,sep = ""),paste("ko",1:5,sep = "")) #命名矩陣的列
rownames(data.matrix) <- paste("gene",1:100,sep = "") #命名矩陣的行
# for循環填充矩陣
for (i in 1:100) {
wt.values <- rpois(5,lambda = sample(x=10:1000,size = 1))
ko.values <- rpois(5,lambda = sample(x=10:1000,size = 1))
data.matrix[i,] <- c(wt.values,ko.values)
}
pca <- prcomp(t(data.matrix),scale = TRUE) #t()函數的功能的將矩陣的行列位置進行置換,本例中研究的是“樣本”,不是“Gene”
#prcomp()的結果是三個值:x,sdev和rotation。三個值在後面都會用到
plot(pca$x[,1],pca$x[,2])
pca.var <- pca$sdev^2 # 計算原始數據中的每個數據在每個PC上的比重
pca.var.per <- round(pca.var/sum(pca.var)*100,1) #計算每個PC佔所有PC的和的比列
barplot(pca.var.per,main = "Sreen Plot",xlab = "Princioal Component",ylab = "percent Variation")#柱狀圖顯示每個PC所佔的比列
library(ggplot2)#調用ggplot2()
pca.data <- data.frame(Sample=rownames(pca$x),X=pca$x[,1],Y=pca$x[,2])#創建數據框
#ggplot2繪圖
ggplot(data = pca.data,aes(x=X,y=Y,label=Sample))+
geom_text()+
xlab(paste("PC1 - ",pca.var.per[1],"%",sep = ""))+
ylab(paste("PC2 - ",pca.var.per[2],"%",sep = ""))+
theme_bw()+
ggtitle("My PCA Graph")
loading_scores <- pca$rotation[,1] #查看PC1的loading scores
gene_scores <- abs(loading_scores) #計算loading score的絕對值
gene_score_ranked <- sort(gene_scores,decreasing = TRUE) #降序排列loading scores
top_10_genes <- names(gene_score_ranked[1:10])
top_10_genes
pca$rotation[top_10_genes,2]
代碼生成
在網站https://carbon.now.sh上生成帶感的代碼圖片。