📅  最后修改于: 2023-12-03 14:52:31.681000             🧑  作者: Mango
在 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 数据集中含有缺失值。
# 用平均数估算
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
可以看到,缺失值已经被平均数替代。
多重插补估算是一种较为准确的估算方法,也是处理缺失值的常用方法之一。它的基本思想是,建立一个模型,通过已知变量的信息来预测缺失变量的值。在 R 中,使用 mice
包实现多重插补估算。
# 多重插补估算
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
可以看到,多重插补估算得到的缺失值估算结果比平均数方法更加准确。
随机森林是一种常见的机器学习方法,在缺失值的处理中也有很好的应用。随机森林可以根据现有的数据,自动建立一种预测缺失值的模型。在 R 中,使用 missForest
包实现随机森林估算缺失值。
# 使用随机森林估算
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 中估算数据集中的缺失值的三种方法:
这些方法可以处理大多数的缺失值问题。在实际应用中,应根据具体情况进行选择。除以上方法外,还可以根据实际情况选择其他的估算方法。但是,无论用哪种缺失值估算方法,需在后续分析中加以说明,确保研究结果的准确度。