2016-12-07 3 views
2

У меня есть следующая таблица данных, где каждое уникальное значение 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? Если да, то что мне нужно изменить в моем скрипте? Если нет, то почему?

ответ

3

Чтобы понять, что происходит, вам сначала нужно понять способ knnImpute в функции preProcess из caret пакет работ. Различные ароматы от k-ближайший сорт Взвешивание доступны, и разные люди реализуют его по-разному в разных пакетах программного обеспечения.

Вы можете использовать взвешенное среднее, медианное или даже простое среднее значение k-ближайшего соседа для замены отсутствующих значений. Для вычисления разных расстояний для поиска соседей существует несколько показателей расстояния.

Теперь Специфические для ваших проблем вот некоторые вопросы, которые возникают с их ответом.

1.Как рассматриваются многие ближайшие соседи?

По умолчанию . Вы можете изменить его, указав параметр k в функции preProcess.

2.Что такое метрика расстояния используется?

В вышеуказанном случае используется эвклидовое расстояние.

3. Каково измерение пространства, в котором расчитывается расстояние и как оно найдено?

В вашем случае это четырехмерное пространство. Он получается путем ввода столбцов, которые не имеют отсутствующих значений. Следовательно, в вашем случае это номер столбца 2, 3, 4, 5.

На основании приведенных выше объяснений, если вы пытаетесь найти пять ближайших соседей (nn) в наборе данных после удаления строки, имеющей NA, которая хранится в preobj$data, вы получите следующие индексы (nn.idx) и соответствующие расстояния (nn.dists), как показано ниже.

> nn 
$nn.idx 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 10 6 5 9 2 

$nn.dists 
    [,1] [,2]  [,3]  [,4]  [,5] 
[1,] 0 0 3.126944 3.126944 3.126944 

4.Now наконец, как заменить значение NA?

Для замены значения NA просто возьмите среднее значение значений в отсутствующих столбцах, соответствующих ближайшим индексам.

> preobj$data 
      x  yAlex yBrandon  yErica yKaryna 
1: -1.1985775 -0.5527708 1.6583124 -0.5527708 -0.5527708 
2: -0.3745555 -0.5527708 -0.5527708 1.6583124 -0.5527708 
3: 1.2734886 1.6583124 -0.5527708 -0.5527708 -0.5527708 
4: -1.1985775 -0.5527708 1.6583124 -0.5527708 -0.5527708 
5: -0.3745555 -0.5527708 -0.5527708 1.6583124 -0.5527708 
6: 0.4494666 -0.5527708 -0.5527708 -0.5527708 1.6583124 
7: 1.2734886 1.6583124 -0.5527708 -0.5527708 -0.5527708 
8: -1.1985775 -0.5527708 1.6583124 -0.5527708 -0.5527708 
9: -0.3745555 -0.5527708 -0.5527708 1.6583124 -0.5527708 
10: 0.4494666 -0.5527708 -0.5527708 -0.5527708 1.6583124 
11: 1.2734886 1.6583124 -0.5527708 -0.5527708 -0.5527708 

> mean(preobj$data$x[nn$nn.idx]) 
[1] -0.04494666 

И вы увидите, что действительно NA заменяется этим значением на выходе.

> 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 

Обратите внимание на третий ряд.

Чтобы заменить значение NA просто с соответствующим значением ближайшего соседа, вы можете просто использовать k=1.

+0

большое объяснение. Для моего конкретного сценария я сделал 'k = 2' в функции' preProcess', и он дал мне то, что я ожидал увидеть. Затем я воссоздал свою таблицу 'dt' и сделал функции' rep' с 11 повторениями и использовал 'k = 10' в функции' preProcess' и теперь смог получить тот же ответ. – bshelt141