PCA的分析

常用的工具

PCA分析中常用的工具有GCTA中的PCA模块,老牌的软件EIGENSOFT中的smartpca,还有很多最近推出的R包都能够做PCA分析。然后分析完后,可视化的操作一般是使用R中ggplot等包去实现。

简单介绍一下GCTA和EIGENSOFT这两个工具:

GCTA
在群体遗传中,GCTA中的PCA模块是一款比较好的软件,不单可以做PCA的分析,其他LD,FST等一概都可以使用。工具官网http://cnsgenomics.com/software/gcta/#Overview 。这个软件能支持不同的平台,Windows,mac还有linux都有。

EIGENSOFT

这个工具是很经典老牌的工具,引用率已经过6000了,是非常可靠也得到了学术界认可的一款软件。工具官网:https://www.hsph.harvard.edu/alkes-price/software/, 也可以通过conda下载比较简便。这个工具的缺点就是它只支持linux系统,而且对输入文件的格式有一定的要求。

实战

实战一:GCTA-PCA

首先使用plink将vcf 格式的文件转化成所以.bed,.bim,.pam结尾的输入文件。

~/biosoft/plink --allow-extra-chr --out myplink_test --recode --vcf Gpan.prune.in.vcf
~/biosoft/plink --allow-extra-chr --file myplink_test --noweb --make-bed --out tmp

利用GCTA进行PCA构建

~/biosoft/gcta_1.91.6beta/gcta64 --bfile tmp --make-grm --autosome --out tmp
~/biosoft/gcta_1.91.6beta/gcta64 --grm tmp --pca --out pcatmp

运行玩后会生成三个文件

-rw-r----- 1 hhu pawsey0149 1.1K Oct  5 12:32 pcatmp.log
-rw-r----- 1 hhu pawsey0149 8.0K Oct  5 12:32 pcatmp.eigenval
-rw-r----- 1 hhu pawsey0149  45K Oct  5 12:34 pcatmp.eigenvec

打开用以后续分析的pcatmp.eigenvec查看一下

AB AB 0.00131144 0.00396951 -0.0564857
BR-01 BR-01 0.0231107 0.0369411 -0.0218842
BR-03 BR-03 0.0193726 0.028917 0.0294029
BR-04 BR-04 0.0221467 0.0355209 0.0069615
BR-05 BR-05 0.0256852 0.0432579 0.0164723
BR-06 BR-06 0.0134884 0.0311958 -0.0547523

打开文本编辑器,将下面这一行加到分析文件的第一行中,以便后面的分析:

ID Group PC1 PC2 PC3

使用的R包进行可视化,这里没有具体将每个个体就行分群,我全部标记为一个组。真实的结果是根据你strcture图或者系统进化树对群体进行适当的分组,这样画出来的效果会更好,图例中PC1,PC2,PC3的值根据你生成的pcatmp.eigenval文件来计算。

library(ggplot2)
pdf(file="plot.evec1.pdf")
data <-read.table(file="pcatmp.eigenvec",header=T)
par(mfrow<-c(3,1))
ggplot(data = data, aes(x = PC1, y = PC2, group = Group)) +
  geom_point(alpha = 0.5) + xlab("PC1(9.46%)") + ylab("PC2(3.23%)")
ggplot(data = data, aes(x = PC1, y = PC3, group = Group)) +
  geom_point(alpha = 0.5) + xlab("PC1(9.46)") + ylab("PC3(2.43%)")
ggplot(data = data, aes(x = PC2, y = PC3, group = Group)) +
  geom_point(alpha = 0.5) + xlab("PC2(3.23%)") + ylab("PC3(2.43%)")
dev.off()

实战二:EIGENSOFT中的smartpca

首先同样使用plink将vcf文件转格式转化成.ped和.map结尾的文件:

plink   --allow-extra-chr --out myplink_test --recode --vcf Gpan.prune.in.vcf

进一步使用EIGENSOFT中内置的convertf 文件转化为smartpca的输入文件:

convertf -p transfer.conf

该步骤需要一个config file,将文件的输入输出写进去。然后执行command:

##config file

genotypename:    myplink_test.ped
snpname:         myplink_test.map # or example.map, either works
indivname:       myplink_test.ped # or example.ped, either works
outputformat:    EIGENSTRAT
genotypeoutname: example.eigenstratgeno
snpoutname:      example.snp
indivoutname:    example.ind
familynames:    NO

该步骤会生产生三个pca所需的输入文件 example.eigenstrat example.snp example.ind

smartpca -p runningpca.conf

其config file 如下,根据你的数据参照manual来修改对应的参数:

genotypename: example.geno
snpname: example.snp
indivname: example.ind
evecoutname: example.pca.evec
evaloutname: example.eval
altnormstyle: NO
numoutevec: 10
numoutlieriter: 5
outliersigmathresh: 6.0

截取了运行中的屏幕输出,

number of samples used: 955 number of snps used: 338985
Using 47 threads, and partial sum lookup algorithm.
 snp              01_8639 ignored . allelecnt:     0  missing:   155
 snp            01_374042 ignored . allelecnt:     0  missing:   110
 snp            01_519924 ignored . allelecnt:     0  missing:   202
 snp            01_849970 ignored . allelecnt:     0  missing:   116
 snp            01_987052 ignored . allelecnt:     0  missing:   120
 snp           01_1320103 ignored . allelecnt:     0  missing:   233
 snp           01_1321733 ignored . allelecnt:     0  missing:    60
 snp           01_1414591 ignored . allelecnt:     0  missing:   144
 snp           01_1630546 ignored . allelecnt:     0  missing:   107
 snp           01_1659746 ignored . allelecnt:     0  missing:   185
total number of snps killed in pass: 7107  used: 331878
REMOVED outlier SRR1533159 iter 1 evec 9 sigmage 6.238 pop: Control
REMOVED outlier SRR1533177 iter 1 evec 9 sigmage 6.238 pop: Control
REMOVED outlier SRR1533192 iter 1 evec 9 sigmage 6.098 pop: Control

可以看到,smartpca有对数据进行统计与过滤处理,这里有一些地质量的snp和三个样本个体被去除。生成的结果文件如下,截取第2,3,4列,填充表头 ID Group PC1 PC2 PC3, 然后使用上面的Rscript进行可视化

      #eigvals:    90.057    30.783    23.151    20.587    15.880    11.750    10.447     9.063     8.713     7.348 
                  AB    -0.0010      0.0046      0.0572     -0.0365     -0.0347      0.0246      0.0058     -0.0259     -0.0424      0.0130          Control
               BR-01    -0.0237      0.0373      0.0228      0.0190     -0.0503     -0.0666      0.0262      0.0426      0.0098      0.0347          Control
               BR-03    -0.0198      0.0293     -0.0287      0.0074     -0.0432      0.0582     -0.0310      0.0031      0.0313     -0.0240          Control
               BR-04    -0.0228      0.0360     -0.0062      0.0265     -0.0686     -0.0364      0.0007      0.0340     -0.0091     -0.0015          Control
               BR-05    -0.0265      0.0438     -0.0157      0.0262     -0.0468     -0.0147     -0.0185      0.0372     -0.0143      0.0350   
              

对比两个工具结果,维度不同,但cluster的结果还是很接近的。

实战3:最近出的R包工具

这个实战不同于上面,使用的是另一个数据

Load 对应的R包

library(vcfR)
library(poppr)
library(ape)
library(RColorBrewer)

读取vcf文件,还有数据信息文件,将vcf转化成genlight格式

rubi.VCF <- read.vcfR("prubi_gbs.vcf")
rubi.VCF
pop.data <- read.table("population_data.gbs.txt", sep = "\t", header = TRUE)
pop(gl.rubi) <- pop.data$State
gl.rubi <- vcfR2genlight(rubi.VCF)

使用glPCA function进行PCA分析

rubi.pca <- glPca(gl.rubi, nf = 3)

分析完后,对特征值用图形进行大概了解。

variance <- as.matrix(rubi.pca$eig)
par(mar = c(5.1,4.5,4.1,4.5))
plot(variance[1:10], type = "b", col = "blue", pch = 20, xaxt="n",yaxt="n", xlab="PCs",ylab="Variance")
axis(side = 1, at = 1:10)
axis(side = 2, at = round(seq(0, max(variance), length = 12)))
ec <- vector(mode="numeric", length=length(variance))
for (i in 1:length(variance)){
  ec[i] <- sum(variance[1:i])/sum(variance)
}
par(new=TRUE)
plot(ec[1:10], type="b", col="red",xaxt="n",yaxt="n",xlab="",ylab="", ylim = c(0,1), pch = 20)
axis(side = 4, at = seq(0, 1, by = 0.1))
mtext("Cumulative variance explained", side=4, line=3)
legend(x = 5, y = 1.0, bty = "n",col=c("blue", "red"),lty=1,legend=c("Variance","Cumulative variance explained"))

结果如下图:前3个PCA累计解释63.183%的数据差异。

2.png-42.6kB
2.png-42.6kB

要查看PCA的结果,我们可以使用R包ggplot2。我们需要将包含主要组件(rubi.pca $scores)的数据框转换为新的对象rubi.pca.scores。另外,我们将在rubi.pca.scores对象中添加人口值作为新列,以便能够按种群对样本着色。ggplot2将绘制PCA图,根据总体对样本着色,并创建包含每个群体95%数据的椭圆圈。

rubi.pca.scores <- as.data.frame(rubi.pca$scores)
pop(gl.rubi) <- pop.data$State
rubi.pca.scores$pop <- pop(gl.rubi)
cols <- brewer.pal(n = nPop(gl.rubi), name = "Dark2")
set.seed(9)
p <- ggplot(rubi.pca.scores, aes(x=PC1, y=PC2, colour=pop)) 
p <- p + geom_point(size=2)
p <- p + stat_ellipse(level = 0.95, size = 1)
p <- p + scale_color_manual(values = cols) 
p <- p + geom_hline(yintercept = 0) 
p <- p + geom_vline(xintercept = 0) 
p <- p + theme_bw()

p

结果如下:PCA分析将WA和CA样本(左边)还有样本CA和WA(右边)分离开来。然后样本CA比较显著的聚集在一起。

3.png-95.3kB
3.png-95.3kB

PCA应用

  1. 群体分层分析和推断进化关系
    可以准确的展示群体分层的类型,一般可以与phylogentic tree,structure,admixture的结果互相验证。

如图左边绿色是野生的大麦,右边橙色是驯化的大麦,中间蓝色是admixture混合的大麦。不同品系的大麦可以看到明显的分层,并且具有野生和驯化大麦特征的混合小麦位于野生还有驯化小麦之间。很好的反映了,混合小麦是其两者的一种中间过度形态,具有两者的特征。

1.PNG-74.9kB
1.PNG-74.9kB

2.检查outliner

在一个群体中,如果其中有一些样本取样错误,或者测序时候有严重的污染,这样往往会导致outliner的产生,如下图,右上方的那个样本就是明显的outlier,有着与其他样本不同,偏高的PCA比值。当确认outliner后,可以准确校正群体的样本,减少对后续关联分析的影响。

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

推荐阅读更多精彩内容