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

求助:为多因子分析(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:28