从PCA和QQ图中识别和去除异常值

4

我有一个 132 x 107 的数据集,包含两种类型的患者 - (33 个患者 1)和(99 个患者 2)。

我正在寻找异常值,因此已在数据集上运行了 pca,并对前 4 个成分进行了 qqplots,使用以下命令:

pca = prcomp(data, scale. = TRUE)
plot(pca$x, pch = 20, col = c(rep("red", 33), rep("blue", 99)))  
当我使用以下代码绘制第二个成分的 QQ 图时:

qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99)))     
以下图表显示了2个明显的异常值-位于左下角的红色点,代表患者1。有没有一种简单的方法来确定这些数据点的索引,以便将其删除?

如果您提供一个最小化、可复现的示例以及您尝试的代码,那么您更有可能收到有用的答案。谢谢! - Henrik
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8

因为某种原因,我不相信car包(qqPlot()的源)支持identify方法。

让我们来看一下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)

然而,您可以使用stats包中的qqnorm()

identify(qqnorm(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99))))
这将生成一个不太复杂的图表,但是您可以通过qqline()(也在stats中)手动添加一条线和置信区间,并进行更多的数学计算。

4
你可以在R中尝试使用identify方法。通常情况下,请运行。
identify(qqPlot(pca$x[,2],pch = 20, col = c(rep("red", 33), rep("blue", 99))))

在相关数据上左键单击您想要识别的点。得分向量中点的索引应与原始数据中的相同。


2
您可以使用factoextra库中的fviz_pca_ind()函数来可视化影响,如下所示:
require(factoextra)
pca = prcomp(mydata)
fviz_pca_ind(pca,
         col.ind = "contrib", # Color by contribution
         gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07") #assign gradient
         )
这将自动标记个体,并按其影响力进行着色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,