我将把我的数据帧分割成一个训练和测试部分,用于训练机器学习算法。在这样做的过程中,我需要替换训练集的NA值,保留它们并稍后将它们应用于测试集。这是一种常用的方法,这样测试数据就不会影响训练。
关键的一点是,A具有属于特定组的数据,例如性别。因此,数据的输入必须以组为基础。下面是一个示例数据框架:
df <- dplyr::tibble(gender = c(1, 2, 1, 1, 2),
lab1 = c(NA, 2, 3, NA, NA),
lab2 = c(4, NA, NA, 2, 2))
下一步,我基于具有相同形状的其他数据(训练数据)计算了下表。这是输出:
gender col imputed_with
<dbl> <chr> <dbl>
1 1 lab1 3
2 2 lab1 2
3 1 lab2 3
4 2 lab2 2
我现在需要用这个表中的值替换第一个数据框中的缺失值,这个表基本上用作查找表,用训练数据计算。
如何做到这一点?或者更好的是,有没有什么官方的软件包可以方便整个归算过程?
要组合这两个表,需要一个合并连接,可以通过tidyr::pivot_longer()
和dplyr::rows_patch()
实现:
library(tidyverse)
df <- tibble::tibble(
gender = c(1, 2, 1, 1, 2),
lab1 = c(NA, 2, 3, NA, NA),
lab2 = c(4, NA, NA, 2, 2)
)
to_impute <- tibble::tribble(
~gender, ~col, ~imputed_with,
1, "lab1", 3,
2, "lab1", 2,
1, "lab2", 3,
2, "lab2", 2
)
impute_wide <- pivot_wider(
to_impute,
names_from = col,
values_from = imputed_with
)
impute_wide
#> # A tibble: 2 × 3
#> gender lab1 lab2
#> <dbl> <dbl> <dbl>
#> 1 1 3 3
#> 2 2 2 2
rows_patch(
df,
impute_wide,
by = colnames(to_impute)[!colnames(to_impute) %in% c("col", "imputed_with")]
)
#> # A tibble: 5 × 3
#> gender lab1 lab2
#> <dbl> <dbl> <dbl>
#> 1 1 3 4
#> 2 2 2 2
#> 3 1 3 3
#> 4 1 3 2
#> 5 2 2 2
然而,有大量的R包处理imputation。
如果您熟悉tidymodels
包,那么recipes::step_impute_()
函数族可以用于估算,同时阻止数据从测试集泄漏到训练集。
在mice包中,mice::mice()
有一个ignore
参数,它允许您在拟合imputation模型时忽略数据集的测试部分。
我肯定还有其他我不知道的。