轉(zhuǎn)發(fā)自http://crickcollege.com/news/170.html
有趣的小故事
美國(guó)作家Shel Silverstein有一篇經(jīng)典的圖畫寓言---《缺失的一角》。

故事的主人公缺了一角,于是它開始拼命地尋找自己缺失的那一角。在執(zhí)著的尋找中,它嘗盡世間百味,感悟頗多。當(dāng)然,小編舉這個(gè)例子并沒(méi)有打算跟你從詩(shī)詞歌賦聊到人生哲理,小編想說(shuō)的是,作為科研的搬磚工,在分析數(shù)據(jù)時(shí),往往你的數(shù)據(jù)缺的不是一個(gè)角,而是一堆角,這個(gè)時(shí)候,要不要做故事中那位“小圓”呢?
數(shù)據(jù)缺失的情況
當(dāng)你辛辛苦苦取完樣,累死累活地做完實(shí)驗(yàn),然后滿心期待地上質(zhì)譜采集數(shù)據(jù),等待著那一抹“曙光”照耀你的心扉,一切看似快圓滿了。。??墒牵?dāng)你搜完數(shù)據(jù),打開結(jié)果文件的時(shí)候,面對(duì)的卻經(jīng)常是下面這樣的結(jié)果:

亦或是這樣的:

是不是小宇宙都快要崩潰了?!這時(shí)候你若是跑去問(wèn)你的師兄師姐,這種情況該咋辦?答:“刪掉或者填充吧!”沒(méi)錯(cuò),老司機(jī)就是老司機(jī),一句道破“天機(jī)”!給你的師兄師姐贊一個(gè)先。
其實(shí)你的數(shù)據(jù)遇到這個(gè)情況絕不是你運(yùn)氣不好,這幾乎是一個(gè)不可避免的情況。早有前輩就此做了總結(jié)(doi: 10.1093/bib/bbn004; doi: 10.1002/pmic.200800576, doi: 10.1021/acs.jproteome.5b00981),一般情況下,特別是在“l(fā)abel free”定量的策略下,你的數(shù)據(jù)(不管是肽段還是蛋白質(zhì)的定量信息)里面會(huì)有10%到50% 的缺失值,至少有一個(gè)重復(fù)里面有缺失值的比例有可能會(huì)高達(dá)70%以上。這意思就是說(shuō),當(dāng)你做的重復(fù)越多,每一個(gè)重復(fù)都有定量信息的概率就會(huì)越小。就算你用了標(biāo)記定量,情況雖有改善,但依然擺脫不了這種情況!

數(shù)據(jù)缺失的原因
上面已經(jīng)提到,蛋白質(zhì)組學(xué)數(shù)據(jù)(其它組學(xué)數(shù)據(jù)情況估計(jì)也差不多)中有缺失值的情況幾乎是不可避免的,那么造成這一現(xiàn)狀的原因具體是啥呢?我們也按照缺失值產(chǎn)生的機(jī)制來(lái)簡(jiǎn)單的分析下:
1. 完全隨機(jī)缺失(MCAR,Missing Completely At Random),指的是數(shù)據(jù)的缺失不依賴于自身或者其他變量,完全是隨機(jī)的。比如你在街頭請(qǐng)路人填問(wèn)卷采集數(shù)據(jù),路人很可能由于某種原因(肚子疼,或者他媽喊他回家吃飯等等)中途撤走,那么你的數(shù)據(jù)就不完整了。再比如你的質(zhì)譜在采集數(shù)據(jù)過(guò)程中,不小心受到某種程度的擾動(dòng)(鬼知道儀器經(jīng)歷了什么…),導(dǎo)致你的數(shù)據(jù)受到影響,最后在搜庫(kù)匹配時(shí),無(wú)法給出對(duì)應(yīng)的定量信息。這種情況指不清道不明,完全隨機(jī),所以它對(duì)你整個(gè)數(shù)據(jù)的影響沒(méi)有任何的偏好性,呈現(xiàn)均一分布。
2. 隨機(jī)缺失(MAR,Missing At Random),指的是數(shù)據(jù)的缺失不是完全隨機(jī)的,該類數(shù)據(jù)的缺失依賴于其他觀測(cè)變量。比如時(shí)間梯度越長(zhǎng)的采集越可能有缺失值的出現(xiàn)。這個(gè)時(shí)候,若是我們將時(shí)間變量進(jìn)行控制,那么數(shù)據(jù)的缺失也就變成了完全隨機(jī)的了。所以也有人認(rèn)為MCAR和MAR二者沒(méi)啥區(qū)別,或者認(rèn)為MCAR是MAR的一個(gè)特例(doi:10.1186/1471-2105-13-S16-S5)。
3. 非隨機(jī)缺失(MNAR,Missing Not At Random),指的是數(shù)據(jù)的缺失依賴于觀測(cè)變量自身。比如在質(zhì)譜檢測(cè)的過(guò)程中,某些肽段的含量在儀器的檢測(cè)限以下,這些肽段的定量信息就很有可能丟失,但是你又不能說(shuō)這些肽段真的不存在,所以這種情況是比較糾結(jié)的,這就是所謂的左刪失數(shù)據(jù)(left-censored data)。

強(qiáng)調(diào)點(diǎn):
聊到這,肯定會(huì)有小伙伴有疑問(wèn)了,我怎么才能知道數(shù)據(jù)缺失值產(chǎn)生的原因呢?小編很遺憾地告訴你,其實(shí)是沒(méi)有什么標(biāo)準(zhǔn)的判斷方法的!一般我們默認(rèn)缺失值屬于MCAR或MAR機(jī)制類的,MNAR機(jī)制類的缺失值需要你找到足夠的理由支持才行。
也許有些小伙伴又有疑問(wèn)了,那為啥看到不少文獻(xiàn)(比如doi: 10.1021/acs.jproteome.5b00981, doi:10.1186/1471-2105-13-S16-S5)和書籍(比如《Statistical Analysis with Mssing Data》、《R語(yǔ)言實(shí)戰(zhàn)》)里,對(duì)每一類機(jī)制分析得頭頭是道,貌似他們就能很準(zhǔn)確地判斷數(shù)據(jù)缺失值的原因呢?對(duì)于這個(gè)問(wèn)題,你若細(xì)細(xì)地翻看這些資料,你會(huì)發(fā)現(xiàn)這些作者會(huì)有一個(gè)共性---“站在上帝的視角看問(wèn)題”!什么意思呢?就是這些作者全都是“老司機(jī)”,他們給出的數(shù)據(jù)要不就是選擇那些缺失值產(chǎn)生的機(jī)制比較明確的,或者很容易受大家認(rèn)可的,比如動(dòng)物睡眠數(shù)據(jù)(R語(yǔ)言中sleep數(shù)據(jù));要不就是他們自己根據(jù)某種規(guī)則產(chǎn)出的,比如下圖,作者按照缺失值產(chǎn)生的規(guī)則模擬出相應(yīng)的缺失值(規(guī)則比較簡(jiǎn)單:他們隨機(jī)產(chǎn)生個(gè)閾值,數(shù)據(jù)里面小于這個(gè)閾值的被認(rèn)為是MNAR機(jī)制類的缺失值;MCAR機(jī)制類的缺失值就是隨機(jī)點(diǎn)到哪個(gè)數(shù)據(jù),那么這個(gè)數(shù)據(jù)就被標(biāo)記成缺失值)。

所以,一般說(shuō)來(lái),在某一個(gè)領(lǐng)域經(jīng)驗(yàn)多些(比如一位做實(shí)驗(yàn)的或者管理和維護(hù)儀器設(shè)備的老手,他對(duì)這些器材狀態(tài)的把控度肯定比一般人要高很多),對(duì)自己的數(shù)據(jù)產(chǎn)生的背景及過(guò)程了解的也就多些(這些時(shí)候你就可以按照上面的定義對(duì)應(yīng)著找出你的數(shù)據(jù)缺失值屬于哪一種),你對(duì)自己數(shù)據(jù)中的缺失值認(rèn)識(shí)就會(huì)更有把握,也能比較快的去選擇恰當(dāng)?shù)姆椒ń鉀Q這個(gè)問(wèn)題。所以遇到這類問(wèn)題去跟你的師兄師姐或者導(dǎo)師討論一下,也許你會(huì)對(duì)你的數(shù)據(jù)有進(jìn)一步的認(rèn)識(shí)。
解決辦法及代碼實(shí)現(xiàn)
由于在后續(xù)分析中(比如相關(guān)性分析,PCA分析,Mfuzz分析等),需要的都是完整的數(shù)據(jù)框或者矩陣,所以你的數(shù)據(jù)里面若是含有缺失值將會(huì)影響后續(xù)的分析。而且,當(dāng)你的數(shù)據(jù)中缺失的比例比較大時(shí)(比如大于30%),這時(shí)候還是勸你考慮一下,不要一上來(lái)就把這些數(shù)據(jù)刪掉。我們處理缺失值最重要的目的就是希望“返璞歸真”---去掉缺失值這層外飾,還其最接近真實(shí)值的本質(zhì)!
通過(guò)好多前輩的不懈努力,現(xiàn)有的各類處理缺失值的方法加起來(lái)不下15種,當(dāng)然在本文當(dāng)中,小編不會(huì)對(duì)每一種方法都一一介紹,這里只分享給大伙兒幾個(gè)較常用的方法。
【PS:如果你完全不關(guān)心缺失值問(wèn)題,或者堅(jiān)定地相信刪除缺失值也不會(huì)影響分析結(jié)果,那你大可以簡(jiǎn)單粗暴地刪掉了事?!?br>
Tips:如何識(shí)別缺失值:在R語(yǔ)言中,缺失值被標(biāo)記為NA,判斷一個(gè)值是不是缺失值用is.na函數(shù),如下表:

其中NaN是說(shuō)這個(gè)值不是一個(gè)數(shù),代表的是不可能的值,判斷用is.nan函數(shù);infinite表示無(wú)窮值,Inf表示正無(wú)窮,-Inf表示負(fù)無(wú)窮,判斷使用is.infinite函數(shù)。要注意區(qū)分,不要混淆了。
1. K近鄰法(KNN):該方法主要是通過(guò)預(yù)先設(shè)定的K個(gè)鄰居(其它肽段或者蛋白質(zhì)的表達(dá)量),根據(jù)這些鄰居的信息推算出缺失值的大小。一般的數(shù)據(jù)處理流程是先計(jì)算目標(biāo)對(duì)象(含有缺失值的肽段或者蛋白質(zhì))與其他對(duì)象之間的距離(一般默認(rèn)計(jì)算的是歐氏距離),計(jì)算完成后,選擇K個(gè)(K值是我們預(yù)先設(shè)定的)距離最近的對(duì)象,然后將對(duì)應(yīng)位置的數(shù)值進(jìn)行平均或者加權(quán),其得到的數(shù)值用來(lái)表征該缺失值的大小。R代碼實(shí)現(xiàn):

這里面我們用impute包的imput.knn函數(shù),其中data就是要導(dǎo)入的數(shù)據(jù),一般是矩陣的形式;k就是我們預(yù)先設(shè)定的近鄰數(shù),默認(rèn)為10,根據(jù)經(jīng)驗(yàn)一般取值是10到20之間;rowmax和colmax是控制的導(dǎo)入數(shù)據(jù)中行或者列含有缺失值的比例,比如rowmax=0.5是指當(dāng)某行的數(shù)據(jù)缺失值占的比例超過(guò)了50%,那么這些缺失值就會(huì)用整個(gè)樣本的均值去填充,而不是我們上面提到的根據(jù)K個(gè)鄰居來(lái)填充了;colmax=0.8是指任何一列的數(shù)據(jù)中當(dāng)缺失值的比例超過(guò)了80%,那么計(jì)算就會(huì)停止并會(huì)報(bào)出錯(cuò)誤。
2. 有序K近鄰法(Sequential KNN):該方法是對(duì)上述KNN法的改進(jìn),它在缺失值占比稍微大些的數(shù)據(jù)中表現(xiàn)依然良好。實(shí)現(xiàn)流程是先根據(jù)數(shù)據(jù)中每個(gè)對(duì)象缺失值的比例進(jìn)行排序(這里也就體現(xiàn)出“Sequential”的思想),從比例最小的那個(gè)對(duì)象開始計(jì)算,根據(jù)預(yù)先設(shè)定的K個(gè)近鄰(注意這里是指沒(méi)有缺失值的,KNN法里面并沒(méi)有強(qiáng)調(diào)這一點(diǎn))的值進(jìn)行加權(quán)或者平均計(jì)算填充。此外當(dāng)該對(duì)象填充完畢后,也會(huì)加入后續(xù)其他對(duì)象缺失值填充的計(jì)算當(dāng)中。R代碼實(shí)現(xiàn):

這里我們用SeqKnn包的SeqKNN函數(shù),其中data就是我們要導(dǎo)入的數(shù)據(jù),一般是矩陣的形式;k就是我們預(yù)先設(shè)定的近鄰數(shù),根據(jù)經(jīng)驗(yàn)一般取值是10到20之間。
3. 多重插補(bǔ)法(MI):該方法主要包括3塊內(nèi)容:a,將包含缺失值的原始數(shù)據(jù)集生成幾個(gè)完整的數(shù)據(jù)集(一般生成3-10個(gè)),注意這一步就已經(jīng)完成了缺失值的填充,并且一般我們會(huì)把所有填充值的平均值作為最終的填充結(jié)果;b,使用標(biāo)準(zhǔn)的方法流程去分析這幾個(gè)完整的數(shù)據(jù)集,比如可使用線性回歸模型,廣義線性模型等,注意這一步并不是對(duì)填充結(jié)果好壞的評(píng)判,而是對(duì)填充以后的數(shù)據(jù)集進(jìn)行統(tǒng)計(jì)方法的分析; c,整合模型分析的結(jié)果,輸出最終的結(jié)果。這個(gè)流程可以用下圖來(lái)比較形象的說(shuō)明:

當(dāng)然,在這個(gè)圖中已經(jīng)標(biāo)上每一步常用的函數(shù)了,在這里我們使用的就是R語(yǔ)言中的mice包。代碼實(shí)現(xiàn)如下:


其中是以sleep數(shù)據(jù)(VIM包中動(dòng)物睡眠數(shù)據(jù))為例展開的,mice()就是進(jìn)行插補(bǔ)的函數(shù),它里面m參數(shù)是指生成完整數(shù)據(jù)集的個(gè)數(shù),defaultMethod參數(shù)是指選擇填充缺失值的方法,seed參數(shù)是為了保證結(jié)果的重復(fù)性;with()就是我們進(jìn)行標(biāo)準(zhǔn)方法流程對(duì)填充好的完整數(shù)據(jù)集進(jìn)行分析,這里面我們選擇的是線性模型來(lái)分析做夢(mèng)(Dream)變量與另外兩個(gè)變量(Span,壽命;Gest,妊娠期)之間的線性關(guān)系;pool()函數(shù)整合最終的結(jié)果。
再提一句,如果我們關(guān)注的只是缺失值的填充,上面的代碼只需要運(yùn)行到mice()函數(shù),計(jì)算出結(jié)果就可以了,后面的兩步分析做夢(mèng)與其它兩個(gè)變量的線性關(guān)系這些,就不必運(yùn)行了。
介紹完這3中常用的方法后,可能你還有疑問(wèn):我該使用哪種方法呢?小編不敢斷言哪一種方法就一定優(yōu)越,還是要具體問(wèn)題具體分析,不過(guò)這已經(jīng)有前輩對(duì)這幾種方法進(jìn)行了比較,在這里展示出來(lái)供你參考,如下圖:

其中橫軸表示數(shù)據(jù)中缺失值的占比,縱軸表示均方根誤差,用來(lái)表征填充值的準(zhǔn)確性,值越小表示效果越好。在他們的評(píng)估結(jié)果中, MI方法的整體表現(xiàn)會(huì)稍好一些。
小結(jié)
數(shù)據(jù)出現(xiàn)缺失,雖然這種情況十分討厭,但你幾乎是百分之百會(huì)遇到的,躲也躲不掉!處理這種情況時(shí)要牢記我們最初的愿望--“返璞歸真”。雖然數(shù)據(jù)缺失得不少,但是它們不是缺的一點(diǎn)邏輯都沒(méi)有。處理缺失值的方法很多,本文我們只提到了3種比較常用的方法,對(duì)于其他的方法,以后有機(jī)會(huì)咱們?cè)倮^續(xù)聊。也歡迎大家關(guān)注小編開發(fā)的網(wǎng)站---“悟空”(http://www.omicsolution.org/wu-kong/main/,建議用電腦打開查看學(xué)習(xí)),該網(wǎng)站收錄上述的方法,后期也會(huì)逐漸加入其他的方法,方便大家使用學(xué)習(xí)。