FactoMineR中FAMD分析定性变量绘图异常问题咨询
FAMD分析问题解答
问题背景
数据集包含25个记录身体部位荧光有无的二元定性变量、6个定量变量,以及性别、属、深度等补充变量,在运行FAMD时遇到两个问题:
- 用
na.omit()移除缺失值后,绘制定性变量二维图时显示无法解释的小数,而非类别标签 - 用
missMDA::imputeFAMD()处理缺失值后,绘图中类别重复出现,且带有_0和_1后缀
1. 明显错误识别
第一个问题的根源
二元定性变量可能被误识别为数值型,或者部分变量因缺失值移除后只剩单一水平(比如所有样本的某部位荧光都是0),导致FAMD将其当作定量变量处理,绘图时显示数值而非类别标签。
第二个问题的根源
手动将imputeFAMD()生成的tab.disj(定性变量的虚拟编码矩阵)传入FAMD()时,原始数据集的定性变量仍会被FAMD自动重新编码,导致同一类别被两次编码,出现重复标签。
2. 类别重复带_0/_1后缀的原因
imputeFAMD()的tab.disj已经是定性变量的虚拟变量编码结果,而FAMD()默认会对输入数据中的所有定性变量再次生成虚拟变量。同时传入原始数据集和tab.disj,会让FAMD同时处理两组编码后的变量,最终绘图时就会出现同一类别重复显示(一组是原始类别名,另一组是虚拟变量的_0/_1后缀名)。
3. 对整体分析的影响
这种重复编码会导致定性变量的权重被错误放大,干扰维度的解释性,降低分析结果的可靠性;同时重复的标签会让可视化结果混乱,无法准确解读变量间的关系。
4. 数据集是否适合FAMD
完全适合!FAMD的核心就是处理混合定性与定量变量的数据集,你的数据包含二元定性(荧光有无)、多分类定性(属、性别)和定量变量(深度、荧光强度),正好匹配FAMD的适用场景,能有效整合两类变量的信息进行降维分析。
解决方案
针对“绘图显示小数”问题
- 确保二元变量为因子类型:检查并转换所有二元定性变量为
factor,避免被当作数值处理:
# 替换为你的二元变量列名列表 binary_vars <- c("frontal_dorsal", "frontal_ventral", "mesogastric", ...) fluo_famd1[binary_vars] <- lapply(fluo_famd1[binary_vars], as.factor)
- 移除无信息的单一水平变量:如果某定性变量所有样本的取值都相同(比如ps4全为0),这类变量对分析无贡献,可提前移除:
# 筛选出多水平的定性变量 qual_vars <- sapply(fluo_famd1, is.factor) single_level <- sapply(fluo_famd1[, qual_vars], function(x) length(levels(x)) == 1) fluo_famd1 <- fluo_famd1[, !single_level]
- 重新运行FAMD并绘图:
res.famd1 <- FAMD(fluo_famd1, sup.var=c(1,2,28,35), graph=FALSE, ncp=5) fviz_famd_var(res.famd1, "quali.var")
针对“类别重复”问题
无需手动传入tab.disj,直接使用imputeFAMD()返回的插补后完整数据集运行FAMD即可:
library(missMDA) library(FactoMineR) library(factoextra) # 缺失值插补 res.impute <- imputeFAMD(fluo_famd2, ncp=3) # 使用插补后的完整数据集运行FAMD res.famd2 <- FAMD(res.impute$completeObs, sup.var=c(1,2,28), graph=FALSE, ncp=5) # 绘制定性变量图 fviz_famd_var(res.famd2, "quali.var")
内容的提问来源于stack exchange,提问作者Susanne Bähr
相关产品推荐
相关产品推荐

