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

独热编码生成的分类衍生变量如何汇总以执行PCA主成分分析

独热编码变量用于PCA的操作方案

首先明确两个核心前提:

  1. 标准PCA仅支持数值型变量输入,直接放入原始分类因子变量无法运行,你不需要将独热编码转回原始分类变量再跑PCA
  2. 如果需要同时处理数值+分类混合类型数据,更推荐使用适配混合数据的FAMD(多因子分析),无需提前做独热编码

方案1:直接使用独热编码结果跑PCA(最常用)

操作步骤如下:

  • 预处理规避共线性问题:k个取值的分类变量生成k个独热编码变量会存在完全共线性,你可以每类分类变量删除1个作为参考水平的衍生变量,比如床型变量可以删掉V1_Airbed,剩下3个哑变量即可
  • 拼接全量数值矩阵:将所有处理后的独热编码变量、原始数值变量按列拼接为完整矩阵,示例代码:
    # 拼接床型、房间类型等所有独热编码变量+原始数值变量
    pca_input <- cbind(df_mw_neu_bed[, -1], # 删掉参考水平的床型变量
                       df_mw_neu_roomtype[, -1], # 删掉参考水平的房间类型变量
                       其他数值变量数据框)
    
  • 执行PCA:如果已经提前做过标准化,直接运行即可:
    pca_res <- prcomp(pca_input, scale. = FALSE)
    
  • 结果解读:看载荷矩阵时按原始变量前缀分组即可,比如所有V1_开头的变量对应床型的贡献,所有V2_开头的变量对应房间类型的贡献,不需要提前做变量分组的结构处理。

方案2:转回原始分类变量后用FAMD分析(结果更易解读)

如果你希望用原始分类变量的维度做分析,可以先把独热编码转回原始因子变量,再跑FAMD:

  • 独热编码转回原始因子的代码示例(以床型为例):
    df$beds <- factor(names(df_mw_neu_bed)[max.col(df_mw_neu_bed)],
                      levels = c("Airbed", "Couch", "Futon", "Real"))
    
    所有分类变量都按以上逻辑转回后,和原始数值变量拼接为包含混合类型的全数据集
  • 用FactoMineR包的FAMD函数直接分析混合数据:
    library(FactoMineR)
    famd_res <- FAMD(全数据集, ncp = 5)
    
    FAMD会自动处理分类变量的编码逻辑,输出结果会直接给出每个原始变量(不管是数值还是分类)对主成分的贡献,不需要手动处理哑变量分组。

方案3:分块PCA(匹配你提到的子列分组需求)

如果你需要明确按原始变量分组计算贡献,可以使用分块PCA方法,将每个原始分类变量对应的所有独热编码变量作为一个独立块、数值变量作为单独块,用ade4包实现:

library(ade4)
# 定义变量块,比如床型为第一个块,房间类型为第二个块,数值变量为第三个块
blocks <- list(bed = df_mw_neu_bed, roomtype = df_mw_neu_roomtype, numeric = 数值变量数据框)
block_pca <- dudi.pca(blocks, scale = FALSE, scannf = FALSE, nf = 5)

输出结果会直接给出每个块的贡献度,完全匹配你想要的子列分组需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:12:00