Statquest学习笔记|在R中进行PCA(主成分分析)

学习利用prcomp()进行PCA(主成分分析)
利用base graghics和ggplot2来绘制PCA图
确定每个成分的描述的差异
找到影响最大的变量

建立模拟数据集

首先建立一个模拟数据集来进行后续分析
这个数据包干10个样本和100个基因,前五个样本是野生型“WT”,后五个样本是敲除“KO”
由于这是我们模拟出来用来练手的数据,暂且就将一百个基因命名为gene1, gene2, ..., gene100
然后生成随机数(这些随机数五个一组符合泊松分布)建立模拟数据集

data.matrix <- matrix(nrow=100, ncol=10)
colnames(data.matrix) <- c(
  paste("wt", 1:5, sep=""),
  paste("ko", 1:5, sep=""))
rownames(data.matrix) <- paste("gene", 1:100, sep="")
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)
}
head(data.matrix)
dim(data.matrix)
生成的模拟数据集

利用prcomp()进行PCA

注意,prcomp默认列名为样本名,行名为基因(变量)名,最终目的计算列之间的关系

pca <- prcomp(t(data.matrix), scale=TRUE) 

prcomp()的结果有三个部分x, sdev, rotation
x有10个,因为这里有10个样本,可以用来画图的主成分。在这里我们选x的前两行来画一个二维平面图,。
排名第一的主成分(PC1)能在是个样本中解释大部分变化,一般来说,当我们画二维PC图时,我们会选前两个成分(PC1, PC2),但有时我们也会选第三个(PC3)或第四个(PC4)
sdev的平方就是SD,可以用来计算每个成分(PC)的解释度
rotation时每个样本在每个PC下基因(变量)的loading score,看影响最大的基因

利用base graghics简单作图

可以做一个柱状图来看每个成分占多大比例

pca.var <- pca$sdev^2
#四舍五入
pca.var.per <- round(pca.var/sum(pca.var)*100, 1)
barplot(pca.var.per, main="Scree Plot", xlab="Principal Component", ylab="Percent Variation")

可以看出PC1解释了大多数差异
利用PC1, PC2画图

plot(pca$x[,1], pca$x[,2])
因为PC1最高,我们可以理解在PC1上的差别远大于PC2上的差别

用ggplot2画图

用ggplot2能画出来更好看的图
我们需要有三列分别是样本id,PC1和PC2,即每一行都有样本名,PC1和PC2


画图所需矩阵
library(ggplot2)
#制作输入矩阵id,PC1,PC2 
pca.data <- data.frame(Sample=rownames(pca$x),
  X=pca$x[,1],
  Y=pca$x[,2])
pca.data
 
#aes指定每个点的横纵坐标,并用label命名(在这里命名为id)
#xlab()和ylab()来命名横纵坐标轴
#theme_bw()规定背景为白色
#ggtitle来命名图标
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")

通过rotation来理解图片结果

以PC1为例

loading_scores <- pca$rotation[,1]
gene_scores <- abs(loading_scores) ## 我们需要知道的是最远的点,所以在既有正数也有复数的情况下取绝对值abs()
gene_score_ranked <- sort(gene_scores, decreasing=TRUE)
top_10_genes <- names(gene_score_ranked[1:10])
 
top_10_genes ## 找到排名前十的基因
 
pca$rotation[top_10_genes,1] ##加上被我们用绝对值去掉的正负号
前十中分数为正的基因造成了五个“KO”样本集中在右侧的结果
前十中分数为负的基因造成了五个“WT”样本集中在右侧的结果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容