面對有大量缺失值的數據應該怎樣處理比較合理?

當數據缺失程度達到百分之六十到百分之八十,甚至超過百分之八十以上的時候,用什麼方法填補或者有什麼其他合理措施能從中提煉出有效信息嗎?


建議放棄該數據


總論

取決於缺失的機制以及數據結構。一般很小的缺失有imputation, em, surrogate可以處理。FDA甚至有一些指導意見。對於缺失很多的,也是有辦法的。

比如,生存分析中的刪失數據,是部分信息缺失(雖然通常我們不叫它missing data),實際上在一定的統計假定下依然有完整的處理方式。

再比如,用於產品推薦的矩陣填充技術,利用稀疏性先驗對矩陣元素缺失進行了估計。

但,麻煩在於,天下沒有免費的午餐。缺失機制中僅僅MCAR 或者MAR才有可能可以處理。不討論缺失原因直接瞎做,只能是GIGO。

缺失機制

缺失數據有很多種缺失機制,在不了解原因和機制的時候瞎做基本就是耍流氓。

統計上通常討論的有如下(不限於)三種:

  1. MCAR: Missing completely at random
  2. MAR: Missing at random
  3. NMAR: Misiing not at random

&<&<&<&<&<具體討論論以後再填-

常用標準流程

下面的主要是在clinical trial中, 見ICH E9:http://www.ich.org/fileadmin/Public_Web_Site/ICH_Products/Guidelines/Efficacy/E9/Step4/E9_Guideline.pdf

  1. LOCF: Last observation carried forward

  2. Multiple imputation/EM
  3. BOCF: baseline observation carried forward, 這個東西還有改進版本mBOCF

  4. WOCF: Worst observation carried forward

&<&<&< 其中每個都能寫一篇文章了。

非常規手段舉例

如果認為那種缺失60%就不能做的也是比較拿衣服。比如一種很特殊的缺失:刪失數據(生存分析領域),80%都不是夢。但是不偷換命題,看看這個有意思的東西: Matrix Completion with Noise (使用壓縮感知的理論),以及推薦系統要做的事情。是不是有很親切的感覺?


首先不同意樓上的觀點即直接放棄該數據。

如果是一名專業的統計學學生或者是數據倉庫方面的工作人員就應該知道數據有多麼珍貴,曾經為了一些比較偏的研究方向在圖書館抱著年鑒一遍一遍找,還要考慮到數據真實性的問題,當時無比絕望,我就是從那個時候開始覺得準確的數據有多麼重要,所以我畢業論文選擇缺失值填補方向。

說在前面的話是最好的填補缺失值的方法就是沒有缺失。

當缺失存在時,解決的方法一般有不處理、刪除還有缺失值的觀測和填充缺失值三種。每種方法在某種特殊的情境下都可能是最優的。例如當數據的規模為3000*3000時存在一個單元的缺失,而且不涉及到時間序列等等前後單元格關聯較強的方法,可以直接刪除該還有缺失值的觀測。例如當你使用的數據挖掘演算法或者數據分析演算法允許缺失值存在,並且在設計演算法的時候就考慮到了存在缺失值的情況下如何挖掘更多的信息,你也可以選擇不做處理直接分析含有缺失值的數據。然而可能注意到了,上述的例子有著較大局限性,比如現實生活一般沒有缺失如此輕微的數據集,比如我上述假設的演算法好像真的根本就是不存在的。所以我們只能考慮填充缺失值這條路。

填充缺失值是一項很實際而且很具有挑戰性的工作,所以這方面有不少不錯的演算法,這些如果放在這裡就會佔很大的篇幅而且只要百度就可以查到許多文獻的方法我就不具體一一列出了,下面我說幾個我之前用過的方法。

我曾處理過一個數據集大概有80%的變數缺失超過50%(與題主的遭遇類似),而且隨機缺失很嚴重,也就是說如果直接刪除含有缺失值的觀測,那麼我們可能損失90%以上的觀測,但是由於隨機缺失,其實我們本來可以擁有更多的信息量,所以試圖去填充缺失值。

首先採用最常用的特殊值填充法,即採用特殊值填充缺失值,我們採用了均值和中位數分別進行了填充,二者效果都很差,相比之下因為缺失嚴重所以中位數更加不靠譜,因為填充之後部分變數的均值變化很大,所以最先排除了中位數填充,採用均值填充的好處在於不會讓數據失真很嚴重,而且能保證填充後均值不發生太大變化,但是在缺失很嚴重的情況下問題就來了,你想如果你的變數的2000組取值中1500組都是其餘500組的均值會怎樣?首先整個變數的均值可能變為填充值,而更大的問題在於方差幾乎為0。稍有數據處理知識基礎的人都會知道這意味著什麼,意味著整個樣本的信息量大幅下降,我們這樣的填充破壞了數據的隨機性。

啊啊啊啊忽然想到可能我寫了也不會有人看,我就是一個喜歡半途而廢的人。

還有熱卡、EM、粗糙集填充等方法,有人需要我再更新吧。


數據缺失率達到80%實在太高,基本上沒有什麼統計學方法能救了。

如樓上所說,不管是何種imputation方法,大多要求數據是missing at random。所以你需要首先確認導致數據缺失的原因。如果缺失是隨機發生,可以考慮imputation或者em。但如果不是,那最可能的是數據收集階段就出了問題,那就很難補救了。即使用了imputation來補救,數據分析出的結果也可能是不可信的。


最近正好在做netflix problem, singular value thresholding(SVT)可以用來做矩陣填充,它的核心在於奇異值分解,netflix的數據只有1%有值,99%都是缺失的,用svt還原,填充缺失值效果還不錯,rmse可以收斂到0.01。具體可見我的github: https://github.com/vousmevoyez/Solve-Netflix-problem-using-SVT-in-Python.

但是缺點在於要想完美復原原矩陣, 前提條件是原矩陣必須低秩,即數據最好每列的缺失值比例都比較大,svt用0填充缺失值,這樣填充過的矩陣就低秩了,然後就可以完美還原,但是實際應用中大多是某一列缺失值比較多,其他列大多完整,這種情況下填充效果就比較一般了,所以這種演算法的應用場景十分有限。


剛在另一個問題下回答了R中mice包的缺失值處理,鏈接如下,供參考:

各種統計分析軟體,對於缺失值的默認處理方式是什麼? - Hiu Kung 的回答

如果題主只是想知道大量缺失時的處理情況,恕直言,根本就不符合填補的情況。

題主不妨換個角度看一下吧。

為何會缺失之類,也可以成為一個研究問題的。希望有幫助。


1、 用平均值、中值、分位數、眾數、隨機值等替代

增加了雜訊,缺失值比例小時可用。一般套路就是數值型用中位數填充,離散型用總數填充

2、 用其他變數做預測模型來算出缺失變數

一般就用KNN, LR等模型去做小預測模型。

但是如果其他變數與要預測的變數無關,則預測無意義;但強相關,則不需要使用該預測變數。

所以不建議。

3、 把變數映射到高維空間。比如性別,有男、女、缺失三種情況,則映射成3個變數:是否男、是否女、是否缺失。類似於 one hot。


對數值特徵:

可以將每一維特徵映射到一個空間,這個映射作用到0當且僅當值缺失。

對於非數值特徵:

首先使用聚類方法將眾多取值劃分成幾個簇(強制規定缺失值聚成一簇),然後再one hot encode.


推薦一本書

Statistic Inference

你可以輕鬆從網上下到

看EM的部分。


用灰度理論處理過缺失較少的數據,這種級別的缺失沒處理過


推薦閱讀:

如何零基礎學習 R 語言?
R語言數據可視化的包,除了ggplot2,recharts,shiny等包外,還有哪些很值得推薦的包?
如何使用 ggplot2 ?
輔修計算機的學生該怎麼找計算機相關的工作?
如何用R語言畫廣東省地圖(劃分出21個地級市的邊界)?

TAG:數據 | 數據分析 | 統計 | R編程語言 | 大數據 |