对缺失值使用均值有什么缺点?

机器算法验证 数理统计 缺失数据 数据挖掘 数据插补
2022-01-24 15:45:39

我有一个作业(数据挖掘课程),其中有一部分问:“对缺失值使用平均值有什么缺点?” Missing Value部分。

所以我搜索了一下,最常见的答案是:“因为它减少了方差。”

为什么这种方差减少被认为是一件坏事?除了减少方差之外,还有其他缺点吗?

4个回答

普通数据示例。假设真实数据是大小的随机样本n=200Norm(μ=100,σ=15),但你不知道μ或者σ并设法估计它们。在下面的例子中,我估计μ经过X¯=100.21σ经过S=14.5,两个估计都不错。(R中的模拟和计算。)

set.seed(402)  # for reproducibility
x = rnorm(200, 100, 15)
mean(x);  sd(x)
# [1] 100.2051   # aprx 100
# [1] 14.5031    # aprx 15

现在假设这些数据中有 25% 缺失。(这是一个很大的比例,但我试图说明一点。)如果我用 150 个非缺失观察的平均值替换缺失的观察,让我们看看我的估计μσ将会。

x.nonmis = x[51:200]  # for simplicity suppose first 50 are missing
x.imputd = c( rep(mean(x.nonmis), 50),  x.nonmis )
length(x.imputd);  mean(x.imputd);  sd(x.imputd)
# [1] 200               # 'x.imputd' has proper length 200
# [1] 100.3445          # aprx 100
# [1] 12.58591          # much smaller than 15

现在我们估计μ作为X¯imp=100.3,这不是一个糟糕的估计,但可能(如这里)比实际数据的平均值更差。然而,我们现在估计σ作为Simp=12.6,这比真实的要低很多σ从实际数据中得到更好的估计 14.5。


指数数据示例。如果数据是强烈右偏的(对于来自指数群体的数据),那么用非缺失数据的平均值替换缺失数据可能会掩盖偏度,因此我们可能会惊讶于数据没有反映右尾的重量人口真的是。

set.seed(2020)  # for reproducibility
x = rexp(200, .01)
mean(x);  sd(x)
# [1] 108.0259   # aprx 100
# [1] 110.1757   # aprx 100
x.nonmis = x[51:200]  # for simplicity suppose first 50 are missing
x.imputd = c( rep(mean(x.nonmis), 50),  x.nonmis )
length(x.imputd);  mean(x.imputd);  sd(x.imputd)
# [1] 200
# [1] 106.7967   # aprx 100
# [1] 89.21266   # smaller than 100
boxplot(x, x.imputd, col="skyblue2", main="Data: Actual (left) and Imputed")

箱线图显示实际数据(高尾的许多观察值)比“估算”数据更偏斜。

在此处输入图像描述


双峰数据示例。同样在这里,当我们用非缺失观测值的平均值替换缺失值时,总体标准差被低估了。也许更严重的是,“估算”样本中心的大量估算值掩盖了数据的双峰性质。

set.seed(1234)  # for reproducibility
x1 = rnorm(100, 85, 10);  x2 = rnorm(100, 115, 10)
x  = sample(c(x1,x2))  # randomly scramble order
mean(x);  sd(x)
# [1] 99.42241
# [1] 18.97779
x.nonmis = x[51:200]  # for simplicity suppose first 50 are missing
x.imputd = c( rep(mean(x.nonmis), 50),  x.nonmis )
length(x.imputd);  mean(x.imputd);  sd(x.imputd)
# [1] 200
# [1] 99.16315
# [1] 16.41451
par(mfrow=c(1,2))
 hist(x,        prob=T, col="skyblue2", main="Actual")
 hist(x.imputd, prob=T, col="skyblue2", main="Imputed")
par(mfrow=c(1,1))

在此处输入图像描述

一般来说:用非缺失数据的平均值替换缺失数据会导致总体 SD 被低估,但也可能会掩盖从中抽样数据的总体的重要特征。


注意:正如@benso8 所观察到的,使用非缺失数据的平均值来替换缺失的观测值并不总是一个坏主意。如问题中所述,这种方法确实减少了可变性。任何处理缺失数据的方案都必然存在缺陷。该问题要求推测这种方法除了减少方差之外可能存在的缺点。我试图在最后两个示例中说明几种可能性。

暂定的替代方法:我不是数据挖掘方面的专家。所以我很试探性地提出了一种替代方法。我不认为这是一个新想法。

而不是全部替换m具有非缺失样本均值的缺失项目,可能会随机抽取一个大小为m从非缺失观测中,并对其进行缩放,使得m项目与非缺失数据具有相同的均值和 SD。然后结合重新缩放的m与非缺失部分的项目得到一个“估算”样本,其平均值和 SD 与样本的非缺失部分几乎相同。

结果不应系统地低估总体 SD,并且可以更好地保留总体特征,例如偏度和双峰性。(欢迎评论。)

这个想法在下面的双峰数据中进行了探索:

set.seed(4321)  # for reproducibility
x1 = rnorm(100, 85, 10);  x2 = rnorm(100, 115, 10)
x  = sample(c(x1,x2))  # scrmble
mean(x);  sd(x)
# [1] 100.5299
# [1] 17.03368
x.nonmis = x[51:200]  # for simplicity suppose first 50 are missing
an       = mean(x.nonmis);  sn = sd(x.nonmis)   
x.subt   = sample(x.nonmis, 50)      # temporary unscaled substitutes
as       = mean(x.subt); ss = sd(x.subt)
x.sub    = ((x.subt - as)/ss)*sn + an # scaled substitutes

x.imputd = c( x.sub,  x.nonmis )
mean(x.imputd);  sd(x.imputd)
# [1] 100.0694    # aprx same as mean of nonmissing
# [1] 16.83213    # aprx same os SD of nonmissing

par(mfrow=c(1,2))
 hist(x,        prob=T, col="skyblue2", main="Actual")
 hist(x.imputd, prob=T, col="skyblue2", main="Imputed")
par(mfrow=c(1,1))

在此处输入图像描述

使用缺失值的平均值并不总是一件坏事。在计量经济学中,在某些情况下这是推荐的行动方案,前提是您了解后果可能是什么以及在什么情况下它会有所帮助。正如您所读到的,用平均值替换缺失值可以减少方差,但也有其他副作用。例如,考虑用平均值替换缺失值时回归模型会发生什么。

请注意,对于回归模型,决定系数

R2=SSRSSTO=(yi^y¯)2(yiy¯)2.
假设你错过了y值,然后用样本均值替换它们,那么您可以有一个R2价值并不像应有的那样现实。数据中的更多差异意味着有更多数据可能离回归线更远。由于R2值取决于观察到的个人y值(见yiSSTO), 您的R2可能会膨胀,因为SSTO会更小。

让我们看一个例子。

说你有一个价值x3以及相应的观察结果x价值是y3. 我们对 SSTO 的结果进行计算,我们有

(y3y¯)2

并且该结果被添加到总和中SSTO. 现在,相反,让我们说这个值y3不见了。然后我们让失踪者y3=y¯. 然后我们有

(y¯y¯)2=0.
.

如您所见,当我们将其添加到分母的其他结果中时SSTO总和会更小。

使用缺失值的平均值的另一个可能的缺点是,缺失值的原因可能首先取决于缺失值本身。(这被称为非随机缺失。)

例如,在健康问卷中,较重的受访者可能不太愿意透露自己的体重。观测值的平均值将低于所有受访者的真实平均值,并且您将使用该值代替实际上应该高得多的值。

如果缺失值的原因与缺失值本身无关,那么使用平均值就不是问题。

问题不在于它减少了方差,而是它改变了数据集的方差,使其对实际总体方差的估计不太准确。 更一般地说,它会使数据集在许多方面不太准确地反映人口。

考虑替代方案很有帮助。为什么使用 0(或任何其他随机值)作为缺失点是一个坏主意?因为它将以人为的方式更改数据集,使其无法反映理想人群,并使您从数据集中得出的结论不太准确。为什么使用缺失点的平均值比使用其他值糟糕?因为它不会改变数据集的均值——而均值通常是最重要的单一统计量。但这仍然只是一个统计数据!数据挖掘的重点是数据集除了平均值之外还包含更多信息。用平均值填充缺失点会影响所有其余信息。 因此,填充的数据集对于得出有关实际人口的结论将不太准确。差异只是进一步信息中的一个特定部分,它清楚地说明了变化。