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
相关产品推荐
相关产品推荐

