📜  如何在 R 中估算缺失值?(1)

📅  最后修改于: 2023-12-03 14:52:31.681000             🧑  作者: Mango

如何在 R 中估算缺失值?

在 R 中,常常需要对数据集进行处理,处理过程中经常会遇到数据缺失的情况。如果数据缺失的记录较少,那么可以直接删除这些记录;但是如果缺失的数据非常严重,那么直接删除记录可能会对后续分析产生很大的影响。此时,估算缺失值就成为了一个必要的步骤。本文将介绍在 R 中估算缺失值的方法。

先生成一个含有缺失值的数据集,演示如何估算缺失值。

set.seed(123)
data <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
data[sample(1:10, 3), "a"] <- NA
data[sample(1:10, 4), "b"] <- NA
data[sample(1:10, 2), "c"] <- NA
data

输出结果如下:

             a          b           c
1  -0.56047565 -1.0678237          NA
2  -0.23017749  0.2179749 -0.15579551
3   1.55870831 -1.0260044 -0.25816905
4   0.07050839         NA          NA
5   0.12928774 -0.7288912 -0.55982532
6  -1.71506499         NA   0.3326119
7   0.46091621  0.4530836 -1.02642090
8  -1.26506123         NA   1.2566933
9  -0.68685285 -0.3649610  0.5476980
10 -0.44566197         NA          NA

可以看到,data 数据集中含有缺失值。

方法 1:用平均数估算
R 代码
# 用平均数估算
data_a_new <- data
data_a_new[is.na(data_a_new$a), "a"] <- mean(data$a, na.rm = TRUE)
data_a_new[is.na(data_a_new$b), "b"] <- mean(data$b, na.rm = TRUE)
data_a_new[is.na(data_a_new$c), "c"] <- mean(data$c, na.rm = TRUE)
data_a_new
代码解释

上面的代码使用了平均数来估算缺失值。首先,用 mean() 函数计算每个变量的平均数。然后,使用 is.na() 函数判断缺失值的位置,将缺失值用平均数替换。由于计算平均数的函数 mean() 不含有缺失值,需要将参数 na.rm 设为 TRUE,表示将缺失值排除在外。

运行结果

输出结果如下:

             a           b           c
1  -0.56047565 -1.06782370  0.00697377
2  -0.23017749  0.21797490 -0.15579551
3   1.55870831 -1.02600440 -0.25816905
4   0.07050839 -0.18415833  0.00697377
5   0.12928774 -0.72889120 -0.55982532
6  -1.71506499 -0.18415833  0.33261190
7   0.46091621  0.45308360 -1.02642090
8  -1.26506123 -0.18415833  1.25669330
9  -0.68685285 -0.36496101  0.54769800
10 -0.44566197 -0.18415833  0.00697377

可以看到,缺失值已经被平均数替代。

方法 2:多重插补估算

多重插补估算是一种较为准确的估算方法,也是处理缺失值的常用方法之一。它的基本思想是,建立一个模型,通过已知变量的信息来预测缺失变量的值。在 R 中,使用 mice 包实现多重插补估算。

R 代码
# 多重插补估算
library(mice)
data_mice <- mice(data)
data_mice_complete <- complete(data_mice)
data_mice_complete
代码解释

上面的代码中,首先加载 mice 包。然后,使用 mice() 函数对缺失值进行多重插补估算。在默认设置下,mice 包会重复处理数据,并在每次处理之间更新缺失值的估算结果,直到各个变量的估算结果趋于收敛。最后,使用 complete() 函数将估算结果转化为完整的数据集。

运行结果

输出结果如下:

             a           b           c
1  -0.56047565 -1.06782370  0.32088587
2  -0.23017749  0.21797490 -0.15579551
3   1.55870831 -1.02600440 -0.25816905
4   0.07050839 -0.23622466  0.14330266
5   0.12928774 -0.72889120 -0.55982532
6  -1.71506499  0.19236560  0.33261190
7   0.46091621  0.45308360 -1.02642090
8  -1.26506123  0.14330470  1.25669330
9  -0.68685285 -0.36496101  0.54769800
10 -0.44566197 -0.29205481 -0.19896958

可以看到,多重插补估算得到的缺失值估算结果比平均数方法更加准确。

方法 3:使用随机森林估算

随机森林是一种常见的机器学习方法,在缺失值的处理中也有很好的应用。随机森林可以根据现有的数据,自动建立一种预测缺失值的模型。在 R 中,使用 missForest 包实现随机森林估算缺失值。

R 代码
# 使用随机森林估算
library(missForest)
set.seed(123)
data_rf_new <- missForest(data)
data_rf_new$ximp
代码解释

上面的代码中,首先加载 missForest 包。然后,使用 missForest() 函数进行随机森林估算,它会对缺失值一次性进行处理,并返回估算缺失值的结果。最后,使用 ximp 属性取出估算结果。

运行结果

输出结果如下:

             a           b           c
1  -0.56047565 -1.06782370  0.20393625
2  -0.23017749  0.21797490 -0.15579551
3   1.55870831 -1.02600440 -0.25816905
4   0.07050839 -0.45210598 -0.02394467
5   0.12928774 -0.72889120 -0.55982532
6  -1.71506499  0.68869755  0.33261190
7   0.46091621  0.45308360 -1.02642090
8  -1.26506123  0.51822947  1.25669330
9  -0.68685285 -0.36496101  0.54769800
10 -0.44566197  0.41175783 -0.07852801

可以看到,用随机森林估算的缺失值结果与多重插补的结果相当。但如果数据大,随机森林可能需要较长的计算时间。

在以上三个方法中,每个方法的准确度可以根据实际情况去选择。需要根据具体情况选择最好的估算方法来估算缺失值。

小结

本文介绍了在 R 中估算数据集中的缺失值的三种方法:

  • 平均数估算
  • 多重插补估算
  • 使用随机森林估值

这些方法可以处理大多数的缺失值问题。在实际应用中,应根据具体情况进行选择。除以上方法外,还可以根据实际情况选择其他的估算方法。但是,无论用哪种缺失值估算方法,需在后续分析中加以说明,确保研究结果的准确度。