Как определить, является ли каждое значение набора данных выбросом для набора опорных данных - PullRequest
0 голосов
/ 11 июля 2019

В последнее время экосистема R была обогащена рядом пакетов, которые реализуют различные алгоритмы обнаружения выбросов как для одномерных, так и для многомерных данных.Следовательно, обнаружение выбросов в наборе данных является относительно простым.Моя проблема заключается в следующем: у меня есть два набора данных (фреймы данных): один является ссылкой, другой содержит значения, представляющие интерес.Мне интересно оценить, является ли каждая точка данных во втором наборе данных (т.е. каждая строка) выбросом по сравнению с эталонным набором данных.

Теоретически, я думаю, что мой подход должен быть следующим: взять первый ряд второго набора данных и добавить его (например, связывание строк) к первому.Вычислите выбросы выбросов (например, с пакетом DDoutlier), затем выполните сортировку и посмотрите, находится ли вновь добавленная строка среди самых высоких показателей.Затем итеративным способом проделайте то же самое для второй, третьей, четвертой строк и т. Д. До последней строки второго фрейма данных.Это позволило бы мне определить, какие значения второго набора данных являются выбросами по сравнению с первым.

Мой вопрос: как я могу сделать это эффективно в R?Я думал об использовании цикла for, но я знаю, что циклы for не самый эффективный подход.В отсутствие альтернативы я бы рассмотрел использование цикла for, но при попытке записать его я получаю ошибку, потому что я делаю что-то не так, но я не понимаю, как это исправить.

X <- iris[,1:4]
X

# Let's assume that the first 50 rows (X[1:50, 1:4]) is the reference, and the rest (X[51:150, 1:4]) is the test data. 


library(DDoutlier)
outlier_score <- list()
for (i in seq_along(1:(nrow(X)-50))){
  newdf <- X[c(1:50, 50+i), ]
  outlier_score[[i]]<- COF(newdf, k=5)
}

Пытаясь реализовать это для цикла for, я получаю следующую ошибку:

Ошибка в distMatrix [SBNpath, SBNpath]: индекс вне границ

...