Regressione con componenti principali (PCR) Strumenti quantitativi
by user
Comments
Transcript
Regressione con componenti principali (PCR) Strumenti quantitativi
5/12/2015 Regressione con componenti principali (PCR) Regressione con componenti principali (PCR) Strumenti quantitativi per la gestione Emanuele Taufer Dati Hitters Eliminare le righe con dati mancanti PCR Variabili nell’oggetto creato da pcr() Coefficienti delle variabili nella PCR Pesi dei primi due fattori Punteggi fattoriali CP1 e CP2 Plot dei punteggi fattoriali Summary Individuare il numero di componenti da usare PCR con 6 CP Previsione Individuare solo alcuni sottoinsiemi delle previsioni Plot previstoosservato Regressione con PLS Individuare il numero di PLS da usare Variabili nell’oggetto creato da plsr() Riferimenti bibliografici Dati Hitters Un data frame con 322 osservazioni su giocatori della major league di baseball con 20 variabili Obbiettivo: per il campionato di baseball USA, prevedere il salario per un giocatore nel 1987 sulla base delle statistiche per giocatore nella stagione precedente 1. AtBat: Number of times at bat in 1986 2. Hits: Number of hits in 1986 3. HmRun: Number of home runs in 1986 4. Runs: Number of runs in 1986 5. RBI: Number of runs batted in 1986 6. Walks: Number of walks in 1986 7. Years: Number of years in the major leagues 8. CAtBat: Number of times at bat during his career 9. CHits: Number of hits during his career 10. CHmRun: Number of home runs during his career 11. CRuns: Number of runs during his career 12. CRBI: Number of runs batted in during his career 13. CWalks: Number of walks during his career file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 1/13 5/12/2015 Regressione con componenti principali (PCR) 14. League: A factor with levels A and N indicating player’s league at the end of 1986 15. Division: A factor with levels E and W indicating player’s division at the end of 1986 16. PutOuts: Number of put outs in 1986 17. Assists: Number of assists in 1986 18. Errors: Number of errors in 1986 19. Salary: 1987 annual salary on opening day in thousands of dollars 20. NewLeague: A factor with levels A and N indicating player’s league at the beginning of 1987 library(ISLR) data(Hitters) head(Hitters) AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits ‐Andy Allanson 293 66 1 30 29 14 1 293 66 ‐Alan Ashby 315 81 7 24 38 39 14 3449 835 ‐Alvin Davis 479 130 18 66 72 76 3 1624 457 ‐Andre Dawson 496 141 20 65 78 37 11 5628 1575 ‐Andres Galarraga 321 87 10 39 42 30 2 396 101 ‐Alfredo Griffin 594 169 4 74 51 35 11 4408 1133 CHmRun CRuns CRBI CWalks League Division PutOuts Assists ‐Andy Allanson 1 30 29 14 A E 446 33 ‐Alan Ashby 69 321 414 375 N W 632 43 ‐Alvin Davis 63 224 266 263 A W 880 82 ‐Andre Dawson 225 828 838 354 N E 200 11 ‐Andres Galarraga 12 48 46 33 N E 805 40 ‐Alfredo Griffin 19 501 336 194 A W 282 421 Errors Salary NewLeague ‐Andy Allanson 20 NA A ‐Alan Ashby 10 475.0 N ‐Alvin Davis 14 480.0 A ‐Andre Dawson 3 500.0 N ‐Andres Galarraga 4 91.5 N ‐Alfredo Griffin 25 750.0 A Eliminare le righe con dati mancanti missing<‐is.na(Hitters) apply(missing, 2, sum) AtBat Hits HmRun Runs RBI Walks Years 0 0 0 0 0 0 0 CAtBat CHits CHmRun CRuns CRBI CWalks League 0 0 0 0 0 0 0 Division PutOuts Assists Errors Salary NewLeague 0 0 0 0 59 0 Hitters<‐Hitters[complete.cases(Hitters),] ## elimino le righe con "NA" head(Hitters) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 2/13 5/12/2015 Regressione con componenti principali (PCR) AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits ‐Alan Ashby 315 81 7 24 38 39 14 3449 835 ‐Alvin Davis 479 130 18 66 72 76 3 1624 457 ‐Andre Dawson 496 141 20 65 78 37 11 5628 1575 ‐Andres Galarraga 321 87 10 39 42 30 2 396 101 ‐Alfredo Griffin 594 169 4 74 51 35 11 4408 1133 ‐Al Newman 185 37 1 23 8 21 2 214 42 CHmRun CRuns CRBI CWalks League Division PutOuts Assists ‐Alan Ashby 69 321 414 375 N W 632 43 ‐Alvin Davis 63 224 266 263 A W 880 82 ‐Andre Dawson 225 828 838 354 N E 200 11 ‐Andres Galarraga 12 48 46 33 N E 805 40 ‐Alfredo Griffin 19 501 336 194 A W 282 421 ‐Al Newman 1 30 9 24 N E 76 127 Errors Salary NewLeague ‐Alan Ashby 10 475.0 N ‐Alvin Davis 14 480.0 A ‐Andre Dawson 3 500.0 N ‐Andres Galarraga 4 91.5 N ‐Alfredo Griffin 25 750.0 A ‐Al Newman 7 70.0 A dim(Hitters) [1] 263 20 PCR La regressione con le CP può esser fatta utilizzando la funzione pcr() della libreria pls library(pls) set.seed(2) pcr.fit=pcr(Salary~., data=Hitters, scale=TRUE, validation ="CV") La sintassi di pcr() è simile a quella di lm() L’opzione scale=TRUE standardizza i predittori prima di calcolare le CP L’opzione validation=CV produce una crossvalidazione 10fold sui risultati per determinare il numero ottimale di CP da usare Variabili nell’oggetto creato da pcr() names(pcr.fit) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 3/13 5/12/2015 Regressione con componenti principali (PCR) [1] "coefficients" "scores" "loadings" "Yloadings" [5] "projection" "Xmeans" "Ymeans" "fitted.values" [9] "residuals" "Xvar" "Xtotvar" "fit.time" [13] "ncomp" "method" "scale" "validation" [17] "call" "terms" "model" Coefficienti delle variabili nella PCR coeff<‐as.data.frame(pcr.fit$coefficients) coeff[,1:2] Salary.1 comps Salary.2 comps AtBat 21.13207878 29.438966 Hits 20.87321071 29.039128 HmRun 21.77988064 26.912608 Runs 21.13705999 29.312723 RBI 25.06279956 31.870731 Walks 22.26529508 27.235049 Years 30.11445915 24.434849 CAtBat 35.21789413 31.042550 CHits 35.24760132 31.288812 CHmRun 33.99408860 31.260422 CRuns 36.04328244 32.314419 CRBI 36.27081015 32.632509 CWalks 33.76212997 29.599532 LeagueN ‐5.80503669 ‐7.865898 DivisionW ‐2.74157997 ‐3.535498 PutOuts 8.28029613 11.651168 Assists ‐0.08969488 3.560723 Errors ‐0.83758395 3.507803 NewLeagueN ‐4.46643991 ‐6.145712 Pesi dei primi due fattori pcr.fit$loadings[,1:2] file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 4/13 5/12/2015 Regressione con componenti principali (PCR) Comp 1 Comp 2 AtBat 0.1982903511 0.38378403 Hits 0.1958612933 0.37727112 HmRun 0.2043689229 0.23713561 Runs 0.1983370917 0.37772134 RBI 0.2351738026 0.31453120 Walks 0.2089237517 0.22960610 Years 0.2825754503 ‐0.26240195 CAtBat 0.3304629263 ‐0.19290382 CHits 0.3307416802 ‐0.18289883 CHmRun 0.3189794925 ‐0.12629732 CRuns 0.3382078595 ‐0.17227611 CRBI 0.3403428387 ‐0.16809208 CWalks 0.3168029362 ‐0.19231496 LeagueN ‐0.0544708722 ‐0.09521324 DivisionW ‐0.0257252900 ‐0.03667957 PutOuts 0.0776971752 0.15573663 Assists ‐0.0008416413 0.16865189 Errors ‐0.0078593695 0.20075992 NewLeagueN ‐0.0419103083 ‐0.07758356 Punteggi fattoriali CP1 e CP2 pcr.fit$scores[1:20,1:2] Comp 1 Comp 2 ‐Alan Ashby ‐0.009630358 ‐1.8669625 ‐Alvin Davis 0.410650757 2.4247988 ‐Andre Dawson 3.460224766 ‐0.8243753 ‐Andres Galarraga ‐2.553449083 0.2305443 ‐Alfredo Griffin 1.025746581 1.5705427 ‐Al Newman ‐3.973081710 ‐1.5044104 ‐Argenis Salazar ‐3.445150319 ‐0.5988471 ‐Andres Thomas ‐3.425848614 ‐0.1133262 ‐Andre Thornton 3.892286472 ‐1.9441629 ‐Alan Trammell 3.168770232 2.3878127 ‐Alex Trevino ‐2.163480993 ‐1.8609377 ‐Andy VanSlyke ‐0.931437541 0.4346793 ‐Alan Wiggins ‐2.270994270 ‐1.6636201 ‐Bill Almon ‐1.044258482 ‐2.6796008 ‐Buddy Bell 5.645236211 ‐0.4013665 ‐Buddy Biancalana ‐3.570381157 ‐1.2205422 ‐Bruce Bochy ‐3.257195508 ‐2.4740747 ‐Barry Bonds ‐1.747681059 1.3206506 ‐Bobby Bonilla ‐2.148683034 0.9145803 ‐Bob Brenly 0.084118835 0.9017370 Plot dei punteggi fattoriali Plotta solo alcuni dati, es. righe a:b file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 5/13 5/12/2015 Regressione con componenti principali (PCR) a<‐10 b<‐30 plot(pcr.fit$scores[a:b,1],pcr.fit$scores[a:b,2], xlab="Prima CP",ylab="Seconda CP") text(pcr.fit$scores[a:b,1],pcr.fit$scores[a:b,2], row.names(Hitters[a:b,]), pos=4, ce x=1) Summary summary(pcr.fit) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 6/13 5/12/2015 Regressione con componenti principali (PCR) Data: X dimension: 263 19 Y dimension: 263 1 Fit method: svdpc Number of components considered: 19 VALIDATION: RMSEP Cross‐validated using 10 random segments. (Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps CV 452 348.9 352.2 353.5 352.8 350.1 349.1 adjCV 452 348.7 351.8 352.9 352.1 349.3 348.0 7 comps 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps CV 349.6 350.9 352.9 353.8 355.0 356.2 363.5 adjCV 348.5 349.8 351.6 352.3 353.4 354.5 361.6 14 comps 15 comps 16 comps 17 comps 18 comps 19 comps CV 355.2 357.4 347.6 350.1 349.2 352.6 adjCV 352.8 355.2 345.5 347.6 346.7 349.8 TRAINING: % variance explained 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps 7 comps X 38.31 60.16 70.84 79.03 84.29 88.63 92.26 Salary 40.63 41.58 42.17 43.22 44.90 46.48 46.69 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps 14 comps X 94.96 96.28 97.26 97.98 98.65 99.15 99.47 Salary 46.75 46.86 47.76 47.82 47.85 48.10 50.40 15 comps 16 comps 17 comps 18 comps 19 comps X 99.75 99.89 99.97 99.99 100.00 Salary 50.55 53.01 53.85 54.61 54.61 I risultati della crossvalidazione sono espressi come la radice dello MSE (RMSEP). Ci sono due stime crossvalidazione: cV è la stima ordinaria della crossvalidazione adjCV è una stima “corretta” per ridurre il bias nella stima di CV Individuare il numero di componenti da usare validationplot(pcr.fit, val.type="MSEP") file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 7/13 5/12/2015 Regressione con componenti principali (PCR) PCR con 6 CP pcr.fit=pcr(Salary~., data=Hitters, scale=TRUE, ncomp=6) summary(pcr.fit) Data: X dimension: 263 19 Y dimension: 263 1 Fit method: svdpc Number of components considered: 6 TRAINING: % variance explained 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps X 38.31 60.16 70.84 79.03 84.29 88.63 Salary 40.63 41.58 42.17 43.22 44.90 46.48 Previsione Se si preferisce, è possibile usare la funzione predict() per ottenere le previsoni del modello file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 8/13 5/12/2015 Regressione con componenti principali (PCR) pcr.pred<‐predict(pcr.fit) pcr.pred<‐as.data.frame(pcr.pred) # è preferibile costruire un data.frame con le previs ioni pcr.pred<‐cbind(Hitters$Salary,pcr.pred) head(pcr.pred) Hitters$Salary Salary.1 comps Salary.2 comps ‐Alan Ashby 475.0 534.8996 494.48973 ‐Alvin Davis 480.0 579.6895 632.17353 ‐Andre Dawson 500.0 904.6869 886.84350 ‐Andres Galarraga 91.5 263.8013 268.79132 ‐Alfredo Griffin 750.0 645.2411 679.23504 ‐Al Newman 70.0 112.5090 79.94653 Salary.3 comps Salary.4 comps Salary.5 comps ‐Alan Ashby 525.22549 559.82506 495.0068 ‐Alvin Davis 610.08536 619.85749 547.8896 ‐Andre Dawson 900.33822 960.13423 1010.2236 ‐Andres Galarraga 281.41564 361.90615 409.8232 ‐Alfredo Griffin 711.57997 582.35125 524.9053 ‐Al Newman 76.16928 62.49043 133.1325 Salary.6 comps ‐Alan Ashby 570.3991 ‐Alvin Davis 661.5167 ‐Andre Dawson 946.2311 ‐Andres Galarraga 502.6162 ‐Alfredo Griffin 556.8592 ‐Al Newman 135.2173 Individuare solo alcuni sottoinsiemi delle previsioni pcr.pred[50:70, c(1,7)] file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 9/13 5/12/2015 Regressione con componenti principali (PCR) Hitters$Salary Salary.6 comps ‐Don Baylor 950.000 1180.36204 ‐Daryl Boston 75.000 60.10307 ‐Darnell Coles 105.000 493.75614 ‐Dave Concepcion 320.000 725.20944 ‐Doug DeCinces 850.000 807.75624 ‐Darrell Evans 535.000 1491.23121 ‐Dwight Evans 933.333 1253.97927 ‐Damaso Garcia 850.000 551.44525 ‐Dan Gladden 210.000 268.40416 ‐Dave Henderson 325.000 375.30528 ‐Donnie Hill 275.000 144.75481 ‐Davey Lopes 450.000 818.32602 ‐Don Mattingly 1975.000 1156.96201 ‐Dale Murphy 1900.000 1001.01781 ‐Dwayne Murphy 600.000 565.71861 ‐Dave Parker 1041.667 1104.19587 ‐Dan Pasqua 110.000 329.77139 ‐Darrell Porter 260.000 559.96402 ‐Dick Schofield 475.000 350.17570 ‐Don Slaught 431.500 307.92495 ‐Darryl Strawberry 1220.000 743.02402 Plot previstoosservato plot(Hitters$Salary,pcr.pred[,7],main="PCR con 6 componenti",xlab="Osservato",ylab="Pre visto",col="red") file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 10/13 5/12/2015 Regressione con componenti principali (PCR) Regressione con PLS La regressione con i PLS può esser fatta utilizzando la funzione plsr() della libreria pls set.seed(1) pls.fit=pcr(Salary~., data=Hitters, scale=TRUE, validation ="CV") summary(pls.fit) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 11/13 5/12/2015 Regressione con componenti principali (PCR) Data: X dimension: 263 19 Y dimension: 263 1 Fit method: svdpc Number of components considered: 19 VALIDATION: RMSEP Cross‐validated using 10 random segments. (Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps CV 452 352.4 349.7 349.2 346.6 341.6 341.0 adjCV 452 352.0 349.4 348.9 346.3 341.3 340.4 7 comps 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps CV 342.0 342.6 343.4 345.1 345.7 348.9 348.6 adjCV 341.3 341.8 342.6 344.0 344.6 347.7 347.3 14 comps 15 comps 16 comps 17 comps 18 comps 19 comps CV 343.0 345.4 336.6 338.5 334.8 337.6 adjCV 341.5 343.9 335.1 336.8 333.1 335.7 TRAINING: % variance explained 1 comps 2 comps 3 comps 4 comps 5 comps 6 comps 7 comps X 38.31 60.16 70.84 79.03 84.29 88.63 92.26 Salary 40.63 41.58 42.17 43.22 44.90 46.48 46.69 8 comps 9 comps 10 comps 11 comps 12 comps 13 comps 14 comps X 94.96 96.28 97.26 97.98 98.65 99.15 99.47 Salary 46.75 46.86 47.76 47.82 47.85 48.10 50.40 15 comps 16 comps 17 comps 18 comps 19 comps X 99.75 99.89 99.97 99.99 100.00 Salary 50.55 53.01 53.85 54.61 54.61 La sintassi di plsr() è simile a quella di lm() L’opzione scale=TRUE standardizza i predittori prima di calcolare i PLS L’opzione validation=CV produce una crossvalidazione 10fold sui risultati per determinare il numero ottimale di PLS da usare Individuare il numero di PLS da usare validationplot(pls.fit, val.type="MSEP") file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 12/13 5/12/2015 Regressione con componenti principali (PCR) Variabili nell’oggetto creato da plsr() names(pls.fit) [1] "coefficients" "scores" "loadings" "Yloadings" [5] "projection" "Xmeans" "Ymeans" "fitted.values" [9] "residuals" "Xvar" "Xtotvar" "fit.time" [13] "ncomp" "method" "scale" "validation" [17] "call" "terms" "model" Riferimenti bibliografici An Introduction to Statistical Learning, with applications in R. (Springer, 2013) file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 13/13