一、什麼是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)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242365.html