如何对实验组和对照组合并数据绘制PCA结果验证组间分离
问题
我有一个包含90个观测值的数据集,其中45个是实验组样本,45个是对照组样本,每个观测值包含10个距离变量(单位:m)。我想用PCA验证实验组和对照组的观测值是否能分离,这个方法在同类数据中已经用过。
我已经完成了PCA分析,能按组别用颜色和椭圆绘制样本点,但作为R新手,我没法实现按实验组/对照组拆分并绘制变量,搜了很多资料还是搞不定,写代码总是出错。
想请教:我的思路有没有问题?有没有简便方法?需要调整数据格式吗?
当前数据格式:组名(实验组/对照组)和变量为列,观测值为行,数据示例如下:
Group variable 1 variable 2 variable 3 variable 4 variable 5 variable 6 variable 7 variable 8 1 Ctrl 227.1758 76.33834 479.79328 900.431106 74.92103 78.69078 817.950938 853.15631 2 Ctrl 122.2748 82.85017 441.36049 94.211760 48.14546 42.43298 391.669754 397.64129 3 Ctrl 212.0073 1087.69218 310.09934 801.236328 762.45060 101.45367 148.865600 452.02212 4 Ctrl 165.2110 180.89114 1125.10707 287.599761 38.21226 110.05009 377.681321 178.84576 5 Ctrl 125.6233 1356.35936 752.14057 1.540822 17.06021 239.38640 4.906561 211.59177 6 Ctrl 240.0000 108.75317 126.99220 683.712745 139.54299 663.22566 274.265917 1225.14002 7 Ctrl 219.2393 17.81320 962.80249 744.238958 200.14079 455.19716 382.870502 937.11596 8 Ctrl 240.0000 751.95769 131.03213 1024.863454 1130.30304 136.19081 357.986240 863.35511 9 Ctrl 203.0863 80.83451 139.10481 770.567722 770.11240 212.89216 84.812646 131.88929 10 Experiment 192.0000 643.99000 729.90000 292.170000 129.04000 417.28000 366.020000 699.28000 11 Experiment 228.3302 62.68912 748.05168 12.536495 13.46899 63.25804 11.021662 62.62971 12 Experiment 226.3750 164.09029 131.15948 657.808968 387.28992 171.88133 656.338016 838.65025 13 Experiment 165.1418 75.74496 1400.75860 1729.237137 585.63204 65.72580 48.848643 688.00960 14 Experiment 222.7844 360.05409 51.39071 1019.845739 1018.10060 341.20432 31.046823 572.00411 15 Experiment 154.5468 533.66462 217.38821 74.902684 214.52490 76.90764 72.429564 236.32533 16 Experiment 130.0000 1173.69122 203.44864 684.127360 690.38973 51.80260 12.048432 383.40479 17 Experiment 213.1949 28.29785 843.76458 319.815834 24.22977 167.51248 302.743708 618.30222 18 Experiment 213.2566 530.85413 364.92104 425.524837 32.45679 28.45651 66.567557 427.69808 19 Experiment 145.9915 325.44247 65.40580 533.997851 100.40048 265.10440 553.048633 370.76282 variable 9 variable 10 1 153.71433 632.975613 2 41.19583 48.973480 3 379.10343 20.407055 4 291.24420 716.283657 5 1621.15039 1169.221042 6 267.87993 302.452429 7 876.50519 807.668093 8 686.00076 146.134961 9 1392.94408 920.897862 10 800.95000 849.020000 11 1198.05713 932.001818 12 1100.65313 954.594713 13 1241.07884 67.022017 14 731.06865 178.861739 15 864.90849 112.641722 16 525.20077 1.332423 17 177.53370 672.354680 18 541.06775 1697.203881 19 68.16860 407.169531
解决方案
1. 思路没问题
你的核心需求是验证两组样本的分离性,先做整体PCA观察样本分布,再拆分分析变量对分组的贡献,这个思路完全符合PCA在分组验证中的常规用法,没有问题。
2. 数据格式无需调整
当前的宽格式(组列为分类变量,其余为数值变量)完全适配PCA分析,不需要转置、重构等操作。
3. 简便实现方法
以下方案基于你参考的教程常用的FactoMineR和factoextra包,适合R新手快速实现:
方案1:分别对两组做PCA并绘制变量载荷图
拆分数据集后分别跑PCA,对比两组的变量分布特征:
# 加载依赖包 library(FactoMineR) library(factoextra) # 替换为你的数据集名称 your_data <- read.csv("your_data.csv") # 拆分数据集,剔除Group列 ctrl_data <- subset(your_data, Group == "Ctrl", select = -Group) exp_data <- subset(your_data, Group == "Experiment", select = -Group) # 分别执行PCA(关闭默认绘图) pca_ctrl <- PCA(ctrl_data, scale.unit = TRUE, graph = FALSE) pca_exp <- PCA(exp_data, scale.unit = TRUE, graph = FALSE) # 绘制对照组变量载荷图 fviz_pca_var(pca_ctrl, col.var = "black", title = "Ctrl组变量PCA载荷") # 绘制实验组变量载荷图 fviz_pca_var(pca_exp, col.var = "red", title = "Experiment组变量PCA载荷")
方案2:在整体PCA变量图中标注变量与分组的相关性
如果不想拆分跑PCA,可以通过变量与分组的相关性,直观展示哪些变量对分组区分贡献更大:
library(FactoMineR) library(factoextra) # 整体PCA分析 pca_total <- PCA(your_data[, -1], scale.unit = TRUE, graph = FALSE) # 将分组转为数值变量(Ctrl=0,Experiment=1) group_num <- as.numeric(factor(your_data$Group)) - 1 # 计算每个变量与分组的相关性 var_corr <- cor(your_data[, -1], group_num) # 绘制带相关性颜色的变量载荷图 fviz_pca_var(pca_total, col.var = var_corr, gradient.cols = c("blue", "white", "red"), title = "变量与分组相关性的PCA载荷图")
方案3:绘制两组样本的主成分得分箱线图
直接对比两组在主成分维度上的分布差异,验证分离效果:
# 获取整体PCA的样本得分 pca_scores <- as.data.frame(pca_total$ind$coord) pca_scores$Group <- your_data$Group # 绘制第一主成分得分的组间箱线图 boxplot(PC1 ~ Group, data = pca_scores, main = "两组样本PC1得分分布", xlab = "分组", ylab = "PC1得分")
内容的提问来源于stack exchange,提问作者Kerry
相关产品推荐
相关产品推荐

