生信分析工具包GWASgwas

Matrix eQTL分析

2022-03-13  本文已影响0人  杨博士聊生信

目前针对QTL分析有很多软件,比如Plink、 Merlin、R/qtl、FastMap等等,今天给大家分享一下如何使用Matrix eQTL进行分析。首先我们先了解一下什么是eQTL以及eQTL的分类。
表达数量性状基因座(expression Quantitative Trait Loci, eQTL):指染色体上一些能特定调控mRNA和蛋白质表达水平的区域,其mRNA/蛋白质的表达水平量与数量性状成比例关系。其中eQTL又分为cis-eQTL和trans-eQTL。
顺式作用eQTL(cis-eQTL):指某个基因的eQTL定位到该基因所在的基因组区域,表明可能是该基因本身的差别引起的mRNA水平变化。
**反式作用eQTL(trans-eQTL): ** 指某个基因的eQTL定位到其他基因组区域,表明其他基因的差别控制该基因mRNA水平的差异。

Matrix eQTL是一款针对大型矩阵可以超快运行进行eQTL分析的软件(http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/)。
运行这款软件,需要提前准备5个文件文件,基因型文件SNP.txt, 表达文件GE.txt, 协变量文件Covariates.txt, 基因位置文件geneloc.txt和SNP位置文件snploc.txt。我们先看看这几个文件是什么格式。
file 1:SNP.txt

SNP.txt.jpg
行代表SNP,列代表个体

file 2: snpsloc.txt


snploc.txt.jpg

包含3列,第一列SNP id, 第二列染色体, 第三列SNP位置

file 3: GE.txt


GE.txt.jpg

行代表基因表达量,列代表个体

file 4: geneloc.txt


geneloc.txt.jpg

包含3列,第一列基因id, 第二列染色体, 第三列基因起始位置,第三列基因终止位置。

file 5: Covariates.txt


Covariates.txt.jpg

协变量文件包含个体的性别和年龄。

接下来我们一起学习一下如何使用Matrix eQTL进行分析。

BiocManager::install("MatrixEQTL") #安装R包

测试所有基因-SNP对并绘制所有p值的直方图
base.dir = find.package("MatrixEQTL") #获取R包MatrixEQTL的路径
useModel = modelLINEAR #三种模型可选(modelANOVA or modelLINEAR or modelLINEAR_CROSS),这里我们选择modelLINEAR
SNP_file_name = paste(base.dir, "/data/SNP.txt", sep="") #获取SNP文件位置
SNP_file = data.table::fread(SNP_file_name, header=T) #读取SNP文件,可以在R中查看
expression_file_name = paste(base.dir, "/data/GE.txt", sep="") #获取基因表达量文件位置
expression_file = data.table::fread(expression_file_name, header=T) #读取基因表达量文件,可以在R中查看
covariates_file_name = paste(base.dir, "/data/Covariates.txt", sep="") #读取协变量文件
covariates_file = data.table::fread(covariates_file_name, header=T) #读取协变量文件,可在R中查看
output_file_name = tempfile() # 设置输出文件
pvOutputThreshold = 1e-2 #定义gene-SNP associations的显著性P值
errorCovariance = numeric() #定义误差项的协方差矩阵 (用的很少)

#加载基因型文件
snps = SlicedData$new() #创建SNP文件为S4对象(S4对象是该包的默认输入方式)
snps$fileDelimiter = "\t"       #指定SNP文件的分隔符
snps$fileOmitCharacters = "NA" #定义缺失值
snps$fileSkipRows = 1        #跳过第一行(适用于第一行是列名的情况)
snps$fileSkipColumns = 1     #跳过第一列(适用于第一列是SNP ID的情况)
snps$fileSliceSize = 2000      #每次读取2000条数据
snps$LoadFile( SNP_file_name ) #载入SNP文件

#加载基因表达文件
gene = SlicedData$new()
gene$fileDelimiter = "\t" 
gene$fileOmitCharacters = "NA"
gene$fileSkipRows = 1
gene$fileSkipColumns = 1
gene$fileSliceSize = 2000
gene$LoadFile(expression_file_name)

#加载协变量
cvrt = SlicedData$new()
cvrt$fileDelimiter = "\t"
cvrt$fileOmitCharacters = "NA"
cvrt$fileSkipRows = 1
cvrt$fileSkipColumns = 1
cvrt$fileSliceSize = 2000
cvrt$LoadFile( covariates_file_name )
文件的输入部分结束

#运行分析
me = Matrix_eQTL_engine(  #进行eQTL分析的主要函数
  snps = snps,  #指定SNP 文件
  gene = gene,  #指定基因表达量文件
  cvrt = cvrt,   #指定协变量文件
  output_file_name = output_file_name,  #指定输出文件
  pvOutputThreshold = pvOutputThreshold,  #指定显著性P值
  useModel = useModel,  #指定使用的计算模型
  errorCovariance = errorCovariance, #指定误差项的协方差矩阵
  verbose = TRUE,
  pvalue.hist = TRUE,
  min.pv.by.genesnp = FALSE,
  noFDRsaveMemory = FALSE)

#结果
cat('Analysis done in: ', me$time.in.sec, ' seconds', '\n'); #查看分析所用时间
cat('Detected eQTLs:', '\n'); 
show(me$all$eqtls)  #查看超过阈值的eQTL
#画所有p-value直方图
plot(me)
Histogram for all p value.jpeg
Test local and distand gene-SNP pairs separately and plot Q-Q plots of local and distant p-values

Matrix eQTL可以区分顺式(cis,local)和反式(trans,distant)eQTL,主要用Matrix_eQTL_main函数来分析。

library(MatrixEQTL) #加载R包

base.dir = find.package('MatrixEQTL'); #找到示例数据所在路径

###设置

#使用modelLINEAR模型
useModel = modelLINEAR; # modelANOVA, modelLINEAR, or modelLINEAR_CROSS

#基因型文件名
SNP_file_name = paste(base.dir, "/data/SNP.txt", sep="");
snps_location_file_name = paste(base.dir, "/data/snpsloc.txt", sep="");

#基因表达文件名
expression_file_name = paste(base.dir, "/data/GE.txt", sep="");
gene_location_file_name = paste(base.dir, "/data/geneloc.txt", sep="");

#协变量文件名
covariates_file_name = paste(base.dir, "/data/Covariates.txt", sep=""); #如果没有协变量,设置为character()

#输出文件名,分为顺式和反式
output_file_name_cis = tempfile(); #顺式
output_file_name_tra = tempfile(); #反式

#只有在高于阈值重要的gene-SNP关联对才会被保存
pvOutputThreshold_cis = 2e-2;
pvOutputThreshold_tra = 1e-2;

#误差协方差矩阵
#设置为numeric()
errorCovariance = numeric();
#errorCovariance = read.table("Sample_Data/errorCovariance.txt");

#Distance for local gene-SNP pairs
cisDist = 1e6;

#加载基因型数据
snps = SlicedData$new();
snps$fileDelimiter = "\t";       # 指定SNP文件的分隔符Tab键
snps$fileOmitCharacters = "NA"; #定义缺失值;
snps$fileSkipRows = 1;        #跳过第一行(适用于第一行是列名的情况)
snps$fileSkipColumns = 1;     #跳过第一列(适用于第一列是SNP ID的情况)snps$fileSliceSize = 2000;      #每次读取2000条数据snps$LoadFile(SNP_file_name); #载入SNP文件

#加载基因表达量数据
gene = SlicedData$new();
gene$fileDelimiter = "\t";
gene$fileOmitCharacters = "NA"; 
gene$fileSkipRows = 1; 
gene$fileSkipColumns = 1; 
gene$fileSliceSize = 2000; 
gene$LoadFile(expression_file_name);

#加载协变量
cvrt = SlicedData$new();
cvrt$fileDelimiter = "\t"; 
cvrt$fileOmitCharacters = "NA";
cvrt$fileSkipRows = 1; 
cvrt$fileSkipColumns = 1;
if(length(covariates_file_name)>0) {
  cvrt$LoadFile(covariates_file_name);
}

#读取基因型和基因位置文件
snpspos = read.table(snps_location_file_name, header = TRUE, stringsAsFactors = FALSE);
genepos = read.table(gene_location_file_name, header = TRUE, stringsAsFactors = FALSE);

#运行分析
me = Matrix_eQTL_main(
  snps = snps, 
  gene = gene, 
  cvrt = cvrt,
  output_file_name  = output_file_name_tra,
  pvOutputThreshold = pvOutputThreshold_tra,
  useModel = useModel, 
  errorCovariance = errorCovariance, 
  verbose = TRUE, 
  output_file_name.cis = output_file_name_cis,
  pvOutputThreshold.cis = pvOutputThreshold_cis,
  snpspos = snpspos, 
  genepos = genepos,
  cisDist = cisDist,
  pvalue.hist = "qqplot",
  min.pv.by.genesnp = FALSE,
  noFDRsaveMemory = FALSE);

unlink(output_file_name_tra);
unlink(output_file_name_cis);

#结果:
cat('Analysis done in: ', me$time.in.sec, ' seconds', '\n');
cat('Detected local eQTLs:', '\n');
show(me$cis$eqtls) #检测到的顺式eQTLs
    snps    gene statistic       pvalue          FDR      beta
1 Snp_05 Gene_03 38.812160 5.515519e-14 5.515519e-12 0.4101317
2 Snp_04 Gene_10  3.201666 7.608981e-03 3.804491e-01 0.2321123
cat('Detected distant eQTLs:', '\n');
show(me$trans$eqtls) #检测到的反式eQTLs
    snps    gene statistic      pvalue       FDR       beta
1 Snp_13 Gene_09 -3.914403 0.002055817 0.1027908 -0.2978847
2 Snp_11 Gene_06 -3.221962 0.007327756 0.1619451 -0.2332470
3 Snp_14 Gene_01  3.070005 0.009716705 0.1619451  0.2147077
#Plot the Q-Q plot of local and distant p-values
plot(me)
QQ-plot.jpeg

参考文献:
Shabalin A A. Matrix eQTL: ultra fast eQTL analysis via large matrix operations[J]. Bioinformatics, 2012, 28(10): 1353-1358.

上一篇下一篇

猜你喜欢

热点阅读