独热编码生成的分类衍生变量如何汇总以执行PCA主成分分析
独热编码变量用于PCA的操作方案
首先明确两个核心前提:
- 标准PCA仅支持数值型变量输入,直接放入原始分类因子变量无法运行,你不需要将独热编码转回原始分类变量再跑PCA
- 如果需要同时处理数值+分类混合类型数据,更推荐使用适配混合数据的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函数直接分析混合数据:
FAMD会自动处理分类变量的编码逻辑,输出结果会直接给出每个原始变量(不管是数值还是分类)对主成分的贡献,不需要手动处理哑变量分组。library(FactoMineR) famd_res <- FAMD(全数据集, ncp = 5)
方案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
相关产品推荐
相关产品推荐

