【问题标题】:Problems Plotting PCA in R with ggplot2使用 ggplot2 在 R 中绘制 PCA 的问题
【发布时间】:2020-09-15 21:40:41
【问题描述】:

我目前正在尝试为我的数据绘制 PCA,当我运行代码时遇到以下问题。

此外,任何人都可以帮助获取我的数据和代码并生成 PLS-DA 吗?像图片中的那样?我找不到任何好的教程。

我该如何解决这个问题?绘图应如下所示:

所以经过一些帮助,我走到了这一步:

我的代码:


    library(ggplot2)
library(ggforce)

all_datanoT <- cbind(amino,sphingo,hexose,phospha,lyso,cleaned_xl_Kopie)
all_datawT <- cbind(aminotnos,sphingo,hexose,phospha,lyso,cleaned_xl_Kopie)
rownames(all_datawT) <- sample_id$`Sample Identification`


alldata_naomit <-na.omit(all_datanoT)
all_datawTnaomit <-na.omit(all_datawT)

mypr <- prcomp(log2(alldata_naomit), scale = TRUE)
summary(mypr)

str(mypr)
mypr$x


PC1 <- mypr$x[, 1]
PC2 <- mypr$x[, 2]
pcat <- cbind(all_datawTnaomit, PC1, PC2)



ggplot(  
  data = pcat,
  aes(
    x = PC1,
    y = PC2,
    fill = 'Time point',
    line = 1
  ),
  shape = 1
) +
  geom_point(
    shape = 21,
    colour = "black",
    size = 2,
    stroke = 0.5,
    alpha = 0.6
  ) +
  scale_fill_brewer(palette = "Set1") +
  scale_color_brewer(palette = "Set1") +
  geom_mark_ellipse(
    aes(
      fill = 'Time point',
      color = 'Time point'
    ),
    alpha = 0.05
  ) 

产生以下情节:

如何让它为两个椭圆 T0 和 T1 使用两个不同的时间值?以及如何轻松估算我的数据,以便将 Na 替换为列手段,例如,而不是省略它们以便我可以绘制?

带有 dput() 的原始样本数据

dput(pcat[sample(nrow(pcat),50)])

https://gist.github.com/bicvn/47d97929a63ff99e9b260e8658407ae3

dput

https://gist.github.com/bicvn/b06279c6bfa641303b57a3ad2cc07a21

【问题讨论】:

  • 能否请dput(pcat[sample(nrow(pcat),50),]) 并添加到您的问题以重现您的问题?
  • 它太大了,无法在编辑中添加或作为答案,我将尝试用它生成一个文档
  • 新数据中不存在时间点!!!
  • 不,很确定,您也可以在我发布的 dput 中找到值 T0 和 T1

标签: r ggplot2 pca


【解决方案1】:

也检查一下,这里我举了一个例子。该技巧使用Comps &lt;- as.data.frame(mypca$x) 隔离组件,然后添加到原始数据。之后,您可以使用 cbind()Comps[,c(1,2)] 仅提取前两个组件。在这里,我使用了iris 数据集:

library(ggplot2)
library(ggforce)
#Data
data("iris")
#PCA
mypca <- prcomp(iris[,-5])
#Isolate components
Comps <- as.data.frame(mypca$x)
#Extract components and bind to original data
newiris <- cbind(iris,Comps[,c(1,2)])
#Plot
ggplot(newiris, aes(x=PC1, y=PC2, col = Species, fill = Species)) +
  stat_ellipse(geom = "polygon", col= "black", alpha =0.5)+
  geom_point(shape=21, col="black")

输出:

在数据共享的情况下,仅不应用 NA 操作。这里是您共享的数据的代码和输出:

#Code
ggplot(pcat, aes(x=PC1, y=PC2, col = `Time point`, fill = `Time point`)) +
  stat_ellipse(geom = "polygon", col= "black", alpha =0.5)+
  geom_point(shape=21, col="black")

输出:

【讨论】:

  • 谢谢!!我会尽快正确使用 cbind 函数,正如您在其他答案评论中看到的那样,我在那里遇到错误。
  • @docelfein 原始数据和组件必须具有相同的维度。您能否先在新数据框中提取组件并在将要绑定的两个数据上使用dim() 来检查?
  • 我编辑了这个问题,我没有省略 all_datawT 并且它有效!但是还有一个问题
  • 感谢到目前为止的所有帮助,我希望我不会太困惑!刚开始使用 r!
  • @docelfein 我已经添加了一个更新,如果你有NA 不要应用na.omit() 保留数据,因为ggplot2 可以处理NA
【解决方案2】:

您的代码和输出之间似乎存在差异:

pcat <- cbind(all_datawT, mypr$x[, 1:2])

将 mypr$x 的前两列添加到数据框中。但输出显示:

mypr$x[1:2]

这是矩阵 x 的前两个值。如果您查看该列,您将看到这两个值在数据中重复出现。在 R 中,这是循环利用,这是使用 cbind 组合不同长度的向量时的默认过程。

未找到变量 PC1PC2,因为您从未使用这些值创建任何对象,例如

PC1 <- mypr$x[, 1]
PC2 <- mypr$x[, 2]
pcat <- cbind(all_datawT, PC1, PC2)

应该可以的。

【讨论】:

  • 谢谢!!但是当我运行pcat &lt;- cbind(all_datawT, PC1, PC2) 时,我收到以下错误:data.frame 中的错误(...,check.names = FALSE):参数暗示不同的行数:90、35
  • 比较 length(PC1)nrow(all_datawT) 。如果它们不一样,也许原始数据中存在缺失值?或者您输入了mypr$x[1] 而不是mypr$x[, 1]
  • PC1 的值为 35 而nrow(all_datawT) 的值为 90,一旦我知道如何,我想估算几个 Na,但我使用 na.omit() 来获取摆脱它们,所以不知道在这里做什么
  • 我编辑了这个问题,我没有省略all_datawT,它成功了!但是还有一个问题
  • 我对 r 和 stackoverflow 完全陌生,希望我不会太困惑!感谢您迄今为止的所有帮助!
猜你喜欢
  • 2020-08-02
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2022-08-13
  • 2021-02-10
  • 2017-06-19
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多