基于Vcf文件进行基因单倍型分析

单倍型,是单倍体基因型的简称,在遗传学上是指在同一染色体上进行共同遗传的多个基因座等位基因的组合;通俗的说法就是若干个决定同一性状的紧密连锁的基因构成的基因型。
单倍型分析举例:

不同样本中TtBtr-A基因的单倍型分布

TaHY5-like基因的单倍型全球分布

我们以目的基因X来进行实战分析

(1) 提取基因X的基因区SNP

bcftools filter All.vcf.gz --regions chr:start-end > GeneX.vcf
#chr:基因X所在的染色体;start:基因X起始位点;end:基因X终止位点。可以检索基因组gff文件获得

(2) 重新编码vcf文件的基因型
我们这里主要针对双等位基因vcf文件进行分析,vcf中包含./.,0/0,0/1,1/1四种基因型。
编码对应表(转换后 - 转换前):

  • -1 - ./.
  • 0 - 0/0
  • 1 - 0/1
  • 2 - 1/1
    使用vcftools可以实现基因型的转换:
vcftools --vcf test.vcf --012

Java脚本也可以实现替换基因型

public class HaploType {
    public static void main(String[] args) throws IOException {
        this.changeVcfCode("input.txt","output,txt");
    }
    public static void changeVcfCode(String input, String output) throws IOException {
        BufferedReader rd = new BufferedReader(new FileReader(new File(input)));
        BufferedWriter wt = new BufferedWriter(new FileWriter(new File(output)));
        String line;
        List<String> listTab;
        while ((line = rd.readLine()) != null ) {
            if (line.startsWith("#")) continue;
            listTab = Arrays.asList(line.split("\t"));
            StringBuilder bf = new StringBuilder();
            for (int i = 9; i < listTab.size(); i++) {
                if(listTab.get(i).startsWith("1/1")){
                    bf.append("2\t");
                }else if(listTab.get(i).startsWith("0/0")){
                    bf.append("0\t");
                }else if(listTab.get(i).startsWith("0/1") | listTab.get(i).startsWith("1/0") ){
                    bf.append("1\t");
                }else if(listTab.get(i).startsWith("./.")){
                    bf.append("-1\t");
                }else{
                    bf.append(listTab.get(i)+"\t");
                }
            }
            wt.write(bf.toString()+"\n");
        }
        rd.close();
        wt.close();
    }
}

生成haplo.txt文件,没有表头。


haplo.txt

(3) 基因单倍型图谱

  1. 输入文件
    (1)haplo.txt:行代表snp位点,列代表样本。
    (2)Annotation_sample.txt:可选的,用于注释单倍型图谱的样本信息,行代表样本,tab隔开。
#Annotation_sample.txt
Growing_Habit   Region  
Winter  SCA     
Spring  SCA 
Winter  EA
  1. 画图
#加载所需的软件包
library(pheatmap)
require(reshape)
require (rworldmap)
require(rworldxtra)
#加载注释内容,根据自己的注释文件进行修改,145是样本数目
annotation_col <- read.table("Annotation.txt",header=T,stringsAsFactors = T)
rownames(annotation_col) = c(1:145)
labels_col = rep(c(""), 145)
ann_colors = list(
  Growing_Habit = c(Facultative = "yellow", Spring="red",Winter="blue"),
  Region = c(AM = "#228B22",EA = "#D95F02",SCA="#1E90FF",WA="#E7298A", EU="#000000", AF="#FFD700",EAF="#8B008B")
)
#加载haplotype文件
GeneX <- read.table("haplo.txt", header=F, stringsAsFactors = F)
colnames(GeneX) <- c(1:145)
#画图
out <- pheatmap(GeneX, show_colnames=FALSE, legend_breaks = -1:2, legend_labels = c("./.", "0/0", "0/1", "1/1"), cutree_cols=3, cluster_row = FALSE, annotation_col = annotation_col, annotation_colors = ann_colors, main="")
out

基因单倍型分布.png

(4) 基因单倍型地理分布图谱

  1. 输入文件
    (1)haplo.txt:行代表样本,列代表snp位点。
    (2)Annotation_sample_location.txt:行代表样本,tab隔开。
#Annotation_sample_location.txt
Lat Lon
36.65   61.15   
33.8    62.2
34.36   111.61
  1. 画图
#加载所需的软件包
library(pheatmap)
require(reshape)
require (rworldmap)
require(rworldxtra)
#加载样本经纬度信息
latlon <- read.table("latlon.txt",header=T,stringsAsFactors = F, fill=TRUE)
rownames(latlon) <- c(1:145)
#对样本经纬度进行聚类
library(cluster)
library(factoextra)
data2 <- latlon[!is.na(latlon$Lat),]
df = scale(data2)
#先求样本之间两两相似性
result <- dist(df, method = "euclidean")
#产生层次结构
result_hc <- hclust(d = result, method = "ward.D2")
#确定样本地理位置聚类的数目,这里分成了40个地理group
data2$type <- cutree(result_hc, k=40)
lat_mean <- tapply(data2[,1],data2$type,mean,na.rm = TRUE)
lon_mean <- tapply(data2[,2],data2$type,mean,na.rm = TRUE)
data2$cluster1 <- NA
data2$cluster2 <- NA
#145是样本数,40是聚类数目
for(i in 1:145) {
  for(j in 1:40){
    if(data2[i,3] == j ){
      data2[i,4] <- as.numeric(lat_mean[j])
      data2[i,5] <- as.numeric(lon_mean[j])
    } 
  }
}
new_latlon <- data2[,c(4,5)]
rownames(new_latlon) <- c(1:145)
#根据上述单倍型图谱确定每个地理group的样本以及标注样本对应的单倍型(1,2,3...)
names <- as.numeric(colnames(GeneX[,out$tree_col[["order"]]]))
dataset <- new_latlon[names,]
new_latlon$id <- rownames(new_latlon)
dataset$sub <- NA
colnames(dataset)[1:3] <- c("Lat", "Lon", "id",)
#下面几行代码是确定不同的单倍型cluster的分界线。上面单倍型图谱中分了三种不同的单倍型,从图中确定界限的样本编号(41, 63, 123),根据下面代码的返回值为样本确定单倍型group(1,2,3)
which(dataset$id==41,)
which(dataset$id==63,)
which(dataset$id==123,)
#确定样本的单倍型类型
dataset$sub[1] <- 1
dataset$sub[2:11] <- 2
dataset$sub[12:145] <- 3
colnames(dataset)[4] <- "Sub.population.3"
#画图
dataset$value <- 1
reshape <- cast(dataset,Lat+Lon~Sub.population.3) 
reshape2 <- as.data.frame(reshape)
mapPies(reshape2,xlim=c(-120,140),ylim=c(35,40),nameX="Lon",nameY="Lat",nameZs=c('1','2','3'),symbolSize=1,   zColours=c('green','blue','orange'),barOrient='vert',oceanCol="#D1EEEE",landCol="#FFDAB9",main="29")

样本单倍型地理分布.png

参考文献:
【1】https://www.nature.com/articles/s41588-020-00722-w
【2】https://www.nature.com/articles/s41467-020-18738-5

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

推荐阅读更多精彩内容