¿Cómo utilizar los resultados de R prcomp para la predicción?

25

Tengo un data.frame con 800 obs. de 40 variables, y me gustaría utilizar el Análisis de componentes principales para mejorar los resultados de mi predicción (que hasta ahora funciona mejor con Support Vector Machine en unas 15 variables seleccionadas a mano).

Entiendo que un prcomp puede ayudarme a mejorar mis predicciones, pero no sé cómo usar los resultados de la función prcomp.

Obtengo el resultado:

> 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

Pensé que obtendría los parámetros más importantes para usar, pero no encuentro esta información. Todo lo que veo es la desviación estándar, etc. en las PC. Pero, ¿cómo uso esto para la predicción?

Tucson
fuente
2
También hay una biblioteca R pls(mínimos cuadrados parciales), que tiene herramientas para PCR ( regresión de componentes principales ).
Stepan S. Sushko

Respuestas:

35

Si bien no estoy seguro de la naturaleza de su problema, puedo decirle que he usado PCA como un medio para extraer patrones dominantes en un grupo de variables predictoras en la construcción posterior de un modelo. En su ejemplo, estos se encontrarían en los componentes principales (PC) PCAAnalysis$xy se basarían en la ponderación de las variables encontradas en PCAAnalysis$rotation. Una ventaja de este proceso es que las PC son ortogonales, por lo que elimina los problemas de multicolinealidad entre los predictores del modelo. El segundo, es que puede identificar un subconjunto más pequeño de PC que capturan la mayoría de las variaciones en sus predictores. Esta información se puede encontrar en summary(PCAAnalysis)o en PCAAnalysis$sdev. Finalmente, si está interesado en usar un subconjunto de las PC para la predicción, puede configurar el tolparámetro enprcomp a un nivel superior para eliminar las PC finales.

Ahora, puede "proyectar" nuevos datos en la base de coordenadas PCA utilizando la predict.prcomp()función. Como está llamando a su conjunto de datos un conjunto de datos de "entrenamiento", esto podría tener sentido luego proyectar un conjunto de datos de validación en su PCA para el cálculo de sus coordenadas de PC respectivas. A continuación se muestra un ejemplo de ajuste de un PCA a 4 mediciones biométricas de diferentes especies de iris (que están correlacionadas en algún grado). Después de esto, proyecto valores biométricos de un nuevo conjunto de datos de flores que tienen combinaciones similares de estas medidas para cada una de las tres especies de iris. Verá en el gráfico final que sus PC proyectadas se encuentran en un área similar de la trama que el conjunto de datos original.

Un ejemplo usando el irisconjunto de datos:

### 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()

ingrese la descripción de la imagen aquí

Marc en la caja
fuente
Gracias por proporcionar tantos detalles. Lamentablemente, el código de ejemplo es demasiado críptico para mí. Veo que estás usando predic. ¿Dónde está el manual de predicción de prcomp? ¿Está aquí: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
Tucson
Ahora he agregado más explicaciones a mi respuesta. Ojalá te sea más claro ahora. Sí, estaba correcto en su enlace a la predict.prcompayuda.
Marc en la caja del
11

La información del comando resumen () que ha adjuntado a la pregunta le permite ver, por ejemplo, la proporción de la varianza que captura cada componente principal (Proporción de varianza). Además, la proporción acumulativa se calcula a la salida. Por ejemplo, necesita tener 23 PC para capturar el 75% de la variación en su conjunto de datos.

Ciertamente, esta no es la información que normalmente usa como entrada para análisis posteriores. Por el contrario, lo que generalmente necesita son los datos rotados, que se guardan como 'x' en el objeto creado por prcomp.

Usando el código R como un breve ejemplo.

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

Luego puede usar los datos en el newdat para análisis adicionales, por ejemplo, como entrada a SVM o algún modelo de regresión. Además, consulte, por ejemplo, /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r para obtener más información.

JTT
fuente
1
Gracias @JTT. Entonces, si ahora uso newdat para crear un modelo SVM, supongo que mi modelo toma información en este nuevo universo girado, lo que significa que también necesitaré rotar mis datos de Prueba antes de aplicarlo al modelo. ¿Es esto correcto? Y si es así, ¿cómo gira un data.frame de prueba con la misma rotación?
Tucson
3
La forma más fácil es usar el predict()método para los datos de prueba. Usando el ejemplo anterior, predict(pr, USArrests)devolverá la misma matriz que pr$x. Para los datos de prueba, reemplace los arrestos estadounidenses con el nombre de los datos de prueba. Puede hacer lo mismo a mano, pero esto es más fácil, ya que los métodos de predicción se ocupan automáticamente de la escala correcta del conjunto de datos de prueba.
JTT
1
¿Cómo funciona el trabajo de predicción? ¿Utiliza todos los principales competidores? En su respuesta, había elegido solo 2 componentes para cubrir el 80% de la varianza. ¿Qué hace predecir?
Tucson
1
La función predict()utiliza por defecto todos los componentes. Sin embargo, puede limitar el número de componentes que se devuelven, por ejemplo, `predic (pr, USArrests) [, 1: 2]. ¿Eso funcionaría para ti?
JTT
¿Necesita centrar y escalar sus nuevos datos antes de la predicción? ¿O hace predict()eso automáticamente dados los parámetros iniciales con prcomp()?
Dale Kube