Выявление и удаление выбросов с графиков PCA и QQ

У меня есть набор данных 132 x 107, который состоит из 2 типов пациентов - (33 пациента 1) и (99 пациента 2).

Я ищу выбросы, поэтому я запустил pca в наборе данных и сделал qqplots первых 4 компонентов, используя следующие команды

pca = prcomp(data, scale. = TRUE)
plot(pca$x, pch = 20, col = c(rep("red", 33), rep("blue", 99)))  

Когда я делаю qqplot 2-го компонента, используя:

qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99)))     

на следующем графике показаны 2 четких выброса - красные точки в нижнем левом углу, которые соответствуют пациенту 1.

График QQ

Есть ли какой-нибудь простой способ определить индекс этих точек в данных, чтобы их можно было удалить?


person user2846211    schedule 30.10.2013    source источник
comment
У вас гораздо больше шансов получить полезный ответ, если вы предоставите минимальный воспроизводимый пример вместе с кодом, который вы пробовали. Спасибо!   -  person Henrik    schedule 30.10.2013


Ответы (3)


По какой-то причине я не верю, что метод идентификации поддерживается в пакете car (источник qqPlot())

Давайте посмотрим на PCA данных USArrests ...

pca <- prcomp(USArrests) 

Сюжет этого с использованием qqPlot достаточно прост.

require(car)
qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99)))

Однако qqPlot() не позволяет выбирать точки с помощью identify().

identify(qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99))))
# numeric(0)

Однако вы можете использовать qqnorm() в пакете stats.

identify(qqnorm(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99))))

Это позволит получить менее сложный график, но вы сможете добавить линию и доверительные интервалы вручную через qqline() (также в stats) и немного больше математики.

person joemienko    schedule 30.10.2013

Вы можете попробовать метод идентифицировать в R. Обычно бегают

identify(qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99))))

и щелкните левой кнопкой мыши по точкам, которые вы хотите идентифицировать. Индекс баллов в векторе очков должен быть таким же, как и в исходных данных.

person damienfrancois    schedule 30.10.2013

Вы также можете визуализировать влияние, используя функцию fviz_pca_ind() в библиотеке factoextra, как показано ниже:

require(factoextra)
pca = prcomp(mydata)
fviz_pca_ind(pca,
         col.ind = "contrib", # Color by contribution
         gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07") #assign gradient
         )

Это автоматически маркирует людей и окрашивает их в зависимости от их влияния.

person Cole Robertson    schedule 14.11.2018