根据我的理解,R
knn
包中的VIM
算法采用缺失点周围的k个点,然后使用平均值、中位数等方法聚合它们。如果是这种情况,为什么下面的代码返回结果错误?
ts_data <- c(1, 2, 3, 4, 5, NA, 7, 8, 9)
imputed_ts <- kNN(as.data.frame(as.table(ts_data)), k = 2, numFun = "mean",imp_var=FALSE)
print(imputed_ts)
>>
Var1 Freq
1 A 1.0
2 B 2.0
3 C 3.0
4 D 4.0
5 E 5.0
6 F 1.5
7 G 7.0
8 H 8.0
9 I 9.0
为什么缺失点(F)是 1.5 而不是 6?
您得到的 1.5 是由于未指定variable = 2 / dist_var = "Freq",这导致它将 Var1 视为分类变量,然后对 A 和 B(最低字母)取 1 和 2 的平均值。
文档说 kNN 距离基于 gower 距离(不是欧几里得)的扩展,并根据 Ranger 包中的随机森林变量重要性度量应用权重,除非另有说明,否则这些自动权重可能也适用于 Var1。
library(VIM)
ts_data <- data.frame(
Var1 = c("A", "B", "C", "D", "E", "F", "G", "H", "I"),
Freq = c(1, 2, 7, 4, 5, NA, 7, 8, 9)
)
imputed_ts <- kNN(ts_data, k = 2, numFun = "mean",imp_var=FALSE, variable = 2, dist_var = "Freq", trace = T)
print(imputed_ts)
如果您告诉上面的代码忽略 Var1 并将一些数字更改为更高的值,您会注意到它没有以任何线性方式运行。例如。当 K= 1 时,它将选择最高值,当 K=2 时,它似乎选择 8 和 9 的平均值,因为它们是两个最高值。如果将位置 3 更改为 70,您会发现它再次占据了两个最高位置。
换句话说,它认为在单变量世界中 NA 是无穷大,并且最接近它的两个值是最高值。
我认为这个 kNN 针对大型复杂数据集进行了优化,因此在这种情况下它可能比更适合线性或中值插补的简单问题效果更好。