离群点是指那些模型预测效果不佳的观测点。它们通常有很大的、或正或负的残差,正的残差说明模型低估了响应值,负的残差则说明高估了响应值。
单变量的离群点检测通过函数boxplot.stats()实现,该函数返回的统计信息用于绘制盒图。由于boxplot.stats()函数返回的结果中有一个"out"的组件,它存储了所有检测出的离群点,具体来说就是位于盒图两条触须线截止横线之外的数据点。还有一个参数coef用于控制触须线延伸的长度。例如:
> set.seed(3147)
> x <- rnorm(100)
> summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-3.3150 -0.4837 0.1867 0.1098 0.7120 2.6860
> boxplot.stats(x)$out
[1] -3.315391 2.685922 -3.055717 2.571203
> boxplot(x)
单变量离群点检测也可以简单地应用到多变量的数据集中。比如,我们创建一个数据框df,该数据框包含两列:x和y。然后分别在这两列数据上进行离群点检测,再从检测出的离群点中抽取出重叠部分作为整个数据集的离群点。离群点由“+”表示。代码如下:
> y <- rnorm(100)
> df <- data.frame(x,y)
> rm(x,y)
> head(df)
x y
1 -3.31539150 0.7619774
2 -0.04765067 -0.6404403
3 0.69720806 0.7645655
4 0.35979073 0.3131930
5 0.18644193 0.1709528
6 0.27493834 -0.8441813
> attach(df)
>#获取X的离群点
> (a <- which(x %in% boxplot.stats(x)$out))
[1] 1 33 64 74
>#获取Y的离群点
> (b <- which(y %in% boxplot.stats(y)$out))
[1] 24 25 49 64 74
> detach(df)
> (outlier.list1 <- intersect(a,b))
[1] 64 74
> plot(df)
>#离群点用红色"+"表示
> points(df[outlier.list1,], col="red", pch="+", cex=2.5)
同样,也可以将x列或y列的离群点都作为整个数据集的离群点,例如:
> (outlier.list2 <- union(a,b))
[1] 1 33 64 74 24 25 49
> plot(df)
> points(df[outlier.list2,], col="blue", pch="x", cex=2)
当应用中存在3个或更多变量时,最终的离群点是由单个变量的主要离群点产生。在实际应用中,应该根据领域知识来选择最优方式。
相关阅读: