R語言之缺失值處理

文章和代碼已經(jīng)歸檔至【Github倉庫:https://github.com/timerring/dive-into-AI 】或者【AIShareLab】回復(fù) R語言 也可獲取。

缺失值處理

在實(shí)際的數(shù)據(jù)分析中,缺失數(shù)據(jù)是常常遇到的。缺失值(missing values)通常是由于沒有收集到數(shù)據(jù)或者沒有錄入數(shù)據(jù)。

例如,年齡的缺失可能是由于某人沒有提供他(她)的年齡。大部分統(tǒng)計(jì)分析方法都假定處理的是完整的數(shù)據(jù)集。因此,除了一些專業(yè)化的書籍,大多數(shù)統(tǒng)計(jì)學(xué)教科書很少涉及這一問題。實(shí)際上,在進(jìn)行正式的分析之前,我們需要在數(shù)據(jù)準(zhǔn)備階段檢查數(shù)據(jù)集是否存在缺失值,并通過一些方法彌補(bǔ)因缺失值所造成的損失。

1. 識別缺失值

在 R 中,缺失值用 NA 表示,是“Not Available”的縮寫。函數(shù) is.na( ) 可以用于識別缺失值,其返回結(jié)果是邏輯值 TRUE 或 FALSE。

height <- c(100, 150, NA, 160)
height
# 100 150 <NA> 160
is.na(height)
# FALSE FALSE TRUE FALSE

如果數(shù)據(jù)很少,缺失值的個數(shù)直接可以數(shù)出來,比如上面的變量 height 只有一個缺失值。但是如果數(shù)據(jù)量很大,就需要借助函數(shù) table( ) 了。

table(is.na(height))
# FALSE  TRUE 
#    3     1 

需要注意的是,任何包含 NA 的計(jì)算結(jié)果都是 NA。例如:

mean(height)
#  <NA>

想要得到所有可參與計(jì)算的元素的平均值,應(yīng)該先將 NA 從向量中移除。

mean(height, na.rm = TRUE)
# 136.666666666667

參數(shù) na.rm 表示移除缺失值,其意義與用函數(shù) na.omit( ) 把缺失值省略是一樣的。

mean(na.omit(height))

注意,這里 na.omit( ) 是一個獨(dú)立的函數(shù),它能忽略輸入對象中的缺失值,而 na.rm 只是計(jì)算描述性統(tǒng)計(jì)量的函數(shù)里的一個內(nèi)部參數(shù)。

函數(shù) summary( ) 在計(jì)算向量的統(tǒng)計(jì)量時會自動忽略缺失值,它會給出向量中缺失值的個數(shù)。例如:

summary(height)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#   100.0   125.0   150.0   136.7   155.0   160.0       1 

2. 探索數(shù)據(jù)框里的缺失值

在決定如何處理缺失值之前,了解哪些變量有缺失值、數(shù)目有多少、是什么組合形式等是非常有意義的。下面用一個示例介紹探索缺失值模式的方法。

datasets 包里的數(shù)據(jù)集 iris 也稱鳶尾花數(shù)據(jù),它包含 150 個鳶尾花樣品,分為 3 個品種(Species),每個品種各有 50 個樣品。每個樣品又包含 4 個屬性,即花萼長度(Sepal.Length)、花萼寬度(Sepal.Width)、花瓣長度(Petal.Length)和花瓣寬度(Petal.Width)。該數(shù)據(jù)集不含缺失值。為了說明缺失值的處理方法,首先人為地生成一些缺失數(shù)據(jù),以探索缺失值的模式和檢驗(yàn)補(bǔ)全的效果。

missForest 包里的函數(shù) prodNA( ) 可以隨機(jī)生成缺失值,使用此函數(shù)前需要安裝和加載 missForest 包。

options(warn=-1)
library(missForest)
data(iris)
# 為了使結(jié)果具有可重復(fù)性,我們用函數(shù) `set.seed( )` 設(shè)置了生成隨機(jī)數(shù)的種子。
set.seed(1234)
# 函數(shù) prodNA( ) 默認(rèn)生成數(shù)據(jù)數(shù)目 10% 的缺失值,我們可以通過改變參數(shù) noNA 的值以生成不同數(shù)目的缺失值。
iris.miss <- prodNA(iris)
summary(iris.miss)

從函數(shù) summary( ) 的輸出中可以看到每個變量里缺失值的數(shù)目。要了解數(shù)據(jù)集里缺失值的模式,用圖形展示是一個好辦法。VIM 包提供了大量可視化缺失值的函數(shù),其中函數(shù) aggr( ) 不僅展示每個變量里缺失值的個數(shù)(或比例),還展示多個變量組合下缺失值的個數(shù)(或比例)。例如:

library(VIM)
aggr(iris.miss, prop = FALSE, numbers = TRUE, cex.axis = 0.7)

[圖片上傳失敗...(image-f7a37d-1693121813143)]

在上圖中,第一幅圖是用條形圖展示了每個變量缺失值的個數(shù),這與上面函數(shù) summary( ) 的輸出結(jié)果是一致的;第二幅圖展示了數(shù)據(jù)框中 5 個變量不同組合下缺失值的個數(shù),其中紅色方塊代表缺失值,最右邊的數(shù)字代表個數(shù)。從最下面看起,共有 97 個鳶尾花樣品沒有缺失值,有 9 個鳶尾花樣品知道它們的 4 個屬性但不知道品種。

3. 填充缺失值

一般來說,處理缺失值可以采用下面 3 種方法:

  1. 刪除,刪除帶有缺失值的變量或記錄;
  2. 替換,用均值、中位數(shù)、眾數(shù)或其他值替代缺失值;
  3. 補(bǔ)全,基于統(tǒng)計(jì)模型推測和補(bǔ)充缺失值。

上述方法都是在不得已時使用,無論哪種方法都不能完全彌補(bǔ)數(shù)據(jù)缺失帶來的信息損失。因此,在數(shù)據(jù)收集階段必須盡量避免數(shù)據(jù)的缺失。

3.1 刪除缺失值:na.omit( )、complete.cases( )

如果缺失值的數(shù)量很小,刪除后對分析結(jié)果影響不大,我們可以使用前面提到的函數(shù) na.omit( ) 刪除數(shù)據(jù)框中的缺失值。例如:

iris.sub <- na.omit(iris.miss)
nrow(iris.sub)

刪除缺失值后的數(shù)據(jù)框 iris.sub 只包含 97 條完整記錄。此外,函數(shù) complete.cases( ) 可以用來識別矩陣或數(shù)據(jù)框中沒有缺失值的行,它的返回值是 TRUE 或 FALSE。如果某一行有完整的數(shù)據(jù),返回 TRUE;如果某一行至少包含一個缺失值,則返回 FALSE。所以,上面的命令等價于:

iris.sub <- iris.miss[complete.cases(iris.miss), ]

3.2 使用特定數(shù)值替換缺失值

如果不想直接刪除缺失值,在某些情況下,還可以嘗試使用特定的數(shù)值替換缺失值。
下面以變量 Sepal.Length 為例,用忽略缺失值后的均值替換該變量里的缺失值。先計(jì)算均值:

Sepal.Length.Mean <- mean(iris.miss$Sepal.Length, na.rm = TRUE)
Sepal.Length.Mean
# 5.78695652173913
# 用忽略缺失值后的均值替換該變量里的缺失值
iris.miss1 <- iris.miss
iris.miss1$Sepal.Length[is.na(iris.miss1$Sepal.Length)] <- Sepal.Length.Mean

為檢查補(bǔ)全后的數(shù)據(jù)與原始數(shù)據(jù)的差異,我們可以計(jì)算偏差:

summary((iris$Sepal.Length - iris.miss1$Sepal.Length)/iris$Sepal.Length)
#  Min. 1st Qu. Median Mean 3rd Qu. Max.
# -0.258034 0.000000 0.000000 0.006871 0.000000 0.248447

補(bǔ)全的平均偏差不到 1%,但最大偏差大約為 ±25%。

3.3 多重插補(bǔ)

多重插補(bǔ)(multiple imputation)是一種基于重復(fù)模擬的處理缺失值的方法,常用于處理比較復(fù)雜的缺失值問題。

R 中有多個可以實(shí)現(xiàn)缺失值多重插補(bǔ)的包,如 Amelia 包、mice 包和 mi 包等。其中 mice 包使用鏈?zhǔn)椒匠痰亩嘧兞垦a(bǔ)全法,被廣泛運(yùn)用于數(shù)據(jù)清洗過程中。

mice 包假設(shè)數(shù)據(jù)是隨機(jī)缺失的,并根據(jù)變量的類型建立模型得到預(yù)測值以代替缺失值。在這些模型里,常用的有:

  1. 預(yù)測均值匹配(pmm),實(shí)質(zhì)上就是線性回歸,適用于數(shù)值型變量;
  2. Logistic 回歸(logreg),適用于二分類變量;
  3. 多分類 Logistic 回歸(ployreg),適用于無序多分類變量;
  4. 比例優(yōu)勢比模型(polr),適用于有序多分類變量。

接下來,用函數(shù) mice( ) 補(bǔ)全數(shù)據(jù)框 iris.miss 里的缺失值。

library(mice)
imputed.data <- mice(iris.miss, seed = 1234)
summary(imputed.data)
# PredictorMatrix:
#             Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# Sepal.Length            0           1            1           1       1
# Sepal.Width             1           0            1           1       1
# Petal.Length            1           1            0           1       1
# Petal.Width             1           1            1           0       1
# Species                 1           1            1           1       0

在上面輸出結(jié)果的矩陣 PredictorMatrix 里,每一行代表含有缺失值的變量名,如果該行對應(yīng)的某一列元素為 1,代表該列變量被用于建模預(yù)測。

從上面的輸出結(jié)果中可以看出,對于每一個變量,其余變量都被用于它的缺失值預(yù)測。函數(shù) mice( ) 的輸出結(jié)果是一個列表,其中的對象 imp 也是一個列表,存放的是每個變量缺失值的插補(bǔ)值。例如,使用下面的命令可以得到變量 Sepal.Length 的插補(bǔ)值:

imputed.data$imp$Sepal.Length

函數(shù) mice( ) 通過 Gibbs 抽樣完成,默認(rèn)進(jìn)行 5 次隨機(jī)抽樣,所以一共得到了 5 組插補(bǔ)值。我們可以通過查看上面的輸出結(jié)果以檢查插補(bǔ)值是否合理,然后選擇其中的一組來補(bǔ)全。

例如,取 5 組插補(bǔ)值中的第 3 個:

complete.data <- complete(imputed.data, 3)

為了檢查缺失值的補(bǔ)全效果,對于數(shù)值型變量,我們可以計(jì)算插補(bǔ)值與原始變量值的偏差。

以變量 Sepal.Length 為例:

summary((iris$Sepal.Length-complete.data$Sepal.Length)/iris$Sepal.Length)
#       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
# -0.1428571  0.0000000  0.0000000  0.0007643  0.0000000  0.0945946

補(bǔ)全的平均偏差不到 0.1%,最大偏差大約為 ±13%。因此,這里用多重插補(bǔ)法比用均值替換缺失值的方法效果更好。

數(shù)據(jù)框的最后一個變量 Species 是一個因子,包含 19 個缺失值。為了檢查這種分類變量的缺失值的補(bǔ)全效果,我們可以用函數(shù) table( ) 得到原始變量和插補(bǔ)后變量的列聯(lián)表:

table(iris$Species, complete.data$Species)
#              setosa versicolor virginica
#  setosa         50          0         0
#  versicolor      0         50         0
#  virginica       0          1        49

這種表被稱為 混淆矩陣(confusion matrix),經(jīng)常用于評價模型預(yù)測的準(zhǔn)確度。對角線上的數(shù)字代表預(yù)測值和真實(shí)值一致的個數(shù),非對角線上的數(shù)字代表預(yù)測值和真實(shí)值不一致的個數(shù)。

從上面的輸出結(jié)果可以看出,變量 Species 的 19 個缺失值插補(bǔ)的正確率為 100%。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容