我正在用棒球运动员的薪水和战争数据制作MDS图。我已经附在这里了。因为数据点太多,所以我只想为离群数据点标记“棒球选手”的名字。知道如何做吗?
答案 0 :(得分:0)
首先,它取决于您要检测异常值的方法。我创建了一个可重现的示例,因为您没有提供数据集。我正在使用mtcars
数据集,这是已经在R中实现的常规数据集。
对于异常值检测,我使用的是库克距离(您可以在帖子here中进行检查)
首先,我根据变量cooks.distance
和hp
之间的统计数据来建立数据并使用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)))
我们看到,我们有两个异常值。我正在使用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") )
离群值检测的一个巨大问题是,有不同的方法,并且每种情况下都必须调整解释。您将要使用的是哪种方法或阈值,这里不再回答,因为它更多地是关于stackexchange的讨论。您可以使用cooksd,stdev或任何您认为最有用的东西。但是解决方案保持不变:
对于您的三个聚类,您只需为每个聚类执行lm
模型,标记离群值,然后将所有三个结果合并。