您的位置:

falsediscoveryrate的详细阐述

一、什么是falsediscoveryrate?

falsediscoveryrate(FDR)是一种比较常见的统计学参数,它是指在多重检验中被错误地拒绝掉的比例。在统计学实验中,我们经常需要同时测试多个假设是否成立,如果使用传统的显著性检验,很容易出现在保持α错误率的同时,出现大量的假阳性结果。FDR的思路就是在保证控制假阳性率的情况下,尽量增加发现真阳性的能力。


import statsmodels.stats.multitest as smt

# 使用Benjamini-Hochberg方法进行多重比较校正
pvals = [0.1, 0.05, 0.08, 0.001, 0.02, 0.1, 0.005, 0.07]
reject, pvals_corrected, alphacSidak, alphacBonf = smt.multipletests(pvals, alpha=0.05, method='fdr_bh')

二、FDR和FPR的区别

FDR和FPR(false positive rate)都是表示假阳性的参数,但是它们之间有本质区别。FPR是指真实负样本中被错误地预测为正样本的比例,一般在二分类问题中使用。而FDR则是在多重比较中使用,它和FPR的不同之处在于,FDR是在所有被预测为正样本的样本中,错误预测阳性的比例。

三、常用的FDR校正方法

目前,常用的FDR校正方法主要包括:

1. Benjamini-Hochberg方法

Benjamini-Hochberg方法是一种基于排序的FDR校正方法,先把所有的p值从小到大排序,然后计算每个位置的FDR阈值,依次扫描p排序序列,如果发现第k个位置的p值小于等于FDR阈值,则拒绝前k个假设,并接受后面所有假设。这种方法可以保证控制FDR的同时,尽量减小拒绝有效假设的概率。

2. Bonferroni方法

Bonferroni方法是一种传统的多重比较校正方法,它的思路是将原来的显著性水平α除以总的比较次数m,得到校正后的显著性水平,然后使用校正后的显著性水平来判断每个检验假设是否显著。这种方法比较保守,可能会出现拒绝掉许多真实有效的假设的问题。

3. Sidak方法

Sidak方法也是一种传统的多重比较校正方法,它和Bonferroni方法类似,但是它使用校正后的显著性水平来计算每个假设的拒绝域,从而保证整体FDR的控制。但是该方法对于大量检验的情况下会变得极为保守。


# 使用Bonferroni方法进行多重比较校正
pvals = [0.1, 0.05, 0.08, 0.001, 0.02, 0.1, 0.005, 0.07]
reject, pvals_corrected, alphacSidak, alphacBonf = smt.multipletests(pvals, alpha=0.05, method='bonferroni')

四、FDR在基因表达分析中的应用

在基因表达分析中,FDR被广泛应用于屏蔽假阳性的基因列表。在高通量生物实验中,基因表达数据往往具有大量的特征,包括基因、微小RNA、蛋白质、代谢产物和表观遗传位点等,需要进行多个特征的比较检验,这时候FDR校正方法就可以帮助我们确定真实的阳性特征。例如,对于基因表达差异评估,NAIVE是一种FDR校正方法,它可以控制假阳性比例,同时查找差异表达的基因。


import pandas as pd
from scipy.stats import ttest_ind

df = pd.read_csv('gene_expression.csv')
# 进行t检验
control = df[df.group == 'control']
experiment = df[df.group == 'experiment']
results = []
for gene in df.columns[1:]:
   _, p = ttest_ind(control[gene], experiment[gene])
   results.append(p)
# 对p值进行FDR校正
reject, pvals_corrected, alphacSidak, alphacBonf = smt.multipletests(results, alpha=0.05, method='fdr_bh')
# 找出显著差异基因表达
sign_gene = df.columns[1:][reject]

五、FDR在机器学习中的应用

在机器学习中,FDR可以应用于特征选择,帮助我们选出对于任务最为有意义的特征集合。特征选择是机器学习中一个重要的预处理步骤,其目的在于减少输入特征数量,提高训练的效率及泛化能力。FDR可以作为一种特征选择的标准来筛选重要的特征,即保证在所有选择的特征中,少于一定比例为假阳性的。


from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 计算每个特征的t检验统计量
F, pvals = f_classif(X_train, y_train)
# 根据p值进行FDR校正
reject, pvals_corrected, alphacSidak, alphacBonf = smt.multipletests(pvals, alpha=0.05, method='fdr_bh')

# 选择显著性特征进行分类
X_train_selected = X_train[:, reject]
X_test_selected = X_test[:, reject]

# 使用逻辑回归模型进行分类
clf = LogisticRegression()
clf.fit(X_train_selected, y_train)
y_pred = clf.predict(X_test_selected)
score = f1_score(y_test, y_pred)