У меня есть следующая таблица данных, где каждое уникальное значение x
связано с уникальным значением y
. Тогда я заставляю одну x
значение как NA
для целей к-ближайших соседей упражнения: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
REFERENCING первый ответ на 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
Используя метод knnImpute
из функции preProcess
пакета caret
, я ожидал бы, что результат центра и масштабирования ниже 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
«s строка 3 равные строки 7 и 11? Если да, то что мне нужно изменить в моем скрипте? Если нет, то почему?
большое объяснение. Для моего конкретного сценария я сделал 'k = 2' в функции' preProcess', и он дал мне то, что я ожидал увидеть. Затем я воссоздал свою таблицу 'dt' и сделал функции' rep' с 11 повторениями и использовал 'k = 10' в функции' preProcess' и теперь смог получить тот же ответ. – bshelt141