将样本名称添加到使用s.class绘制的PCA

时间:2013-12-14 14:39:21

标签: r label pca

我正在尝试使用ade4包的s.class函数构建一个pca图。 我有一个数据集,包含不同样本(列)中丰富的细菌种类(行)。我需要执行一些统计测试并获得我的样本的一些集群,以在PCA中表示它们。 我按照论文上发表的脚本运行了这个:

>data=read.table("L4.txt",header=T,row.names=1,dec=".",sep="\t")

>data=data[-1,]

>library(cluster)

> JSD <- function(x,y) sqrt(0.5 * KLD(x, (x+y)/2) + 0.5 * KLD(y, (x+y)/2))

> KLD <- function(x,y) sum(x * log(x/y))

> dist.JSD <- function(inMatrix, pseudocount=0.000001, ...) {
  KLD <- function(x,y) sum(x *log(x/y))
  JSD<- function(x,y) sqrt(0.5 * KLD(x, (x+y)/2) + 0.5 * KLD(y, (x+y)/2))
  matrixColSize <- length(colnames(inMatrix))
  matrixRowSize <- length(rownames(inMatrix))
  colnames <- colnames(inMatrix)
  resultsMatrix <- matrix(0, matrixColSize, matrixColSize)

  inMatrix = apply(inMatrix,1:2,function(x) ifelse (x==0,pseudocount,x))

   for(i in 1:matrixColSize) {
   for(j in 1:matrixColSize) { 
   resultsMatrix[i,j]=JSD(as.vector(inMatrix[,i]),
   as.vector(inMatrix[,j]))
  }
   }
colnames -> colnames(resultsMatrix) -> rownames(resultsMatrix)
as.dist(resultsMatrix)->resultsMatrix
attr(resultsMatrix, "method") <- "dist"
return(resultsMatrix) 
}

>data.dist=dist.JSD(data)

>pam.clustering=function(x,k) { # x is a distance matrix and k the number of clusters
                      require(cluster)
                      cluster = as.vector(pam(as.dist(x), k, diss=TRUE)$clustering)
                      return(cluster)
                     }

>data.cluster=pam.clustering(data.dist,k=3)

>library(ade4)

>obs.pca=dudi.pca(data.frame(t(data)), scannf=F, nf=10)

>obs.bet=bca(obs.pca, fac=as.factor(data.cluster), scannf=F, nf=k-1)

>s.class(obs.bet$ls, fac=as.factor(data.cluster), grid=F)

我的数据如下:

                       06.TO.VG   21.TO.V   02.TO.VG   41.TO.VG    30.TO.V
Actinomycetaceae     0.000000000 0.00000000 0.000000000 0.000000000 0.000000000
Bifidobacteriaceae   0.019108280 0.00000000 0.000000000 0.000787092 0.000000000
Coriobacteriaceae    0.060006705 0.01490985 0.002632445 0.003148367 0.008313539
Propionibacteriaceae 0.000000000 0.00000000 0.000000000 0.000000000 0.000000000
Bacteroidetes        0.000000000 0.00000000 0.000000000 0.000000000 0.000000000
Bacteroidia          0.157224271 0.02288488 0.010529780 0.002361276 0.005938242
Bacteroidaceae       0.072745558 0.01178918 0.028956894 0.059031877 0.097387173
Porphyromonadaceae   0.004022796 0.01005548 0.147745969 0.026367572 0.038004751
Prevotellaceae       0.083808247 0.30374480 0.586048042 0.487603306 0.290973872
Rikenellaceae        0.025477707 0.07836338 0.011187891 0.003935458 0.004750594

我有我正在寻找的情节,但没有样本名称,所以我不知道哪些样本聚集在一起。 我还尝试构建一个包含我的数据的列名称(sampleID)的向量,然后将其传递给s.class中的label选项

> s.class(obs.bet$ls, fac=as.factor(data.cluster), grid=F, label=labs)

但我还没有他们......

有没有办法用s.class函数来获取它?

由于 弗朗西斯

1 个答案:

答案 0 :(得分:1)

无法使用s.class(...)(直接)标记各个点。正如您所指出的,label=参数标记了聚类(点类),而不是单个点。

但是,由于s.class(...)使用基础R中的绘图例程,您只需添加对text(...)的调用:

labs <- rownames(obs.bet$ls)
s.class(obs.bet$ls,fac=factor(data.cluster),grid=F, xlim=c(-4,4))
text(obs.bet$ls,labels=labs,adj=c(-.1,-.8),cex=0.8)

xlim=adj=cex=进行了大量调整,以使标签可读,但确实有效。

以下两个备选方案可能会有所帮助(希望如此)。

clusplot(obs.bet$ls,data.cluster,labels=2)

生成这个,与你的情节非常相似,标有点。

另一种选择使用ggplot

library(ggplot2)
gg <- cbind(obs.bet$ls,cluster=data.cluster)
gg <- cbind(sample=rownames(gg),gg)
ggplot(gg, aes(x=CS1, y=CS2)) + 
  geom_point(aes(color=factor(cluster)),size=5) + 
  geom_text(aes(label=sample),hjust=-0.2) + 
  geom_hline(yintercept=0,linetype=2) + 
  geom_vline(xintercept=0,linetype=2) +
  scale_color_discrete(name="Cluster") +
  xlim(-4,4)