大数跨境
0
0

R语言利用vcf文件计算等位基因频率和连锁不平衡(LD)R方

R语言利用vcf文件计算等位基因频率和连锁不平衡(LD)R方 小明的数据分析笔记本
2024-05-22
0

代码来源于论文

Assessment of linkage disequilibrium patterns between structural variants and single nucleotide polymorphisms in three commercial chicken populations

https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-022-08418-7

vcf示例文件用之前介绍rMVP包做GWAS分析的那期推文的数据

首先使用beagle做基因型填充

beagle gt=smoove_filtered.vcf out=smoove.filtered.impute nthreads=2

读取vcf文件

library(data.table)
library(tidyverse)
dat.map<-fread("smoove.filtered.impute.vcf.gz",skip = "#CHR")

把 0|1 这种基因型拆分成两列

gt<-data.table()

for(i in 10:ncol(dat.map)){
  tmp<-str_split(dat.map[[i]],fixed("|"),simplify = TRUE) %>% 
    as.data.frame()
  colnames(tmp)<-paste0(colnames(dat.map)[i],c("_1","_2"))
  
  gt[,colnames(tmp):=tmp]
}

这里有一个:=这个符号,暂时没有搞明白这个写法是什么意思,可以一直把列添加到一个数据框里

以下代码把数据框转化成了一个列表

gt %>% 
  t() %>% 
  as.data.table() %>% 
  unclass() -> gt.list

class(gt.list)

计算等位基因频率

p<-list()
n<-gt.list[[1]] %>% length()

for(i in 1:length(gt.list)){
  p[[i]] <- table(gt.list[[1]])/n
}

自定义计算LD的函数

library(compiler)
calcLD <- cmpfun(function(x,pa,ht,p){
  n<-length(x)
  ht_int <- lapply(ht,as.integer)
  R2 <- list()
  if(is.list(p)){
    biv <- which(unlist(lapply(ht,function(x){length(levels(x))}))==2)
    if(length(biv) > 0){
      pb <- unlist(lapply(p[biv],function(x){return(x[1])}))
      pab <- unlist(lapply(ht_int[biv],function(y,x,n){sum(x==1 & y==1)/n},x=as.integer(x),n=n))
      D <- pab - pa[1] * pb
      R2 <- D^2/ ((pa[1] * pb) * ((1-pa[1]) * (1-pb)))
    }
  }else{
    y <- ht
    pb <- p
    
    pab <- matrix(0,nlevels(x),nlevels(y))
    rownames(pab) <- levels(x)
    colnames(pab) <- levels(y)
    
    if(sum(dim(pab))==4){
      pab <- sum(x == rownames(pab)[1] & y == colnames(pab)[1]) / n
      D <- pab - pa[1] * pb[1]
      R2[[1]] <- D^2/ prod(pa,pb) 
      
    }else{
      for(i in 1:nrow(pab)) for(j in 1:ncol(pab)){
        pab[i,j] <- sum(x == rownames(pab)[i] & y == colnames(pab)[j]) / n 
      }
      D <- pab - pa %*% t(pb)
      R2[[1]] <- D^2/ ((pa %*% t(pb)) * ((1-pa) %*% (1-t(pb)))) # not correct yet? How to define multiallelic LD?
    }
  }
  return(R2)
})

整个函数的逻辑还看不明白

这里自定义函数还用到了compiler这个R包,有什么作用暂时不太明白

函数是输入两个位点的等位基因和等位基因频率

calcLD(gt.list[[1]],p[[1]],gt.list[[3]],p[[3]])

gt.list 的格式

image.png

p的数据格式

image.png

以上是本期推文的内容

一个R语言的零散知识点:pivot_longer()函数把多列的数据转换成长格式

library(tidyverse)
df <- data.frame(
  id = 1:3,
  var1 = c("A""B""C"),
  var2 = c("D""E""F"),
  value1 = c(10, 20, 30),
  value2 = c(100, 200, 300)
)

df %>% 
  pivot_longer(cols = c(var1,var2),
               names_to = "ABCDE") %>% 
  pivot_longer(cols = c(value1,value2),
               values_to = "p")

cols 参数的作用是 把向量里的两个列名单独生成一列

cols 里的列如果数据类型不一样是不能合并的

names_to 生成的是新生成的列的列名 values_to 也是指定列名

欢迎大家关注我的公众号

小明的数据分析笔记本

小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!

image.png


【声明】内容源于网络
0
0
小明的数据分析笔记本
分享R语言和python在生物信息领域做数据分析和数据可视化的简单小例子;偶尔会分享一些组学数据处理相关的内容
内容 971
粉丝 0
小明的数据分析笔记本 分享R语言和python在生物信息领域做数据分析和数据可视化的简单小例子;偶尔会分享一些组学数据处理相关的内容
总阅读218
粉丝0
内容971