【问题标题】:How would I split a histogram or plot that show the number of main Principal Components?如何拆分显示主要主成分数量的直方图或绘图?
【发布时间】:2020-03-31 20:40:34
【问题描述】:

我使用 FactoMineR 包中的 prcomp 函数在相当大的 3000 x 500 数据集上执行了 PCA 分析。

我尝试使用 fviz_eig 图绘制覆盖高达 100% 累积方差比例的主要主成分。但是,由于数据集的维度很大,这是一个非常大的图。 R中是否有任何方法可以使用for循环或任何其他方式将一个图拆分为多个图?

这是我的情节的视觉效果,由于它很大,它只涵盖了 80% 的方差。我可以把这个地块分成 2 个地块吗?

Large Dataset Visualisation

我尝试过使用 for 循环来拆分情节...

for(i in data[1:20]) {
  fviz_eig(data, addlabels = TRUE, ylim = c(0, 30))
}

但这不起作用。

已编辑的可重现示例:

这只是一个使用 R 中已有数据集的可重现的小示例,但我对大型数据集使用了类似的方法。它将向您展示情节的实际运作方式。

# Already existing data in R.
install.packages("boot")
library(boot)
data(frets)
frets

dataset_pca <- prcomp(frets)
dataset_pca$x

fviz_eig(dataset_pca, addlabels = TRUE, ylim = c(0, 100))

但是,我的大型数据集有比这个更多的 PC(可能 100 或更多以覆盖高达 100% 的累积方差比例),因此这就是为什么我想要一种将单个图拆分为多个图的方法以获得更好的可视化效果。

更新:

我已经执行了下面@G5W 所说的...

 data <- prcomp(data, scale = TRUE, center = TRUE)

 POEV = data$sdev^2 / sum(data$sdev^2)
 barplot(POEV, ylim=c(0,0.22))

 lines(0.7+(0:10)*1.2, POEV, type="b", pch=20)
 text(0.7+(0:10)*1.2, POEV, labels = round(100*POEV, 1), pos=3)

 barplot(POEV[1:40], ylim=c(0,0.22), main="PCs 1 - 40")
 text(0.7+(0:6)*1.2, POEV[1:40], labels = round(100*POEV[1:40], 1),
 pos=3)

我现在得到了如下图...

Graph

但我发现很难让标签出现在每个条形上方。有人可以为此提供帮助或建议吗?

【问题讨论】:

  • 如果您使用内置的 prcomp 函数,然后使用类似 ggfortify cran.r-project.org/web/packages/ggfortify/vignettes/… 的功能,则每个图将自动拆分为 2 个 PCA(纵轴上 1 个,横轴上另一个)
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则会更容易为您提供帮助。
  • @MrFlick 请查看编辑。希望这会有所帮助!
  • 您的示例是朝着正确方向迈出的一步,但我不太确定您想要什么。为什么你显示的图表不够好?你想要什么样的分裂?一次可能有 10 个 PCA?
  • @G5W 是的,对于这个特定的可重现示例来说,它已经足够好了。但是,对于我更大的数据集,我需要 70 多个 PCA 才能达到 100%。因此,这会产生一个非常拥挤的图,因此我需要将图拆分为多个图,例如一次 10 个 PCA。任何建议都会很棒!

标签: r histogram data-visualization pca prcomp


【解决方案1】:

我不是 100% 确定你想要什么结果, 但我 100% 确定您需要更多地控制 正在绘制什么,即自己做更多的事情。 所以让我展示一个这样做的例子。 frets 数据 你使用的只有 4 个维度,所以很难说明 如何处理更多维度,所以我将改为使用 nuclear 数据 - 也可在 boot 包中找到。我要去 首先重现您显示的图表类型 然后改变它。

library(boot)
data(nuclear)
N_PCA = prcomp(nuclear)
plot(N_PCA)

prcomp 对象的基本图类似于fviz_eig 您显示但具有三个主要区别的绘图。第一的, 它显示的是实际差异 - 而不是差异百分比 解释。其次,它不包含连接线 酒吧的顶部。三、它没有文字标签 告诉盒子的高度。

解释的差异百分比。 prcomp 的返回包含 原始信息。 str(N_PCA) 表示有标准 偏差,而不是方差 - 我们想要总的比例 变化。所以我们只是创建它并绘制它。

POEV = N_PCA$sdev^2 / sum(N_PCA$sdev^2)
barplot(POEV, ylim=c(0,0.8))

这解决了与fviz_eig 图的第一个区别。 关于这条线,你可以很容易地添加,如果你觉得你需要它, 但我建议不要这样做。那条线告诉你什么 还不能从条形图中看到?如果你也担心 太多杂乱的信息掩盖了信息,摆脱了线路。但 以防万一,你真的想要它,你可以添加一行

lines(0.7+(0:10)*1.2, POEV, type="b", pch=20)

但是,我会忽略它,因为我只是认为它很杂乱。

最后,你可以用

添加文字
text(0.7+(0:10)*1.2, POEV, labels = round(100*POEV, 1), pos=3)

这也有点多余,但特别是如果你改变 秤(正如我即将做的那样),它可能有助于进行比较。

好的,现在我们有了您原始图表的内容,这很容易 把它分成几个部分。对于我的数据,前两个条是 大,所以其余的很难看到。事实上,PC 的 5-11 显示为零。 让我们分离出前 4 个,然后是其余的。

barplot(POEV[1:4], ylim=c(0,0.8), main="PC 1-4")
text(0.7+(0:3)*1.2, POEV[1:4], labels = round(100*POEV[1:4], 1),
     pos=3)

barplot(POEV[5:11], ylim=c(0,0.0001), main="PC 5-11")
text(0.7+(0:6)*1.2, POEV[5:11], labels = round(100*POEV[5:11], 4),
     pos=3, cex=0.8)

现在我们可以看到,即使 PC 5 比 1-4 中的任何一个小得多, 它比 6-11 大一点。

我不知道你想用你的数据显示什么,但如果你 可以找到合适的方式来对组件进行分组,您可以 放大您想要的任何 PC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多