如何在R for MDS中找到离群值?

时间:2020-05-02 19:19:46

标签: r

我正在用棒球运动员的薪水和战争数据制作MDS图。我已经附在这里了。因为数据点太多,所以我只想为离群数据点标记“棒球选手”的名字。知道如何做吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,它取决于您要检测异常值的方法。我创建了一个可重现的示例,因为您没有提供数据集。我正在使用mtcars数据集,这是已经在R中实现的常规数据集。

对于异常值检测,我使用的是库克距离(您可以在帖子here中进行检查)

首先,我根据变量cooks.distancehp之间的统计数据来建立数据并使用sec计算烹调距离(cooksd)

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)))

cookds

我们看到,我们有两个异常值。我正在使用4*mean(cooksd)的阈值,并使用以下循环标记数据集中的阈值。这些被认为是离群值。

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") )

plot with outlier labels

离群值检测的一个巨大问题是,有不同的方法,并且每种情况下都必须调整解释。您将要使用的是哪种方法或阈值,这里不再回答,因为它更多地是关于stackexchange的讨论。您可以使用cooksd,stdev或任何您认为最有用的东西。但是解决方案保持不变:

  1. 使用您的方法查找异常值
  2. 将它们标记在数据集中
  3. 只需在您标记的图中实现文本即可。

对于您的三个聚类,您只需为每个聚类执行lm模型,标记离群值,然后将所有三个结果合并。