我通常使用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()
但是,现在我面临的数据包含一些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
函数吗?
非常感谢!
答案 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
(标准差),sdev
和center
。虽然我怀疑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