假设我有正态分布的数据。对于数据的每个元素,我想检查它远离均值有多少SD。数据中可能有一个异常值(可能只有一个异常值,也可能是两个或三个),但是这个异常值基本上就是我要寻找的。从均值和标准差的计算中暂时排除我当前正在查看的元素是否有意义?我的想法是,如果它接近平均值,则不会产生任何影响。如果是离群值,则可能会影响均值和SD的计算,并降低检测到均值的可能性。我不是统计学家,因此不胜感激!
假设我有正态分布的数据。对于数据的每个元素,我想检查它远离均值有多少SD。数据中可能有一个异常值(可能只有一个异常值,也可能是两个或三个),但是这个异常值基本上就是我要寻找的。从均值和标准差的计算中暂时排除我当前正在查看的元素是否有意义?我的想法是,如果它接近平均值,则不会产生任何影响。如果是离群值,则可能会影响均值和SD的计算,并降低检测到均值的可能性。我不是统计学家,因此不胜感激!
Answers:
这似乎是违反直觉的,但是使用您描述的方法没有任何意义(用您的措辞,我宁愿写“可能导致结果与预期的结果大不相同”),并且永远不要这样做:它不起作用是必然的,此外,还存在一种更简单,更安全和完善的替代方案,无需额外费用。
首先,它是真实的,如果有一个单一的孤立点,那么你最终会使用你的建议的过程中找到它。但是,总的来说(当数据中可能有多个异常值时),您建议的算法会彻底崩溃,这可能会导致您拒绝将一个好的数据点视为异常值或将异常值保留为良好的数据点具有潜在的灾难性后果。
下面,我举一个简单的数值示例,其中您提出的规则被分解,然后提出了一个更安全,更成熟的替代方法,但是在此之前,我将解释a)您提出的方法有什么问题,b)通常首选的方法替代它。
本质上,您不能使用观测值与数据的留一法均值和标准差的距离来可靠地检测离群值,因为您使用的估计值(留一法均值和标准差)仍可能被拉向余数离群值:这称为掩盖效果。
简而言之,一种可靠地检测离群值的简单方法是使用您建议的一般概念(与位置和规模的估计值的距离),但用健壮的估计值代替您使用的估计值(均值,sd),即估计值设计为不易被异常值所干扰。
考虑以下示例,其中我将3个离群值添加到从法线0,1得出的47个真实观测值中:
n <- 50
set.seed(123) # for reproducibility
x <- round(rnorm(n,0,1), 1)
x[1] <- x[1]+1000
x[2] <- x[2]+10
x[3] <- x[3]+10
下面的代码根据留一法平均值和标准差(例如,您建议的方法)来计算离群指数。
out_1 <- rep(NA,n)
for(i in 1:n){ out_1[i] <- abs( x[i]-mean(x[-i]) )/sd(x[-i]) }
这段代码会生成您在下面看到的图。
plot(x, out_1, ylim=c(0,1), xlim=c(-3,20))
points(x[1:3], out_1[1:3], col="red", pch=16)
图像1描绘了离群指数的值随观察值的变化(离群值最远的地方不在此图的范围内,而其他两个以红点显示)。如您所见,除了最极端的一个以外,按照您的建议构建的离群值指数无法揭示离群值:实际上,第二个和第三个(较温和的)离群值现在甚至比所有离群值更小真正的观测值!...根据您建议的方法,可以将这两个极端离群值保留在一组真正的观测值中,从而使您使用剩余的49个观测值,就像它们来自同一均一过程一样,从而为您提供最终的根据0.45和2.32的这49个数据点估计均值和sd,这对样本的任何部分都非常差!
在R中,第二个离群指标可以计算为:
out_2 <- abs( x-median(x) )/mad(x)
并绘制(如前)使用:
plot(x, out_2, ylim=c(0,15), xlim=c(-3,20))
points(x[1:3], out_2[1:3], col="red", pch=16)
图2绘制了同一数据集的该替代偏远指数的值。如您所见,现在所有这三个异常值都清楚地显示出来了。此外,该异常值检测规则具有一些已建立的统计属性。除其他外,这导致了可用的截止规则。例如,如果可以假设数据的真实部分是从具有有限第二矩的对称分布中提取的,则可以拒绝所有数据点
作为离群值。在上面的示例中,应用此规则将使您正确标记观察值1,2和3。拒绝这些值,其余观察值的平均值和sd分别为0.021和0.93,可以更好地描述样本的真实部分!