单变量和多变量对基因表达式的预测能力对比(上)

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 单变量和多变量对基因表达式的预测能力对比

在这篇文章中,我们将比较LASSO、PLS、Random Forest等多变量模型与单变量模型的预测能力,如著名的差异基因表达工具DESeq2以及传统的Mann-Whitney U检验和Spearman相关。使用骨骼肌RNAseq基因表达数据集,我们将展示使用多变量模型构建的预测得分,以优于单变量特征选择模型。

骨骼肌RNAseq基因表达数据

在这里,我们将量化几种特征选择方法的预测能力:a)单变量(逐个)特征选择,b)多变量(一起)特征选择。出于演示目的,我们将使用来自GTEX人体组织基因表达联盟的骨骼肌RNAseq基因表达数据集(为简单起见,随机抽取1000个基因)。

640.png

版本6的GTEX骨骼肌数据集包括157个样本。我们装载基因表达矩阵X,去除低表达基因。为了与组学整合的后选择特征相一致,我们将使用性别作为我们将要预测的响应变量Y。让我们通过降维(如PCA)来快速可视化这些样本。

library("mixOmics")
X<-read.table("GTEX_SkeletalMuscles_157Samples_1000Genes.txt",
header=TRUE,row.names=1,check.names=FALSE,sep="\t")
X<-X[,colMeans(X)>=1]
Y<-read.table("GTEX_SkeletalMuscles_157Samples_Gender.txt",
header=TRUE,sep="\t")$GENDERnames(Y)<-rownames(X)
pca.gtex<-pca(X, ncomp=10)
plotIndiv(pca.gtex, group=Y, ind.names=FALSE, legend=TRUE)

640.png

正如我们所看到的,PCA图并没有根据骨骼肌基因表达数据显示出男性和女性之间的明显区别。我们只能假设基因性染色体(X, Y)可以提供一个完美的男性和女性之间的分离,但是我们没有观察到这种情况,因为:1)大多数基因来自常染色体,2)随机抽样 大约有1000个基因,因此我们可能没有从X和Y染色体上取样许多基因。在下一节中,我们将把数据集分割成训练和测试子集,然后在训练集上实现单变量和多变量特征选择(训练)模型,并使用平衡假阳性(FPR)和真阳性(TPR)率的roc曲线技术对测试集上的模型进行评估。

性别预测:LASSO与单变量方法

为了评估单变量和多变量模型的预测能力,我们需要对独立的数据集进行训练和评估。为此,让我们将数据集划分为训练(80%的样本)和测试(20%的样本)子集。为了确保我们的评估不基于数据的特定“幸运”拆分,我们将多次对训练和测试子集执行随机拆分,多次计算每次ROC曲线并平均多个ROC曲线。这样,我们将一举两得:为每个模型的ROC曲线建立置信区间,并使ROC曲线平滑且美观,否则,除非您在测试中有大量样本,否则它们将会出现各种问题。

在本篇文章中,我将添加另一种非ivarite特征选择方法,即Mann-Whitney U检验,该检验应在很大程度上与Spearman相关性相比较,因为两者都是非参数和基于秩的单变量方法,因此不假定数据的特定分布。为了将通过单变量方法单独选择的基因组合到预测得分中,我们将使用它们的表达与性别之间的个体关联性的p值对它们进行排名,并通过Bonferroni程序校正多次测试。经过多次测试调整后,这通常会在训练数据集上产生一些差异表达的基因。此外,可以通过计算其在训练数据集上的作用/权重的乘积(Spearman rho和男性与女性之间基因表达的倍数变化的对数),将差异显着表达(男性与女性之间)的基因折叠成预测得分。以及来自测试数据集的样本的基因表达值。让我们对其进行编码,并比较模型之间的ROC曲线。

roc_obj_univar_FPR_list<-list(); roc_obj_univar_TPR_list<-list()
roc_obj_wilcox_univar_FPR_list<-list();roc_obj_wilcox_univar_TPR_list<-list()
roc_obj_multivar_FPR_list<-list(); roc_obj_multivar_TPR_list<-list()
roc_obj_univar_AUC<-vector(); roc_obj_wilcox_univar_AUC<-vector()
roc_obj_multivar_AUC<-vector()
for(jin1:100)
{
#RANDOMLYSPLITDATASETINTOTRAINANDTESTtest_samples<-rownames(X)[sample(1:length(rownames(X)),
round(length(rownames(X))*0.2))]
train_samples<-rownames(X)[!rownames(X)%in%test_samples]
X.train<-X[match(train_samples,rownames(X)),]
X.test<-X[match(test_samples,rownames(X)),]
Y.train<-Y[match(train_samples,names(Y))];Y.test<-Y[match(test_samples,names(Y))]
#TRAINANDEVALUATEMULTIVARIATELASSOMODELlasso_fit<-cv.glmnet(as.matrix(X.train), Y.train,family="binomial",alpha=1)
coef<-predict(lasso_fit, newx=as.matrix(X.test), s="lambda.min")
roc_obj_multivar<-rocit(as.numeric(coef),Y.test)
#TRAINANDEVALUATEUNIVARIATESPEARMANCORRELATIONMODELrho<-vector(); p<-vector()
for(iin1:dim(X.train)[2])
{
corr_output<-cor.test(X.train[,i],as.numeric(Y.train),method="spearman")
rho<-append(rho,as.numeric(corr_output$estimate))
p<-append(p,as.numeric(corr_output$p.value))
}
output_univar<-data.frame(GENE=colnames(X.train),SPEARMAN_RHO=rho,PVALUE=p)
output_univar$FDR<-p.adjust(output_univar$PVALUE,method="BH")
output_univar<-output_univar[order(output_univar$FDR,output_univar$PVALUE,
-output_univar$SPEARMAN_RHO),]
output_univar<-output_univar[output_univar$FDR<0.05,]
my_X<-subset(X.test,select=as.character(output_univar$GENE))
score<-list()
for(iin1:dim(output_univar)[1])
{
score[[i]]<-output_univar$SPEARMAN_RHO[i]*my_X[,i]
}
roc_obj_univar<-rocit(colSums(matrix(unlist(score), ncol=length(Y.test),
byrow=TRUE)),Y.test)
#TRAINANDEVALUATEMANN-WHITNEYUTESTUNIVARIATEMODELwilcox_stat<-vector(); p<-vector(); fc<-vector()
for(iin1:dim(X.train)[2])
{
wilcox_output<-wilcox.test(X.train[,i][Y.train=="Male"],
X.train[,i][Y.train=="Female"])
wilcox_stat<-append(wilcox_stat,as.numeric(wilcox_output$statistic))
fc<-append(fc,mean(X.train[,i][Y.train=="Male"])/mean(
X.train[,i][Y.train=="Female"]))
p<-append(p,as.numeric(wilcox_output$p.value))
}
output_wilcox_univar<-data.frame(GENE=colnames(X.train),MWU_STAT=wilcox_stat,
FC=fc,PVALUE=p)
output_wilcox_univar$LOGFC<-log(output_wilcox_univar$FC)
output_wilcox_univar$FDR<-p.adjust(output_wilcox_univar$PVALUE,method="BH")
output_wilcox_univar<-output_wilcox_univar[order(output_wilcox_univar$FDR,
output_wilcox_univar$PVALUE),]
output_wilcox_univar<-output_wilcox_univar[output_wilcox_univar$FDR<0.05,]
my_X<-subset(X.test,select=as.character(output_wilcox_univar$GENE))
score<-list()
for(iin1:dim(output_wilcox_univar)[1])
{
score[[i]]<-output_wilcox_univar$LOGFC[i]*my_X[,i]
}
roc_obj_wilcox_univar<-rocit(colSums(matrix(unlist(score),ncol=length(Y.test),
byrow=TRUE)),Y.test)
#POPULATEFPRANDTPRVECTORS/MATRICESroc_obj_univar_FPR_list[[j]]<-roc_obj_univar$FPRroc_obj_univar_TPR_list[[j]]<-roc_obj_univar$TPRroc_obj_wilcox_univar_FPR_list[[j]]<-roc_obj_wilcox_univar$FPRroc_obj_wilcox_univar_TPR_list[[j]]<-roc_obj_wilcox_univar$TPRroc_obj_multivar_FPR_list[[j]]<-roc_obj_multivar$FPRroc_obj_multivar_TPR_list[[j]]<-roc_obj_multivar$TPRroc_obj_univar_AUC<-append(roc_obj_univar_AUC,roc_obj_univar$AUC)
roc_obj_wilcox_univar_AUC<-append(roc_obj_wilcox_univar_AUC,
roc_obj_wilcox_univar$AUC)
roc_obj_multivar_AUC<-append(roc_obj_multivar_AUC,roc_obj_multivar$AUC)
print(paste0("FINISHED ",j," ITERATIONS"))
}
#AVERAGEMULTIPLEROC-CURVESOREACHMODELANDPLOTMEANROC-CURVESroc_obj_univar_FPR_mean<-colMeans(matrix(unlist(roc_obj_univar_FPR_list),
ncol=length(Y.test)+1,byrow=TRUE))
roc_obj_univar_TPR_mean<-colMeans(matrix(unlist(roc_obj_univar_TPR_list),
ncol=length(Y.test)+1,byrow=TRUE))
roc_obj_wilcox_univar_FPR_mean<-colMeans(matrix(
unlist(roc_obj_wilcox_univar_FPR_list), ncol=length(Y.test)+1,byrow=TRUE))
roc_obj_wilcox_univar_TPR_mean<-colMeans(matrix(
unlist(roc_obj_wilcox_univar_TPR_list), ncol=length(Y.test)+1,byrow=TRUE))
roc_obj_multivar_FPR_mean<-colMeans(matrix(unlist(roc_obj_multivar_FPR_list),
ncol=length(Y.test)+1,byrow=TRUE))
roc_obj_multivar_TPR_mean<-colMeans(matrix(unlist(roc_obj_multivar_TPR_list),
ncol=length(Y.test)+1,byrow=TRUE))
plot(roc_obj_univar_FPR_mean,roc_obj_univar_TPR_mean,col="green",
ylab="SENSITIVITY (TPR)",xlab="1 - SPECIFISITY (FPR)",cex=0.4,type="o")
lines(roc_obj_multivar_FPR_mean,roc_obj_multivar_TPR_mean,cex=0.4,col="blue",
type="o",lwd=2)
lines(roc_obj_wilcox_univar_FPR_mean,roc_obj_wilcox_univar_TPR_mean,cex=0.4,
col="red",type="o",lwd=2)
lines(c(0,1),c(0,1),col="black")
legend("bottomright", inset=.02,
c("Multivarite: LASSO","Univarite: SPEARMAN",
"Univarite: MANN-WHITNEY U TEST"), fill=c("blue","green","red"))
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
4月前
|
C# 开发者
C# 10.0引入常量插值字符串:编译时确定性的新篇章
【1月更文挑战第22天】在C# 10.0中,微软为开发者带来了一项引人注目的新特性——常量插值字符串。这一功能允许在编译时处理和计算字符串插值表达式,从而得到可以在编译时确定的常量字符串。本文将深入探讨C# 10.0中常量插值字符串的概念、工作原理、使用场景及其对现有字符串处理方式的改进,旨在帮助读者更好地理解和应用这一强大的新特性。
|
1月前
|
机器学习/深度学习 数据处理 Python
深入理解双变量(二元)正态投影:理论基础、直观解释与应用实例
本文探讨了统计学与机器学习中的二元投影技术,它基于二元正态分布,用于预测一个变量在给定另一变量值时的期望值。文章分为三部分:首先介绍了二元正态投影的基本公式及其在回归中的应用;接着通过直观解释和模拟展示了不同相关性下变量间的关系;最后运用投影公式推导出线性回归的参数估计,并通过实例说明其在预测房屋价格等场景中的应用。附录中详细推导了二元线性投影的过程。二元投影作为一种强大工具,在数据分析中帮助简化复杂问题并揭示数据背后的规律。
36 1
深入理解双变量(二元)正态投影:理论基础、直观解释与应用实例
|
4月前
stata对包含协变量的模型进行缺失值多重插补分析
stata对包含协变量的模型进行缺失值多重插补分析
|
4月前
R语言计量经济学:虚拟变量(哑变量)在线性回归模型中的应用
R语言计量经济学:虚拟变量(哑变量)在线性回归模型中的应用
|
4月前
|
Java 编译器
变量的分类和作用1
变量的分类和作用
32 0
|
4月前
SPSS两变量相关性分析
SPSS两变量相关性分析
93 0
|
资源调度 算法 关系型数据库
概率图推断之变量消除算法
事实证明,推理是一项颇具挑战的任务。对于很多我们感兴趣的概率,要准确回答这些问题都是NP难题。至关重要的是,推理是否容易处理取决于描述概率的图的结构。尽管有些问题很难解决,我们仍然可以通过近似推理方法获得有用的答案。
244 0
概率图推断之变量消除算法
|
数据挖掘
假设检验多重比较的P值修正
在进行假设检验时,我们通常会使用P值来判断样本数据是否支持原假设。当我们进行多重比较时,也就是对多个假设进行检验时,如果不进行P值修正,就会出现多重比较问题。多重比较问题指的是在进行多次假设检验时,由于进行多次检验,就会增加发生假阳性的概率,从而导致P值的误判。这种误判可能会导致我们错误地拒绝原假设或者错误地接受备择假设,从而影响数据分析的准确性和可靠性。为了避免多重比较问题,进行P值修正可以有效地避免多重比较问题的发生。
509 0
|
机器学习/深度学习
数理逻辑—命题公式及其赋值与分类
数理逻辑—命题公式及其赋值与分类
|
机器学习/深度学习
单变量和多变量对基因表达式的预测能力对比(下)
单变量和多变量对基因表达式的预测能力对比
178 0
单变量和多变量对基因表达式的预测能力对比(下)