如何对R中0/1值布尔二进制数据绘制PCA图及选择可视化方案?
0/1布尔型性状数据的PCA绘制方法
PCA本质是面向连续变量的降维方法,对二进制数据使用时建议做标准化处理降低变量尺度差异的影响,实现代码如下:
# 读入数据,要求行是样本,列是0/1性状,可自行增加分组列 mydata <- read.csv("your_binary_data.csv", row.names = 1) # 转换为数值矩阵,若最后一列是分组变量则保留,没有分组可删除[,-1] binary_mat <- as.matrix(mydata[, -1]) group <- mydata$group # 无分组可删除该行 # 运行PCA pca <- prcomp(binary_mat, scale. = TRUE) # 提取前两个主成分的解释度 pca_var <- summary(pca)$importance[2,1:2] # 用ggplot2绘制散点图 library(ggplot2) plot_df <- data.frame( PC1 = pca$x[,1], PC2 = pca$x[,2], group = group # 无分组删除该行 ) ggplot(plot_df, aes(x=PC1, y=PC2, color=group)) + # 无分组删除color参数 geom_point(size=2) + labs(x=paste0("PC1 (", round(pca_var[1]*100, 1), "%)"), y=paste0("PC2 (", round(pca_var[2]*100, 1), "%)")) + theme_bw()
注意:PCA默认使用欧氏距离计算样本差异,对0/1二进制数据的匹配度不高,分组特征可能无法完全体现,可优先使用以下更适配的可视化方法。
更适配二进制性状数据的可视化方法
多重对应分析(MCA)
专门针对分类变量(含二元分类)设计的降维方法,使用卡方距离计算样本差异,比PCA更适配0/1性状数据,实现代码如下:library(FactoMineR) library(factoextra) # 将0/1数值转为因子类型 binary_df <- as.data.frame(lapply(binary_mat, as.factor)) # 运行MCA mca <- MCA(binary_df, graph = FALSE) # 绘制散点图 fviz_mca_ind(mca, geom.ind = "point", col.ind = group, # 无分组删除该参数 legend.title = "分组", repel = TRUE) + theme_bw()聚类热图
无需降维,直接可视化原始0/1矩阵的性状分布规律,同时对样本和性状做聚类,可直观展示分组和性状的关联:library(pheatmap) pheatmap(binary_mat, # 无分组可删除annotation_row参数 annotation_row = data.frame(group=group, row.names = rownames(binary_mat)), color = c("#E64B35", "#4DBBD5"), # 0、1对应的颜色可自定义 cluster_rows = TRUE, cluster_cols = TRUE, show_rownames = TRUE, show_colnames = TRUE)UMAP/t-SNE非线性降维
样本量较大时优先选择,使用适配二进制数据的Jaccard距离或汉明距离计算样本差异,局部分组效果远优于PCA:library(vegan) library(umap) library(ggplot2) # 计算Jaccard距离矩阵 dist_jaccard <- vegdist(binary_mat, method = "jaccard") # 运行UMAP降维 umap_res <- umap(as.matrix(dist_jaccard)) # 构造绘图数据 umap_df <- data.frame( UMAP1 = umap_res$layout[,1], UMAP2 = umap_res$layout[,2], group = group # 无分组删除该行 ) # 绘图 ggplot(umap_df, aes(x=UMAP1, y=UMAP2, color=group)) + # 无分组删除color参数 geom_point(size=2) + theme_bw()
内容的提问来源于stack exchange,提问作者Sukeshini
相关产品推荐
相关产品推荐

