使用R中马氏距离计算多元离群值时绘图报错咨询
解析R中mvoutlier包uni.plot报错及警告信息
你在使用mvoutlier包的uni.plot函数结合马氏距离检测多元离群值时,遇到了绘图失败的报错和协方差计算的警告,咱们逐个拆解这些信息的含义:
一、covMcd的警告信息详解
这个警告来自mvoutlier内部调用的covMcd函数(用于计算稳健协方差矩阵,是马氏距离计算的核心步骤),分为两部分:
- 第一部分警告:
The 112-th order statistic of the absolute deviation of variable 8 is zero.
你处理后的数据集第8列(对应原Glass数据集的第9列,因为你排除了第10列的Type变量),它的绝对偏差排序后第112个值是0。直白点说,这列数据里有大量数值完全相同的观测,导致数据的离散程度极低,甚至出现了绝对偏差为0的情况,这会干扰稳健协方差的计算稳定性。 - 第二部分警告:
There are 176 observations... lying on the hyperplane...
这进一步说明,有176个观测在第8列的取值完全一致(或者说相对于稳健均值的偏差为0),相当于这176个点都落在了一个超平面上(这里就是第8列等于某个固定值的平面)。这种情况会让协方差矩阵接近奇异矩阵(因为该变量的方差几乎为0),而马氏距离的计算需要协方差矩阵的逆矩阵,这就为后续计算埋下了隐患。
二、plot.window报错的根源
报错Error in plot.window(...) : 'ylim' needs finite values直接导致图像无法生成,本质原因就是上面的警告:
因为协方差矩阵计算异常,uni.plot在推导绘图所需的y轴范围时,得到了非有限值(比如NA、无穷大),系统无法设置有效的y轴边界,自然没法生成图像。
三、可行的解决思路
针对这个问题,你可以试试这些方法:
- 检查并处理问题变量:先查看原Glass数据集第9列的情况,用
table(Glass[,9])统计频数,var(Glass[,9])查看方差。如果这个变量对你的离群值检测没有帮助,可以直接删除它,再重新执行后续步骤。 - 调整稳健协方差参数:
covMcd函数的alpha参数控制了用于计算稳健协方差的样本比例,你可以尝试调整这个值(比如设为0.75),让算法聚焦于核心样本,避开那些导致奇异的点。 - 换用手动计算+可视化:如果
uni.plot暂时用不了,可以手动计算稳健马氏距离,再用基础绘图工具查看:# 计算稳健协方差(调整alpha参数) mcd_result <- covMcd(mydata.numeric.scaled, alpha = 0.75) # 计算稳健马氏距离 mahal_dist <- mahalanobis(mydata.numeric.scaled, center = mcd_result$center, cov = mcd_result$cov) # 绘制马氏距离直方图,直观查看离群值 hist(mahal_dist, breaks = 20, main = "稳健马氏距离分布", xlab = "马氏距离")
内容的提问来源于stack exchange,提问作者Skullgreymon
相关产品推荐
相关产品推荐

