You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FactoMineR绘图疑问:两种MCA个体绘图结果为何不一致?

问题

我用R的FactoMineR结合ISLR包的Wage数据集做分析,可复现代码如下:

library(FactoMineR)
library(factoextra)
library(ISLR)

data("Wage")
attach(Wage)

# 离散化年龄和对数工资
Wage$age <- discretize(Wage$age, breaks = 3)
levels(Wage$age)
levels(Wage$age) <- c("age_blw37", "age_37_48", "age_48_80")

Wage$logwage <- discretize(Wage$logwage, breaks = 3)
levels(Wage$logwage)
levels(Wage$logwage) <- c("income_low", "income_med", "income_high")

# 只保留因子变量
drops <- c("wage","year")
Wage <- Wage[ , !(names(Wage) %in% drops)]

# 执行MCA分析
res.mca <- MCA(Wage, graph = FALSE)

# 获取前5个维度的矩阵
dimens <- get_mca_ind(res.mca)
dimens <- data.frame(dimens$contrib)

# 用这个矩阵绘制3000个数据点在Dim1和Dim2上的分布
plot(dimens$Dim.1, dimens$Dim.2)

# 用内置函数绘制3000个数据点在Dim1和Dim2上的分布
fviz_mca_ind(res.mca, addlabels = TRUE)

我尝试过绘制plot(log(dimens$Dim.1), log(dimens$Dim.2)),结果还是和fviz_mca_ind的图不一样,说明不是对数维度的问题。那为什么两张图不一致?fviz_mca_ind实际绘制的不是标注的前两个维度吗?

解答
  • 核心问题是你取错了数据:get_mca_ind(res.mca)$contrib是每个个体对对应维度的贡献度,不是个体在MCA维度上的坐标值。而fviz_mca_ind默认绘制的是个体在MCA空间中的坐标值,也就是get_mca_ind(res.mca)$coord。
  • 修正你的代码,把dimens$contrib换成dimens$coord,再绘图就会和fviz_mca_ind的结果一致:
# 获取个体的坐标值而非贡献度
dimens <- get_mca_ind(res.mca)
dimens <- data.frame(dimens$coord)

# 重新绘图
plot(dimens$Dim.1, dimens$Dim.2)
  • 简单说,你自己画的是“每个数据点对维度1、2的贡献大小”,而fviz_mca_ind画的是“数据点在维度1、2构成的空间里的位置”,两者完全不是一个概念,所以图自然不一样。

内容的提问来源于stack exchange,提问作者Leah Bevis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:35:06