本文学习单细胞转录组分析过程中的标准化、线性降维、非线性降维
五、标准化和降维
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)#这里pbmc从58MB变成349MB了,因为表达矩阵里面原本全是0和1,ScaleData()之后就不是0和1了
pbmc[["RNA"]]@scale.data[30:34,1:3]#查看数据框,发现ScaleData之后就有数字了;至此只能一行内之间的比较了,跨行比较将没有意义
图20
1.线性降维PCA
1.1线性降维
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc))#尽可能在保留差异信息的同时,也保证了运算速度
# 单细胞数据需要考虑运算的速度和对象的大小,这关系着计算资源是否够用
# 查看前5个主成分由哪些feature组成
print(pbmc[["pca"]], dims = 1:5, nfeatures = 5)
# 查看以后,可能发现有些基因不在研究范围,如果不想用这个基因,就直接用代码从features里剔除就行,代码如下
# VariableFeatures(pbmc)[VariableFeatures(pbmc)!="MAF1"]或者↓
# setdiff(VariableFeatures(pbmc),c("COA6","MAF1"))#取差集
1.2权重与热图
下面这两个图没什么必要画出来,不过标准流程里面有,所以就写进来了,我们看一下
# 每个主成分对应基因的权重
VizDimLoadings(pbmc, dims = 1:2, reduction = "pca")
图21
# 每个主成分对应基因的热图
DimHeatmap(pbmc, dims = 1:15, cells = 500)#第9张图之后的热图已经比较模糊了
图22
1.3主成分筛选
一般不需要带着太多主成分进行后续分析,太多基因也会拖慢运行速度,所以需要筛选
①方法一
ElbowPlot(pbmc)#选拐点,例如此处7、8、9好像都可以,一般选自己觉得合适的几个数中最大的就行
# 可以用默认值15先做一遍
图23
②方法二
限速步骤:该步骤运行时间较长,所以在此设置:第一次运行这段代码会生成一个文件,当下次我们跑流程跑到这步代码时若检测到我们需要的文件已存在,则跳过这段代码。这样就不会因反复运行而耗费时间了
#方法二 (这个方法比较慢,所以注释掉了)
# 限速步骤
# f = "jc.Rdata"
# if(!file.exists(f)){
# pbmc <- JackStraw(pbmc, num.replicate = 100)
# pbmc <- ScoreJackStraw(pbmc, dims = 1:20)
# save(pbmc,file = f)
# }
# 不过需要注意,这里有pbmc,如果我的pbmc发生改动,这里记得要删掉原Rdata,再重新运行
# load(f)
# JackStrawPlot(pbmc, dims = 1:20)
如图24,从第1到第13个,p值都是<0.05,所以需要这13个
按照图24来看我们需要选择数字13;而根据图23来看范围可以是7~10左右。如果实在不知怎么选择,就尽可能选较大的数
图24
两个方法任选其一,方法二运行太慢,一般直接用方法一即可
1.4 PC1和PC2 细胞聚类图
DimPlot(pbmc, reduction = "pca")+ NoLegend()
得到如图25细胞聚类情况,每个点即一个细胞。如果有多个样本,这张图将有不同颜色的点,这样就能看出细胞是否以样本为单位聚成一簇了。我们不希望看到样本与样本之间分得很开,比如样本1即PC1聚成一簇,样本二即PC2聚成一簇,因为这是批次效应导致的
图25
# 结合JackStrawPlot和ElbowPlot,挑选10个PC,所以这里dims定义为1:10
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5) #resolution分辨率范围0~1,分辨率越小,分的簇数量就少(就是看起来越模糊),0.5是折中的值
# 结果聚成几类,用Idents查看
length(levels(Idents(pbmc)))
得到结果9,即分了9类
图26
FindClusters()
之后,每个细胞便有了不同的类别归属,每个细胞属于第几个簇都标好了
图27
2.非线性降维 UMAP 或 t-sne