缺失值填充在數據分析領域的預處理過程繞不過去的一個坎,蛋白質組學也不例外,簡單記錄下,可能有些地方有其特殊之處。
-
分析缺失值來源:完全隨機缺失(MCAR,如質譜儀抖動,對數據影響無偏好性,均一分布),隨機缺失(MAR,依賴於其他觀測變量,如時間梯度越長采集越可能出現缺失值),非隨機缺失(MNAR,依賴觀測變量自身,如某些蛋白含量在儀器檢測限以下)。一般我們默認缺失值屬於MCAR或MAR機制類。
-
缺失值在蛋白質組數據中的表現形式:0,NA,NaN,Filtered等。
-
如果數據量多,缺失值比例少,認為刪除所有缺失值對結果不會有影響,則可簡單刪掉。但數據中缺失值比例比較大時(如大於30%),不建議直接刪除。
-
DDA labelfree一般較多,10%-50% 的缺失值。過濾標准不定,如一個蛋白中三個重復,2個有值,建議保留,1個有值,嚴格一點考慮過濾掉。
-
不建議用均值、中位值或最小值來進行填充。
-
常用方法:KNN,Sequential KNN,MI,RandomForest等,所有方法都是基於現有的數據來進行填充的。
-
KNN(K近鄰):常用於分類的監督學習方法,首先計算測試數據與各個訓練數據之間的距離;然后按照距離遞增關系進行排序;選取距離最小的K個點;確定前K個點所在類別的出現頻率;最后返回前K個點中出現頻率最高的類別作為測試數據的預測分類。
缺失值填充過程:先計算目標對象(含缺失值的肽段或蛋白)與其他對象之間的距離(一般默認為歐氏距離,其他對象是無缺失值的),再選擇K個(預先設定)距離最近的對象,然后將對應位置的數值進行平均或加權,最后得到的數值用來表征該缺失值的大小。
impute::impute.knn(data, #矩陣
k=10, #預設近鄰數,默認10
rowmax=0.5, #當某行的缺失值占比超過50%,則用整個樣本的均值填充
colmax=0.8) #當任何一列中缺失值占比80%,計算終止並報錯
- Sequential KNN(有序K近鄰):KNN方法的升級,一般用於處理缺失值比例高的數據。但缺失值如果太多了,不建議保留。
填充過程:首先根據數據中每個對象缺失值的比例進行排序(sequential),從比例最小的那個對象開始計算,對K個近鄰的值進行平均或加權計算填充,這個填充后的對象也會加入后續其他對象缺失值填充的計算當中。
SeqKnn::SeqKNN(data, k=10)
- MI(多重插補):細分的方法有很多,主要有三部分:一是
mice
,將包含缺失值的原始數據集生成幾個完整的數據集(3-10個無缺失值的數據集),再把所有填充值的平均值作為最終的填充結果;第二with
,使用標准方法,如線性回歸模型/廣義線性模型等,對這幾個完整的數據集進行統計分析(不是評價好壞);第三pool
,整合模型分析的結果,輸出最終結果。
data(sleep,package="VIM")
# 1st
imp=mice::mice(sleep,
m=5, #生成完整數據集個數
defaultMethod="pmm", #填充方法
seed=1234) #保證重復性
# 2nd
fit=with(imp,lm(dream~span+Gest)) #選擇線性模型對填充數據集分析
# 3rd
pooled=pool(fit) #整合最終結果
summary(pooled)
-
RF(隨機森林):將含有缺失值的數據按列分開,先用該列的均值進行填充,然后利用完整數據(相當於訓練集)構建隨機森林模型,最后利用該模型對含有缺失值的數據(相當於測試集)進行預測,並可對預測的結果進行評價。
-
沒有哪種方法一定最好,具體問題具體分析。可以用幾種方法填充后比較。也可用一些現有的工具評價,如NAguideR可比較評估23種缺失值填充方法,幫助我們從中選擇最好的一種。