L`analisi in componenti principali
Transcript
L`analisi in componenti principali
15/03/2017 20:06 1/14 L'analisi in componenti principali L'analisi in componenti principali L’analisi in componenti principali è una tecnica fattoriale di analisi multivariata dei dati. Una presentazione dettagliata della tecnica è disponibile su Wikipedia. Testi in italiano, con esempi in campo sociologico sono (fra gli altri): Bolasco, S. (1999). Analisi multidimensionale dei dati. Metodi, strategie e criteri d’interpretazione. Roma: Carocci. Franco, G. D. (2005). EDS: esplorare, descrivere e sintetizzare i dati. Guida pratica all’analisi dei dati nella ricerca sociale. Milano: FrancoAngeli. Cannavò, L., & Frudà, L. (2007). Ricerca sociale. Dall’analisi esplorativa al data mining. Roma: Carocci. La funzione prcomp prcomp(x, retx = TRUE, center = TRUE, scale. = FALSE, tol = NULL, ...) Per mostrare i comandi e gli output, utilizziamo il Datasets di esempio “USArrests”. Come prima cosa, andrebbe sempre controllata la linearità delle relazioni fra le variabili contenute nel dataset, ad esempio con uno scatterplot. > plot(USArrests) Utilizziamo la funzione prcomp, con l’opzione scale=TRUE, ovvero normalizzando le variabili (varianza = 1). > PCA <- prcomp(USArrests, scale = TRUE) > print(PCA) Standard deviations: [1] 1.5748783 0.9948694 0.5971291 0.4164494 Rotation: Murder Assault PC1 -0.5358995 -0.5831836 PC2 PC3 PC4 0.4181809 -0.3412327 0.64922780 0.1879856 -0.2681484 -0.74340748 MetRef - http://www.agnesevardanega.eu/metref/ Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 UrbanPop -0.2781909 -0.8728062 -0.3780158 Rape -0.5434321 -0.1673186 0.8177779 0.13387773 0.08902432 L’output prodotto con print(PCA) consiste nelle deviazioni standard delle componenti e nella matrice di rotazione (con i variable loadings) > summary(PCA) Importance of components: PC1 PC2 PC3 PC4 Standard deviation 1.5749 0.9949 0.59713 0.41645 Proportion of Variance 0.6201 0.2474 0.08914 0.04336 Cumulative Proportion 0.6201 0.8675 0.95664 1.00000 Il comando summary() in questo caso restituisce una serie di valori che consentono di valutare la rilevanza relativa di ciascuna componente, ovvero: la deviazione standard di ciascuna componente; la proporzione di varianza spiegata, e le proporzioni cumulate. Per scegliere di utilizzare solo alcune variabili e non altre: > prcomp(~Murder + Assault + Rape, data = USArrests, + scale = TRUE) Standard deviations: [1] 1.5357670 0.6767949 0.4282154 Rotation: PC1 PC2 PC3 Murder -0.5826006 0.5339532 -0.6127565 Assault -0.6079818 0.2140236 0.7645600 Rape -0.5393836 -0.8179779 -0.1999436 Output L’oggetto (output) PCA creato dall’analisi in componenti principali contiene i seguenti valori: sdev = deviazioni standard delle componenti principali rotation = la matrice di rotazione con i variable loadings (consente di interpretare i fattori, in base al peso che hanno le variabili nel definirli) x = le coordinate fattoriali dei casi (se retx=TRUE, come di default) center = il valore corrispondente all’attuale origine dell’asse, per ciascuna variabile (se center=TRUE, come di default) scale = come center, ma per la varianza di ciascuna variabile (se scale=TRUE) Ciascuno dei valori contenuti nell’output può infatti essere visualizzato chiamando, ad es., per ottenere le coordinate fattoriali: > PCA$x Alabama PC1 -0.97566045 http://www.agnesevardanega.eu/metref/ PC2 PC3 1.12200121 -0.43980366 PC4 0.154696581 Printed on 15/03/2017 20:06 15/03/2017 20:06 Alaska Arizona Arkansas .... 3/14 -1.93053788 1.06242692 -1.74544285 -0.73845954 0.13999894 1.10854226 L'analisi in componenti principali 2.01950027 -0.434175454 0.05423025 -0.826264240 0.11342217 -0.180973554 La matrice delle correlazioni fra i nuovi valori e i vecchi si ottiene con il comando cor() applicato alle due matrici. > cor.PCA=cor(USArrests, PCA$x) > cor.PCA PC1 PC2 PC3 PC4 Murder -0.8439764 0.4160354 -0.2037600 0.27037052 Assault -0.9184432 0.1870211 -0.1601192 -0.30959159 UrbanPop -0.4381168 -0.8683282 -0.2257242 0.05575330 Rape -0.8558394 -0.1664602 0.4883190 0.03707412 Grafici La funzione plot() restituisce un grafico come questo: > plot(PCA) mentre la funzione “screeplot()” rappresenta graficamente i fattori in questo modo: > screeplot(PCA,type=c("lines")) aiutandoci a stabilire in numero di componenti principali da tenere in considerazione per rappresentare il fenomeno. La funzione biplot() fornisce invece una rappresentazione sintetica dei casi sul piano fattoriale, utilizzando la matrice PCA$x, che può eventualmente essere esportata per includere le coordinate fattoriali come variabili nella matrice originaria: MetRef - http://www.agnesevardanega.eu/metref/ Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 > biplot(PCA) Script prcomp-ex.R plot(USArrests) PCA<-prcomp(USArrests, scale = TRUE) print(PCA) summary(PCA) plot(PCA) biplot(PCA) PCA$x cor.PCA=cor(USArrests, PCA$x) cor.PCA La funzione princomp e RCommander La funzione princomp, calcola l’ACP con la risoluzione matriciale, ovvero calcolando gli autovalori delle matrice delle correlazioni o delle covarianze (e non della matrice originaria). princomp(x, cor = FALSE, scores = TRUE, covmat = NULL, subset = rep(TRUE, nrow(as.matrix(x))), ...) Nella console di R > PCA1 <- princomp(USArrests, cor = TRUE) > print(PCA1) Call: princomp(x = USArrests, cor = TRUE) Standard deviations: Comp.1 Comp.2 Comp.3 Comp.4 1.5748783 0.9948694 0.5971291 0.4164494 http://www.agnesevardanega.eu/metref/ Printed on 15/03/2017 20:06 15/03/2017 20:06 4 5/14 variables and L'analisi in componenti principali 50 observations. L’output prodotto con print(PCA1) non contiene la matrice delle componenti (variable loadings), che può essere però chiamata con il comando: > loadings(PCA1) Loadings: Comp.1 Comp.2 Comp.3 Comp.4 Murder -0.536 0.418 -0.341 0.649 Assault -0.583 0.188 -0.268 -0.743 UrbanPop -0.278 -0.873 -0.378 0.134 Rape -0.543 -0.167 0.818 Comp.1 Comp.2 Comp.3 Comp.4 SS loadings 1.00 1.00 1.00 1.00 Proportion Var 0.25 0.25 0.25 0.25 Cumulative Var 0.25 0.50 0.75 1.00 oppure anche con > PCA1$loadings In questo caso, i pesi fattoriali (variable loadings) si riferiscono agli autovalori della matrice delle correlazioni. Il comando summary(): > summary(PCA1) Importance of components: Comp.1 Comp.2 Comp.3 Comp.4 Standard deviation 1.5748783 0.9948694 0.5971291 0.41644938 Proportion of Variance 0.6200604 0.2474413 0.0891408 0.04335752 Cumulative Proportion 0.6200604 0.8675017 0.9566425 1.00000000 Anche i comandi plot() screeplot() e biplot() restituiscono grafici corrispondenti. L’oggetto (output) PCA1 è però diverso, in quanto diverso è il metodo di calcolo delle componenti. Esso quindi contiene: sdev = deviazioni standard delle componenti principali loadings (anziché rotation) = la matrice con i variable loadings scores (anziché x) = le coordinate fattoriali dei casi (può essere omessa, con retx=FALSE) center = il valore corrispondente all’attuale origine dell’asse, per ciascuna variabile (la media) scale = il fattore di scala delle variabili Quindi, per ottenere le coordinate fattoriali, il comando sarà: > PCA1$scores Alabama Comp.1 -0.98556588 MetRef - http://www.agnesevardanega.eu/metref/ Comp.2 Comp.3 1.13339238 -0.44426879 Comp.4 0.156267145 Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 Alaska Arizona Arkansas .... -1.95013775 1.07321326 -1.76316354 -0.74595678 0.14142029 1.11979678 2.04000333 -0.438583440 0.05478082 -0.834652924 0.11457369 -0.182810896 Ed è con la matrice PCA1$scores che si potrà anche calcolare la matrice delle correlazioni variabili-componenti: > cor.PCA1=cor(USArrests, PCA1$scores) > cor.PCA1 Comp.1 Comp.2 Comp.3 Comp.4 Murder -0.8439764 0.4160354 -0.2037600 0.27037052 Assault -0.9184432 0.1870211 -0.1601192 -0.30959159 UrbanPop -0.4381168 -0.8683282 -0.2257242 0.05575330 Rape -0.8558394 -0.1664602 0.4883190 0.03707412 Infine, volendo ruotare gli autovalori [o alcuni di essi] con il metodo varimax o promax: > varimax(PCA1$loadings[,1:2]) oppure > promax(PCA1$loadings[,1:2]) restituisce direttamente i valori degli autovalori ruotati. Per scegliere di utilizzare alcune variabili e non altre: > princomp(~Murder + Assault + UrbanPop, data = USArrests, na.action = na.exclude, + cor = TRUE) Call: princomp(formula = ~Murder + Assault + UrbanPop, data = USArrests, na.action = na.exclude, cor = TRUE) Standard deviations: Comp.1 Comp.2 Comp.3 1.3656547 0.9795415 0.4189100 3 variables and 50 observations. Script princomp-ex.R PCA1<-princomp(USArrests, cor = TRUE) print(PCA1) http://www.agnesevardanega.eu/metref/ Printed on 15/03/2017 20:06 15/03/2017 20:06 7/14 L'analisi in componenti principali loadings(PCA1) summary(PCA1) PCA1$scores plot(PCA1) biplot(PCA1) PCA1$scores cor.PCA1=cor(USArrests, PCA1$scores) cor.PCA1 varimax(PCA1$loadings[,1:2]) promax(PCA1$loadings[,1:2]) In RCommander Utilizzando lo stesso esempio di prima, possiamo vedere come viene utilizzata in RCommander. Come prima cosa, carichiamo il dataset “USArrests” (Dati / Dati presenti nei pacchetti / Leggi i dati da un pacchetto caricato → scrivere il nome del dataset). Poi selezioniamo la funzione “Analisi delle componenti principali”, nel Menu “Statistiche / Analisi dimensionale”. Infine selezioniamo le opzioni dalla finestra di dialogo: Rcmdr> .PC <- princomp(~Assault+Murder+Rape+UrbanPop, cor=TRUE, data=USArrests) L’output automatico di RCommander è composto da: La matrice dei component loadings Rcmdr> Comp.1 unclass(loadings(.PC)) Comp.2 Comp.3 MetRef - http://www.agnesevardanega.eu/metref/ # component loadings Comp.4 Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 Assault Murder Rape UrbanPop -0.5831836 0.1879856 0.2681484 0.74340748 -0.5358995 0.4181809 0.3412327 -0.64922780 -0.5434321 -0.1673186 -0.8177779 -0.08902432 -0.2781909 -0.8728062 0.3780158 -0.13387773 La varianza delle componenti, ovvero la deviazione standard al quadrato (sd^2) Rcmdr> .PC$sd^2 # component variances Comp.1 Comp.2 Comp.3 Comp.4 2.4802416 0.9897652 0.3565632 0.1734301 La funzione summary(), che corrisponde a quella vista sopra Rcmdr> summary(.PC) # proportions of variance Importance of components: Comp.1 Comp.2 Comp.3 Comp.4 Standard deviation 1.5748783 0.9948694 0.5971291 0.41644938 Proportion of Variance 0.6200604 0.2474413 0.0891408 0.04335752 Cumulative Proportion 0.6200604 0.8675017 0.9566425 1.00000000 E infine, se lo si è selezionato, il grafico delle componenti Rcmdr> screeplot(.PC) Attenzione: RCommander elimina l’oggetto contenente gli output alla fine della procedura: Rcmdr> remove(.PC) La funzione PCA in FactoMineR L’analisi in componenti principali in FactoMineR adotta un approccio ancora diverso. Come in princomp, le componenti vengono estratte dalla matrice delle correlazioni; diversamente che negli altri casi, però, l’analisi delle variabili e dei casi, nonché l’interpretazione dei fattori, viene condotta in base all’associazione variabili-componenti o individui-componenti. In questo modo, è possibile rappresentare sui piani fattoriali le variabili eventualmente escluse dall’analisi (supplementari, o illustrative), anche categoriali, e non solo quantitative. Le misure di associazione e di qualità della rappresentazione utilizzate sono infatti — oltre alle correlazioni fra variabili attive e componenti — i coseni quadri e i valori test, che possono essere calcolati anche per http://www.agnesevardanega.eu/metref/ Printed on 15/03/2017 20:06 15/03/2017 20:06 9/14 L'analisi in componenti principali le modalità delle variabili categoriali. FactoMineR ha un plugin per RCommander, che fornisce una interfaccia a menu per l’esecuzione dei comandi. Lo script utilizzato in questo esempio è disponibile all’indirizzo http://factominer.free.fr/docs/code_pca.r In primo luogo, carichiamo la libreria necessaria, e il dataset di esempio: > library(FactoMineR) > data(decathlon) Eseguiamo poi il comando, indicando le variabili supplementari quantitative (quanti.sup) e quelle qualitative (quali.sup). Le altre variabili contenute nel dataset saranno automaticamente utilizzate come attive — ovvero per il calcolo delle componenti. Questo significa che il file deve contenere tutte e solo le variabili necessarie all’analisi. > res <- PCA(decathlon, quanti.sup = 11:12, quali.sup = 13) L’output produce anche il grafico dei casi che corrisponde al comamdo plot(res, choix=“ind”, axes=1:2) e quello delle variabili che corrisponde al comamdo plot(res, choix=“var”, axes=1:2) Possiamo omettere i grafici con l’opzione graph = FALSE. Gli oggetti contenuti in res sono: > res **Results for the Principal Component Analysis (PCA)** The analysis was performed on 41 individuals, described by 13 variables MetRef - http://www.agnesevardanega.eu/metref/ Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 *The results are available in the following objects: name 1 "$eig" 2 "$var" 3 "$var$coord" 4 "$var$cor" 5 "$var$cos2" 6 "$var$contrib" 7 "$ind" 8 "$ind$coord" 9 "$ind$cos2" 10 "$ind$contrib" 11 "$quanti.sup" variables" 12 "$quanti.sup$coord" 13 "$quanti.sup$cor" dimensions" 14 "$quali.sup" 15 "$quali.sup$coord" 16 "$quali.sup$v.test" 17 "$call" 18 "$call$centre" 19 "$call$ecart.type" 20 "$call$row.w" 21 "$call$col.w" description "eigenvalues" "results for the variables" "coord. for the variables" "correlations variables - dimensions" "cos2 for the variables" "contributions of the variables" "results for the individuals" "coord. for the individuals" "cos2 for the individuals" "contributions of the individuals" "results for the supplementary quantitative "coord. for the supplementary quantitative variables" "correlations suppl. quantitative variables "results for the supplementary categorical variables" "coord. for the supplementary categories" "v-test of the supplementary categories" "summary statistics" "mean of the variables" "standard error of the variables" "weights for the individuals" "weights for the variables" Anche in questo caso, possiamo utilizzare i singoli oggetti contenuti in res per approfondire l’analisi. Autovalori Autovalori e varianza spiegata (% e %cum): > res$eig eigenvalue percentage of variance comp 1 3.2719055 32.719055 comp 2 1.7371310 17.371310 comp 3 1.4049167 14.049167 comp 4 1.0568504 10.568504 comp 5 0.6847735 6.847735 comp 6 0.5992687 5.992687 comp 7 0.4512353 4.512353 comp 8 0.3968766 3.968766 comp 9 0.2148149 2.148149 comp 10 0.1822275 1.822275 cumulative percentage of variance comp 1 32.71906 comp 2 50.09037 http://www.agnesevardanega.eu/metref/ Printed on 15/03/2017 20:06 15/03/2017 20:06 comp comp comp comp comp comp comp comp 11/14 3 4 5 6 7 8 9 10 L'analisi in componenti principali 64.13953 74.70804 81.55577 87.54846 92.06081 96.02958 98.17773 100.00000 Grafico degli autovalori: > barplot(res$eig[, 1]) Variabili Medie e deviazioni standard (scarto tipo) delle variabili attive: > round(cbind(res$call$centre, res$call$ecart.type), + 2) [,1] [,2] 100m 11.00 0.26 Long.jump 7.26 0.31 Shot.put 14.48 0.81 High.jump 1.98 0.09 400m 49.62 1.14 110m.hurdle 14.61 0.47 Discus 44.33 3.34 Pole.vault 4.76 0.27 Javeline 58.32 4.77 1500m 279.02 11.53 (cbind serve ad unire i dataframe, round serve ad arrotondare i decimali) Coordinate fattoriali delle prime quattro componenti: > res$var$coord[, 1:4] Dim.1 Dim.2 Dim.3 Dim.4 100m -0.77471983 0.1871420 -0.18440714 -0.03781826 Long.jump 0.74189974 -0.3454213 0.18221105 0.10178564 Shot.put 0.62250255 0.5983033 -0.02337844 0.19059161 High.jump 0.57194530 0.3502936 -0.25951193 -0.13559420 400m -0.67960994 0.5694378 0.13146970 0.02930198 MetRef - http://www.agnesevardanega.eu/metref/ Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 110m.hurdle -0.74624532 0.2287933 -0.09263738 0.29083103 Discus 0.55246652 0.6063134 0.04295225 -0.25967143 Pole.vault 0.05034151 -0.1803569 0.69175665 0.55153397 Javeline 0.27711085 0.3169891 -0.38965541 0.71227728 1500m -0.05807706 0.4742238 0.78214280 -0.16108904 Correlazioni delle variabili con le prime quattro componenti: > res$var$cor[, 1:4] Dim.1 Dim.2 Dim.3 Dim.4 100m -0.77471983 0.1871420 -0.18440714 -0.03781826 Long.jump 0.74189974 -0.3454213 0.18221105 0.10178564 Shot.put 0.62250255 0.5983033 -0.02337844 0.19059161 High.jump 0.57194530 0.3502936 -0.25951193 -0.13559420 400m -0.67960994 0.5694378 0.13146970 0.02930198 110m.hurdle -0.74624532 0.2287933 -0.09263738 0.29083103 Discus 0.55246652 0.6063134 0.04295225 -0.25967143 Pole.vault 0.05034151 -0.1803569 0.69175665 0.55153397 Javeline 0.27711085 0.3169891 -0.38965541 0.71227728 1500m -0.05807706 0.4742238 0.78214280 -0.16108904 Casi Coordinate, contributi e coseni quadri: > round(cbind(res$ind$coord[, 1:4], res$ind$contrib[, + 1:4], res$ind$cos2[, 1:4]), 2) Dim.1 Dim.2 Dim.3 Dim.4 Dim.1 Dim.2 Dim.3 Dim.4 SEBRLE 0.79 0.77 0.83 1.17 0.47 0.84 1.19 3.18 CLAY 1.23 0.57 2.14 -0.35 1.14 0.46 7.96 0.29 KARPOV 1.36 0.48 1.96 -1.86 1.38 0.33 6.64 7.95 BERNARD -0.61 -0.87 0.89 2.22 0.28 1.07 1.37 11.38 YURKOV -0.59 2.13 -1.23 0.87 0.26 6.38 2.61 1.76 .... Dim.1 Dim.2 Dim.3 Dim.4 SEBRLE 0.11 0.11 0.12 0.25 CLAY 0.12 0.03 0.37 0.01 KARPOV 0.16 0.02 0.33 0.30 BERNARD 0.05 0.10 0.10 0.65 YURKOV 0.04 0.50 0.16 0.08 .... Caratterizzazione degli assi (prime 3 componenti): > dimdesc(res) $Dim.1 $Dim.1$quanti correlation http://www.agnesevardanega.eu/metref/ p.value Printed on 15/03/2017 20:06 15/03/2017 20:06 Points Long.jump Shot.put High.jump Discus Rank 400m 110m.hurdle 100m 13/14 0.9561543 0.7418997 0.6225026 0.5719453 0.5524665 -0.6705104 -0.6796099 -0.7462453 -0.7747198 $Dim.2 $Dim.2$quanti correlation Discus 0.6063134 Shot.put 0.5983033 400m 0.5694378 1500m 0.4742238 High.jump 0.3502936 Javeline 0.3169891 Long.jump -0.3454213 L'analisi in componenti principali 0.000000e+00 2.849886e-08 1.388321e-05 9.362285e-05 1.802220e-04 1.616348e-06 1.028175e-06 2.136962e-08 2.778467e-09 p.value 2.650745e-05 3.603567e-05 1.020941e-04 1.734405e-03 2.475025e-02 4.344974e-02 2.696969e-02 $Dim.3 $Dim.3$quanti correlation p.value 1500m 0.7821428 1.554450e-09 Pole.vault 0.6917567 5.480172e-07 Javeline -0.3896554 1.179331e-02 Infine, FactoMineR include una funzione che consente di esportare l’intero output in un file csv: > write.infile(res,file="my_FactoMineR_results.csv") Script FM-PCA-ex.R data(decathlon) res <- PCA(decathlon,quanti.sup=11:12,quali.sup=13) res res$eig barplot(res$eig[,1]) round(cbind(res$call$centre,res$call$ecart.type),2) res$var$coord[,1:4] res$var$cor[,1:4] round(cbind(res$ind$coord[,1:4],res$ind$contrib[,1:4],res$ind$cos2[,1:4 ]),2) dimdesc(res) MetRef - http://www.agnesevardanega.eu/metref/ Last update: r:analisi_multivariata:analisi_in_componenti_principali http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali 22/02/2013 07:47 write.infile(res,file="my_FactoMineR_results.csv") Analisi multivariata, Comandi From: http://www.agnesevardanega.eu/metref/ - MetRef Permanent link: http://www.agnesevardanega.eu/metref/r/analisi_multivariata/analisi_in_componenti_principali Last update: 22/02/2013 07:47 http://www.agnesevardanega.eu/metref/ Printed on 15/03/2017 20:06