我有一个作业(数据挖掘课程),其中有一部分问:“对缺失值使用平均值有什么缺点?” 在Missing Value
部分。
所以我搜索了一下,最常见的答案是:“因为它减少了方差。”
为什么这种方差减少被认为是一件坏事?除了减少方差之外,还有其他缺点吗?
我有一个作业(数据挖掘课程),其中有一部分问:“对缺失值使用平均值有什么缺点?” 在Missing Value
部分。
所以我搜索了一下,最常见的答案是:“因为它减少了方差。”
为什么这种方差减少被认为是一件坏事?除了减少方差之外,还有其他缺点吗?
普通数据示例。假设真实数据是大小的随机样本从但你不知道或者并设法估计它们。在下面的例子中,我估计经过和经过两个估计都不错。(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
现在我们估计作为这不是一个糟糕的估计,但可能(如这里)比实际数据的平均值更差。然而,我们现在估计作为这比真实的要低很多从实际数据中得到更好的估计 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 所观察到的,使用非缺失数据的平均值来替换缺失的观测值并不总是一个坏主意。如问题中所述,这种方法确实减少了可变性。任何处理缺失数据的方案都必然存在缺陷。该问题要求推测这种方法除了减少方差之外可能存在的缺点。我试图在最后两个示例中说明几种可能性。
暂定的替代方法:我不是数据挖掘方面的专家。所以我很试探性地提出了一种替代方法。我不认为这是一个新想法。
而不是全部替换具有非缺失样本均值的缺失项目,可能会随机抽取一个大小为从非缺失观测中,并对其进行缩放,使得项目与非缺失数据具有相同的均值和 SD。然后结合重新缩放的与非缺失部分的项目得到一个“估算”样本,其平均值和 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))
使用缺失值的平均值并不总是一件坏事。在计量经济学中,在某些情况下这是推荐的行动方案,前提是您了解后果可能是什么以及在什么情况下它会有所帮助。正如您所读到的,用平均值替换缺失值可以减少方差,但也有其他副作用。例如,考虑用平均值替换缺失值时回归模型会发生什么。
请注意,对于回归模型,决定系数
让我们看一个例子。
说你有一个价值以及相应的观察结果价值是. 我们对 SSTO 的结果进行计算,我们有
并且该结果被添加到总和中. 现在,相反,让我们说这个值不见了。然后我们让失踪者. 然后我们有
如您所见,当我们将其添加到分母的其他结果中时总和会更小。
使用缺失值的平均值的另一个可能的缺点是,缺失值的原因可能首先取决于缺失值本身。(这被称为非随机缺失。)
例如,在健康问卷中,较重的受访者可能不太愿意透露自己的体重。观测值的平均值将低于所有受访者的真实平均值,并且您将使用该值代替实际上应该高得多的值。
如果缺失值的原因与缺失值本身无关,那么使用平均值就不是问题。
问题不在于它减少了方差,而是它改变了数据集的方差,使其对实际总体方差的估计不太准确。 更一般地说,它会使数据集在许多方面不太准确地反映人口。
考虑替代方案很有帮助。为什么使用 0(或任何其他随机值)作为缺失点是一个坏主意?因为它将以人为的方式更改数据集,使其无法反映理想人群,并使您从数据集中得出的结论不太准确。为什么使用缺失点的平均值比使用其他值更糟糕?因为它不会改变数据集的均值——而均值通常是最重要的单一统计量。但这仍然只是一个统计数据!数据挖掘的重点是数据集除了平均值之外还包含更多信息。用平均值填充缺失点会影响所有其余信息。 因此,填充的数据集对于得出有关实际人口的结论将不太准确。差异只是进一步信息中的一个特定部分,它清楚地说明了变化。