求助:为多因子分析(MFA)绘制置信椭圆失败排查
MFA结果绘制单个椭圆问题排查与修正
问题描述
我尝试使用某论文中的函数,为多因子分析(MFA)结果绘制单个椭圆,但无法生成目标椭圆。基于FactoMineR包的示例编写了代码,请求排查错误,代码如下:
library(FactoMineR) data(wine) res <- MFA(wine, group=c(2,5,3,10,9,2), type=c("n",rep("s",5)), ncp=5, name.group=c("orig","olf","vis","olfag","gust","ens"), num.group.sup=c(1,6)) # 论文中的函数 MFAconf = function(MFAresob, axes = c(1,2)){ if (!require("FactoMineR")) install.packages("FactoMineR"); library("FactoMineR") # 样本数量(n) n = dim(MFAresob$ind$coord)[1] # 变量组数量(m) m = dim(MFAresob$group$coord)[1] # 创建新数据框,每个样本对应其所属MFA变量组的行 CATnames <- vector(mode="character", length = n*m) for (j in 1:n){CATnames[(((j-1)*m)+1):(j*m)] <- dimnames(MFAresob$ind$coord[order(row.names(MFAresob$ind$coord)),])[[1]][j]} PartielDim <- cbind.data.frame(names = CATnames,MFAresob$ind$coord.partiel) PartielDim$names = as.factor(PartielDim$names) # 对新数据框进行bootstrap Boot <- simule(PartielDim, nb.simul = 500) # 围绕95% bootstrap均值创建椭圆 EllipCoord <- coord.ellipse(Boot$simul, level.conf = 0.95, bary = FALSE, axes=axes, npoint = 100) # 绘制椭圆 plot.MFA(MFAresob, choix = "ind",title ="", axes = axes, ellipse = EllipCoord,ellipse.par = NULL) } # 将函数应用于MFA结果 MFAconf(MFAresob = res)
错误原因与修正方案
1. 椭圆生成逻辑错误
原代码中coord.ellipse的bary = FALSE参数会针对每个分组(即每个样本的重复行)生成独立椭圆,而非单个整体椭圆。需将bary设置为TRUE,让函数计算所有bootstrap样本的全局均值,再围绕该均值生成单个置信椭圆。
2. Bootstrap数据结构问题
原PartielDim中每个样本被重复m次(m为变量组数量),simule函数会按names因子分组进行bootstrap,导致生成多个分组的样本数据。我们需要调整数据结构,让bootstrap针对每个样本的完整坐标集合进行重采样,而非按重复的样本名分组。
修正后的完整代码
library(FactoMineR) data(wine) res <- MFA(wine, group=c(2,5,3,10,9,2), type=c("n",rep("s",5)), ncp=5, name.group=c("orig","olf","vis","olfag","gust","ens"), num.group.sup=c(1,6)) MFAconf <- function(MFAresob, axes = c(1,2)){ if (!require("FactoMineR")) install.packages("FactoMineR"); library("FactoMineR") # 获取样本整体坐标 sample_coords <- MFAresob$ind$coord[, axes] colnames(sample_coords) <- paste0("Dim.", axes) # 对样本整体坐标进行bootstrap Boot <- simule(data.frame(names = rownames(MFAresob$ind$coord), sample_coords), nb.simul = 500, group = "names") # 计算全局bootstrap均值并生成单个椭圆 EllipCoord <- coord.ellipse(Boot$simul, level.conf = 0.95, bary = TRUE, axes = axes, npoint = 100) # 绘制MFA散点图 plot.MFA(MFAresob, choix = "ind", title = "", axes = axes) # 手动添加单个置信椭圆 lines(EllipCoord$Ellipse[,1], EllipCoord$Ellipse[,2], col = "red", lwd = 2) } # 运行修正后的函数 MFAconf(MFAresob = res)
关键修改说明
- 直接使用样本的整体MFA坐标进行bootstrap,避免了重复行导致的多分组问题
- 将
coord.ellipse的bary参数设为TRUE,确保计算全局bootstrap均值并生成单个椭圆 - 改用
lines手动添加椭圆,规避plot.MFA的ellipse参数对多分组椭圆的默认适配逻辑
内容的提问来源于stack exchange,提问作者Mateus Piza
相关产品推荐
相关产品推荐

