R语言处理DNA等位基因不平衡(一)

简介: 该文介绍了等位基因不平衡分析在生物信息学和基因组学中的应用,用于识别受选择压力的基因。等位基因不平衡指基因座上两个等位基因表达比例不均,可能因自然选择等因素引起。研究通过系统分析特定区域的等位基因不平衡,识别关键基因在生物过程或疾病中的作用。示例代码展示了如何处理和分析数据,包括导入数据、预处理、等位基因不平衡测试以及结果输出。该分析适用于DNA数据,未来将推出针对RNA的数据处理方法。

在生物信息学和基因组学研究中,等位基因不平衡分析是一种重要的方法,用于识别在特定生物过程或疾病状态中可能受到选择压力的基因或基因区域。等位基因不平衡(Allele Imbalance)指的是基因座上两个等位基因表达或存在的比例不等,这种不平衡可能是由于自然选择、遗传漂变或基因流等进化力量的作用。

1. 背景:

基因的等位基因表达不平衡可以揭示关于细胞类型特异性、基因调控机制、遗传变异对表型影响的重要信息。

例如,在肿瘤细胞中,特定基因的等位基因不平衡可能指示肿瘤发展过程中的选择性优势或遗传不稳定性。通过对来自不同组织、不同疾病状态或不同发展阶段的样本进行等位基因不平衡分析,研究人员可以识别出关键的遗传变异,这些变异可能在生物过程的调控或疾病的发生发展中起着关键作用。

本研究旨在通过对特定基因区域内的等位基因不平衡进行系统分析,来识别可能在特定生物过程或疾病中发挥作用的基因或基因区域。利用高通量测序技术产生的大量基因组数据,我们可以细致地分析个体或细胞群中的基因变异,并评估这些变异之间的不平衡关系。

2. demo

2.1 导入包和数据

读取计数文件(例如,某种类型的基因表达或变异数据),并对数据进行初步处理,比如过滤。

args = commandArgs(trailingOnly = TRUE)
filename.count= args[1]
filename.region= args[2]
filename.output= args[3]
print(args)
# load libraries
suppressMessages(library(data.table))
suppressMessages(library(plyr))
suppressMessages(library(dplyr))
suppressMessages(library(rmutil))
suppressMessages(library(rtracklayer))
suppressMessages(library(pbapply))
suppressMessages(library(parallel))
# edit counts
cnt= read.table(filename.count, header=T, skip = 87)

2.2 数据预处理

通过bedtools merge命令(在R中使用系统调用来执行),合并相邻的或重叠的区域,以减少数据中的冗余。

# select colnames
col.names= c("seqnames", "start", "ref.matches", "alt.matches", "ref", "alt")
# edit counts
cnt= read.table(filename.count, header=T, skip = 87)
colnames(cnt) = col.names
cnt$N= rowSums(cnt[, c("ref.matches", "alt.matches")])
# filter counts
cnt = subset(cnt, N >= 10)
# add end position and name
cnt$end= cnt$start

2.3 等位基因不平衡分析

  • 对每个区域内的变异进行等位基因不平衡测试,使用贝塔-二项式模型来估计每个位点的等位基因频率。
  • 使用优化方法(如optimise和optimize)来找到使似然函数最大化的等位基因不平衡参数。
# function to estimate dispersion under assumption of no allele-imbalance
mtmp <- function(par, x, n){
  
  # likelihood given het sites 
  p= dbetabinom(x, n, m= 0.5, s= par)
  
  # maximize likelihood for being het
  -sum(log(p))
}
# estimate dispersion
print("estimating dispersion")
m0<- optimise(mtmp, c(1e-05, 100), x= cnt$ref.matches, n= cnt$N)
d<- m0$minimum
# convert to granges
gr1= cnt %>% makeGRangesFromDataFrame(keep.extra.columns = T)
# test regions
reg= import.bed(filename.region)
reg$name= paste0(seqnames(reg), "_" , start(reg), "_" , end(reg))
# function to estimate allele proportions
ll.new<- function(par, x, n, d){
  
  allelic.imbalance <- par
  
  # for first site
  p1= dbetabinom(x[1], n[1], m= 0.5 + allelic.imbalance, s= d)
  
  # for subsequent sites
  len = length(x)
  
  if(len > 1) {
    
    # precompute likelihoods of each subsequent SNP given 'in-phase' with first SNP
    snp.phase1.like <- dbetabinom(x[2:len], n[2:len], m=0.5 + allelic.imbalance, s = d)
    
    # precompute likelihoods of each subsequent SNP given 'out-of-phase' with first SNP
    snp.phase0.like <- dbetabinom(x[2:len], n[2:len], m=0.5 - allelic.imbalance, s = d)
    
    # create phase array
    phase1.like.array <- rep(NA, len)
    phase0.like.array <- rep(NA, len)
    
    # add likelihood for first site
    phase1.like.array[1] <- p1
    phase0.like.array[1] <- p1
    
    for(i in 2:len) {
      
      # prior SNP was either in-phase or out-of-phase with first SNP, consider
      # both mutually exclusive possibilities when computing combined likelihood of
      # all possible combinations of phases
      
      prev <- (0.5 * phase1.like.array[i-1]) + (0.5 * phase0.like.array[i-1])
      
      phase1.like.array[i] <- prev * snp.phase1.like[i-1]
      
      phase0.like.array[i] <- prev * snp.phase0.like[i-1]
      
    }
    
    # total likelihood is sum of last two elements
    l = -log(0.5*phase1.like.array[len] + 0.5*phase0.like.array[len])
    
  } else {
    
    l = -sum(log(p1))
    
  }
  
  # return
  return(l)
}
# function to estimate allele imbalance
fun = function(i){
  
  # test region
  gr2= reg[i]
  
  # subset by overlaps
  dat= subsetByOverlaps(gr1, gr2, type = "any") %>% as.data.frame()
  
  if(nrow(dat)> 3){
    
    # sort by start
    dat=dat[order(dat$start),]
    
    rownames(dat)<- NULL
    
    m1<- optimize(ll.new, c(-0.49, 0.49), x= dat$ref.matches, n= dat$N, d= d)
    
    # result
    res= data.frame(seqnames= seqnames(gr2),start= start(gr2), end= end(gr2), name= gr2$name, a =  m1$minimum ,nsites= nrow(dat))
    
  } else{
    
    res<- NULL
    
  }
  res
}

2.4 结果合成与输出

将每个区域的分析结果合并成一个列表,然后将该列表转换成数据框,最后写入CSV文件以供后续分析使用。

my.list=llply(1:length(reg), fun, .progress = progress_text(char="+"))
# combine list
res= rbindlist(my.list) %>% as.data.frame()
# output results
write.csv(res , filename.output, row.names = F)

这part的demo特针对于DNA数据,代码已debug,根据各自搭建的环境运行,记得提前加载R包。

下期出RNA的处理~

目录
相关文章
|
搜索推荐 Linux Python
VET:一个基于R语言的VCF数据提取工具,支持按基因ID、物理位置、样品名称提取指定变异信息
VET:一个基于R语言的VCF数据提取工具,支持按基因ID、物理位置、样品名称提取指定变异信息
|
6月前
|
数据可视化 数据挖掘 索引
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码2
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码
|
6月前
|
数据可视化 vr&ar
R语言统计学DOE实验设计:用平衡不完全区组设计(BIBD)分析纸飞机飞行时间实验数据
R语言统计学DOE实验设计:用平衡不完全区组设计(BIBD)分析纸飞机飞行时间实验数据
|
6月前
|
存储 数据可视化 数据挖掘
R语言绘制圈图、环形热图可视化基因组实战:展示基因数据比较
R语言绘制圈图、环形热图可视化基因组实战:展示基因数据比较
|
6月前
|
存储 数据可视化 数据挖掘
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码1
R语言层次聚类、多维缩放MDS分类RNA测序(RNA-seq)乳腺发育基因数据可视化|附数据代码
|
6月前
|
数据可视化 定位技术 网络架构
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
|
6月前
|
数据采集
R语言处理RNA等位基因不平衡(二)
该文档介绍了通过RNA测序数据检测和量化等位基因不平衡的R语言分析流程。首先,RNA测序技术用于研究基因表达的细微变化,包括等位基因特异性表达。接着,通过加载和预处理CSV文件中的计数数据,去除映射错误较多的位点,然后利用二项贝塔分布和优化统计模型(如L-BFGS-B方法)估计等位基因不平衡和分散参数。接下来,为每个基因整合位点信息,通过似然函数最小化计算等位基因不平衡程度,并进行似然比测试以确定显著性。最后,对P值进行FDR校正并输出结果到CSV文件。整个过程涉及数据过滤、建模和统计分析。
48 0
|
6月前
|
机器学习/深度学习 存储 算法
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
108 1
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
19天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
40 3