如何使用R prcomp结果进行预测?


25

我有一个800 obs的data.frame。的40个变量,并希望使用主成分分析来改善我的预测结果(到目前为止,这在支持向量机上对大约15个手工挑选的变量效果最好)。

我了解prcomp可以帮助我改善预测,但是我不知道如何使用prcomp函数的结果。

我得到结果:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

我以为可以获得最重要的参数,但是我找不到这些信息。我所看到的只是PC上的标准偏差等。但是,如何将其用于预测?


2
还有R库pls(偏最小二乘),其中包含用于PCR(主成分回归)的工具。
Stepan S. Sushko,2015年

Answers:


35

尽管我不确定您问题的性质,但可以告诉您,在以后的模型构建中,我已经使用PCA来提取一组预测变量中的主导模式。在您的示例中,这些可以在主成分(PC)中找到PCAAnalysis$x,并且它们基于中的变量的权重PCAAnalysis$rotation。此过程的一个优势是PC是正交的,因此可以消除模型预测变量之间的多重共线性问题。第二点是,您可能能够识别一小部分PC,以捕获预测变量中的大部分方差。这些信息可以发现summary(PCAAnalysis)PCAAnalysis$sdev。最后,如果您有兴趣使用一部分PC进行预测,则可以tolprcomp 更高的级别以删除落后的PC。

现在,您可以使用该predict.prcomp()功能将新数据“投影”到PCA坐标基础上。由于您将数据集称为“训练”数据集,因此将验证数据集投影到PCA基础上以计算其各自的PC坐标可能是有意义的。以下是将PCA拟合到不同虹膜种类(在某种程度上相关)的4种生物特征测量中的示例。之后,我投影了一个新的花朵数据集的生物测定值,这些数据对于三种虹膜中的每一种都具有类似的测量值组合。您将从最后的图表中看到,他们的投影PC与原始数据集位于图的相似区域。

使用iris数据集的示例:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

在此处输入图片说明


感谢您提供这么多的细节。不幸的是,示例代码对我来说太神秘了。我看到您正在使用预测。prcomp的手册在哪里预测?是这里:stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html吗?
图森,2013年

现在,我在回答中添加了更多解释。希望现在对您来说更加清晰。是的,您对predict.prcomp帮助的链接正确。
2013年

11

问题所附的summary()命令提供的信息使您可以查看例如每个主成分捕获的方差的比例(方差的比例)。另外,计算累积比例以输出。例如,您需要拥有23台PC才能捕获数据集中75%的差异。

当然,这不是您通常用作进一步分析输入的信息。而是通常需要旋转的数据,该数据在prcomp创建的对象中保存为“ x”。

以R代码为例。

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

然后,您可以将newdat中的数据用于进一步分析,例如,作为SVM的输入或某些回归模型。另外,请参阅/programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r了解更多信息。


1
谢谢@JTT。因此,如果现在使用newdat创建SVM模型,则我想我的模型将在这个新的旋转Universe中输入数据,这意味着我还需要旋转Test数据,然后再将其应用于模型。它是否正确?如果是的话,如何以相同的旋转角度旋转测试data.frame?
tucson

3
最简单的方法是将predict()方法用于测试数据。使用上面的示例,predict(pr, USArrests)将返回与相同的矩阵pr$x。对于测试数据,将USarrests替换为测试数据的名称。您可以手动执行相同的操作,但是这样比较容易,因为预测方法会自动处理测试数据集的正确缩放。
JTT

1
预测效果如何?它是否使用所有主要成分?在您的答案中,您仅选择了2个分量来覆盖80%的方差。预测会做什么?
tucson

1
该函数predict()默认使用所有组件。但是,您可以限制返回的组件数,例如`predict(pr,USArrests)[,1:2]。那对你有用吗?
JTT

您需要在预测之前对新数据进行居中和缩放吗?还是predict()自动给定初始参数prcomp()
戴尔·库伯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.