Ну, во-первых, это зависит от метода, который вы хотите обнаружить выбросы. Я создаю воспроизводимый пример, так как вы не предоставили набор данных. Я использую набор данных mtcars
, который является обычным набором данных, уже реализованным в R.
Для обнаружения выбросов я использую расстояние поваров (вы можете проверить это в сообщении здесь )
Сначала я настроил данные и вычислил расстояние повара (cooksd) с помощью cooks.distance
из статистики между переменными hp
и sec
df<-cbind( mtcars[,c("hp", "qsec")], cooks.distance(lm(mtcars$hp~mtcars$qsec)))
names(df)[3]<-"cooksd"
plot(cooks.distance(lm(mtcars$hp~mtcars$qsec)))
Мы видим, что у нас есть два выброса. Я использую порог 4*mean(cooksd)
и помечаю их в наборе данных следующим l oop. Они считаются выбросами.
for (i in 1:nrow(df)){
if (df$cooksd[i] > 4* mean(df$cooksd)){
df$outlier[i] =1
}else {df$outlier[i]=0}
}
Последний шаг - построить значения и дать метку только тем из них, которые находятся выше порога. Я использую здесь row.names
, но вы также можете использовать любой столбец, просто отфильтруйте его как другие точки данных.
plot(df$hp, df$qsec,
text(df[df$outlier==1,"hp"], df[df$outlier==1,"qsec"], row.names(df[df$outlier == 1,]), cex=0.6, pos=4, col="red") )
Огромная проблема с обнаружением выбросов состоит в том, что существуют разные методы, и для каждого случая интерпретация должна быть скорректирована. Какой метод вы хотите использовать или какой порог, здесь не будет ответа, так как это больше обсуждение для stackexchange. Вы можете использовать cooksd, stdev или все, что вам кажется наиболее полезным. Но решение остается прежним:
- используйте ваш метод, чтобы найти выбросы
- пометьте их в вашем наборе данных
- просто внедрите текст в свой график, который вы маркированный.
Для ваших трех кластеров, вам просто нужно сделать lm
моделирование для каждого кластера, маркировать выбросы и затем объединить все три результата.