我有以下data.table,其中每个唯一的x
值与唯一的y
值相关联。于是我强迫一个x
价值NA
第k近邻锻炼的目的:knnImpute使用分类变量与插入符号包
dt <- data.table(x = rep(c(1:4), 3),
y = rep(c("Brandon", "Erica", "Karyna", "Alex"), 3))
dt[3, 1] <- NA
print(dt)
# x y
#1: 1 Brandon
#2: 2 Erica
#3: NA Karyna
#4: 4 Alex
#5: 1 Brandon
#6: 2 Erica
#7: 3 Karyna
#8: 4 Alex
#9: 1 Brandon
#10: 2 Erica
#11: 3 Karyna
#12: 4 Alex
参考第一答案this question,我创建了一个二元矩阵出dt$y
像这样:
dt.a <- model.matrix(~ y -1 , data = dt)
dt2 <- cbind(dt[, -2, with = FALSE], dt.a)
print(dt2)
# x yAlex yBrandon yErica yKaryna
#1: 1 0 1 0 0
#2: 2 0 0 1 0
#3: NA 0 0 0 1
#4: 4 1 0 0 0
#5: 1 0 1 0 0
#6: 2 0 0 1 0
#7: 3 0 0 0 1
#8: 4 1 0 0 0
#9: 1 0 1 0 0
#10: 2 0 0 1 0
#11: 3 0 0 0 1
#12: 4 1 0 0 0
使用caret
包的preProcess
函数中的knnImpute
方法,我期望dt3[1, 3]
下面的中心和缩放输出等于第7和第12行,但它不会。事实上,它看起来是几乎相等的行7的负值和12
preobj <- preProcess(dt2, method = "knnImpute")
dt3 <- predict(preobj, dt2)
print(dt3)
# x yAlex yBrandon yErica yKaryna
#1: -1.19857753 -0.5527708 1.6583124 -0.5527708 -0.5527708
#2: -0.37455548 -0.5527708 -0.5527708 1.6583124 -0.5527708
#3: -0.04494666 -0.5527708 -0.5527708 -0.5527708 1.6583124
#4: 1.27348863 1.6583124 -0.5527708 -0.5527708 -0.5527708
#5: -1.19857753 -0.5527708 1.6583124 -0.5527708 -0.5527708
#6: -0.37455548 -0.5527708 -0.5527708 1.6583124 -0.5527708
#7: 0.44946657 -0.5527708 -0.5527708 -0.5527708 1.6583124
#8: 1.27348863 1.6583124 -0.5527708 -0.5527708 -0.5527708
#9: -1.19857753 -0.5527708 1.6583124 -0.5527708 -0.5527708
#10: -0.37455548 -0.5527708 -0.5527708 1.6583124 -0.5527708
#11: 0.44946657 -0.5527708 -0.5527708 -0.5527708 1.6583124
#12: 1.27348863 1.6583124 -0.5527708 -0.5527708 -0.5527708
不应该dt3$x
的第3行的行相等7和11?如果是这样,我需要在脚本中更改哪些内容?如果不是,为什么?
很好的解释。对于我的具体情况,我在'preProcess'函数中做了'k = 2',它给了我期望看到的东西。然后,我重新创建了我的'dt'表,并在'preProcess'函数中重复了11次重复并使用'k = 10',并且现在仍然可以得到相同的答案。 – bshelt141