R:如何将ggbiplot与pcaRes对象一起使用?绘制具有缺失值的数据的PCA结果

时间:2018-04-04 02:39:43

标签: r plot pca ggbiplot biplot

我通常使用prcomp函数执行主成分分析,并使用ggbiplot(或者仅ggplot2提取pca.obj$x)以奇特的方式绘制结果。

像这样:

#install_github("vqv/ggbiplot")
library(ggbiplot)
data(iris)
pca.obj <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE)
P <- ggbiplot(pca.obj,
         obs.scale = 1, 
         var.scale=1,
         ellipse=T,
         circle=F,
         varname.size=3,
         var.axes=T,
         groups=iris$Species, #no need for coloring, I'm making the points invisible
         alpha=0) #invisible points, I add them below
P$layers <- c(geom_point(aes(color=iris$Species), cex=5), P$layers) #add geom_point in a layer underneath (only way I have to change the size of the points in ggbiplot)
png(filename="test.png", height=600, width=600)
print(#or ggsave()
    P
)
dev.off()

test1

但是,现在我面临的数据包含一些NAs,我正在使用pcaMethods包中的pca包装函数,应用nipals方法(一种迭代方法)处理少量缺失值。)

pca返回类pcaRes的对象,ggbiplot返回以下错误:

#introduce NAs
iris$Sepal.Length[sample(1:150, 5)] <- NA
iris$Sepal.Width[sample(1:150, 5)] <- NA
iris$Petal.Length[sample(1:150, 5)] <- NA
iris$Petal.Width[sample(1:150, 5)] <- NA
#pca.obj2 <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE) #cannot use prcomp with NAs
#source("https://bioconductor.org/biocLite.R")
#biocLite("pcaMethods")
library(pcaMethods)
pca.obj2 <- pca(iris[,1:4], method="nipals", nPcs=3, center=TRUE, scale.=TRUE)
class(pca.obj2)
ggbiplot(pca.obj2)
  

ggbiplot(pca.obj2)中的错误:期望类prcomp的对象,   princomp,PCA或lda

我的问题是:

如何将ggbiplot应用于pcaRes对象?

如何将此对象转换为prcomp对象?

我可以使用其他函数获取相同类型的绘图,而不是ggbiplot接受pcaRes对象吗?

我应该只用变量的平均值替换NA值并像往常一样应用prcomp函数吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

首先,找到一个可以处理NA的PCA包。

由于ggbiplot不接受pcaRes个对象,我们可以使用pcaRes获取的数据并将其隐藏到原始prcomp对象中。

显然,您的真实数据已经包含NA值,因此我们将从该数据集开始并将它们换成一些虚拟值,以允许我们运行第一个prcomp {{1 }}

pca

然后我们像您一样运行第一个iris_na<-iris iris_na$Sepal.Length[sample(1:150, 5)] <- NA iris_na$Sepal.Width[sample(1:150, 5)] <- NA iris_na$Petal.Length[sample(1:150, 5)] <- NA iris_na$Petal.Width[sample(1:150, 5)] <- NA iris_dummy<-iris_na iris_dummy[is.na(iris_dummy)]<-7777 #swap out your NAs with a dummy number so prcomp will run

pca

此对象有5个组件,pca.obj <- prcomp(iris_dummy[,1:4], center=TRUE, scale.=TRUE) (得分),x(加载),rotation(标准差),sdevcenter 。虽然我怀疑scale只使用得分和加载,但我们会将它们全部换掉以确保。

查看分数组件ggbiplot向我们显示已在pca.obj$x函数中计算了四个主要组件。

prcomp

head(pca.obj$x)

因此,当我们使用# PC1 PC2 PC3 PC4 #[1,] -2.656740 0.3176722 0.03763067 -0.04122948 #[2,] -2.688275 -0.1821744 0.19912795 0.07297624 #[3,] -2.862673 -0.1447518 -0.02134749 -0.02462359 #[4,] -2.718294 -0.3189371 -0.03318459 -0.11675762 #[5,] -2.700864 0.3274887 -0.07503096 -0.11347939 #[6,] -2.252918 0.7436711 -0.14611455 -0.08218007 运行下一个pca时,我们确保指定使用pcaRes参数计算4个主成分。这里我们使用的是真实数据,其中包含nPcs

NAs

然后,只需更换pca.obj2 <- pca(iris_na[,1:4], method="nipals", nPcs=4, center=TRUE, scale.=TRUE)值的pcaRes值并将其传递给prcomp

ggbiplot

enter image description here