5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 1/13
Regressione con componenti principali(PCR)Strumenti quantitativi per la gestioneEmanuele Taufer
Dati Hitters
Eliminare le righe con dati mancantiPCRVariabili nell’oggetto creato da pcr()Coefficienti delle variabili nella PCRPesi dei primi due fattoriPunteggi fattoriali CP1 e CP2Plot dei punteggi fattorialiSummaryIndividuare il numero di componenti da usarePCR con 6 CPPrevisioneIndividuare solo alcuni sottoinsiemi delle previsioniPlot previstoosservatoRegressione con PLSIndividuare il numero di PLS da usareVariabili nell’oggetto creato da plsr()Riferimenti bibliografici
Dati HittersUn 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 sullabase delle statistiche per giocatore nella stagione precedente
1. AtBat: Number of times at bat in 19862. Hits: Number of hits in 19863. HmRun: Number of home runs in 19864. Runs: Number of runs in 19865. RBI: Number of runs batted in 19866. Walks: Number of walks in 19867. Years: Number of years in the major leagues8. CAtBat: Number of times at bat during his career9. CHits: Number of hits during his career10. CHmRun: Number of home runs during his career11. CRuns: Number of runs during his career12. CRBI: Number of runs batted in during his career13. CWalks: Number of walks during his career
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 2/13
14. League: A factor with levels A and N indicating player’s league at the end of 198615. Division: A factor with levels E and W indicating player’s division at the end of 198616. PutOuts: Number of put outs in 198617. Assists: Number of assists in 198618. Errors: Number of errors in 198619. Salary: 1987 annual salary on opening day in thousands of dollars20. 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 mancantimissing<‐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)
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 3/13
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
PCRLa 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 ilnumero ottimale di CP da usare
Variabili nell’oggetto creato da pcr()names(pcr.fit)
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 4/13
[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 PCRcoeff<‐as.data.frame(pcr.fit$coefficients)coeff[,1:2]
Salary.1 comps Salary.2 compsAtBat 21.13207878 29.438966Hits 20.87321071 29.039128HmRun 21.77988064 26.912608Runs 21.13705999 29.312723RBI 25.06279956 31.870731Walks 22.26529508 27.235049Years 30.11445915 24.434849CAtBat 35.21789413 31.042550CHits 35.24760132 31.288812CHmRun 33.99408860 31.260422CRuns 36.04328244 32.314419CRBI 36.27081015 32.632509CWalks 33.76212997 29.599532LeagueN ‐5.80503669 ‐7.865898DivisionW ‐2.74157997 ‐3.535498PutOuts 8.28029613 11.651168Assists ‐0.08969488 3.560723Errors ‐0.83758395 3.507803NewLeagueN ‐4.46643991 ‐6.145712
Pesi dei primi due fattoripcr.fit$loadings[,1:2]
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 5/13
Comp 1 Comp 2AtBat 0.1982903511 0.38378403Hits 0.1958612933 0.37727112HmRun 0.2043689229 0.23713561Runs 0.1983370917 0.37772134RBI 0.2351738026 0.31453120Walks 0.2089237517 0.22960610Years 0.2825754503 ‐0.26240195CAtBat 0.3304629263 ‐0.19290382CHits 0.3307416802 ‐0.18289883CHmRun 0.3189794925 ‐0.12629732CRuns 0.3382078595 ‐0.17227611CRBI 0.3403428387 ‐0.16809208CWalks 0.3168029362 ‐0.19231496LeagueN ‐0.0544708722 ‐0.09521324DivisionW ‐0.0257252900 ‐0.03667957PutOuts 0.0776971752 0.15573663Assists ‐0.0008416413 0.16865189Errors ‐0.0078593695 0.20075992NewLeagueN ‐0.0419103083 ‐0.07758356
Punteggi fattoriali CP1 e CP2pcr.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 fattorialiPlotta solo alcuni dati, es. righe a:b
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 6/13
a<‐10b<‐30plot(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, cex=1)
Summarysummary(pcr.fit)
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 7/13
Data: X dimension: 263 19 Y dimension: 263 1Fit method: svdpcNumber of components considered: 19
VALIDATION: RMSEPCross‐validated using 10 random segments. (Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps 6 compsCV 452 348.9 352.2 353.5 352.8 350.1 349.1adjCV 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 compsCV 349.6 350.9 352.9 353.8 355.0 356.2 363.5adjCV 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 compsCV 355.2 357.4 347.6 350.1 349.2 352.6adjCV 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 compsX 38.31 60.16 70.84 79.03 84.29 88.63 92.26Salary 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 compsX 94.96 96.28 97.26 97.98 98.65 99.15 99.47Salary 46.75 46.86 47.76 47.82 47.85 48.10 50.40 15 comps 16 comps 17 comps 18 comps 19 compsX 99.75 99.89 99.97 99.99 100.00Salary 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 crossvalidazioneadjCV è una stima “corretta” per ridurre il bias nella stima di CV
Individuare il numero di componenti da usarevalidationplot(pcr.fit, val.type="MSEP")
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 8/13
PCR con 6 CPpcr.fit=pcr(Salary~., data=Hitters, scale=TRUE, ncomp=6)summary(pcr.fit)
Data: X dimension: 263 19 Y dimension: 263 1Fit method: svdpcNumber of components considered: 6TRAINING: % variance explained 1 comps 2 comps 3 comps 4 comps 5 comps 6 compsX 38.31 60.16 70.84 79.03 84.29 88.63Salary 40.63 41.58 42.17 43.22 44.90 46.48
PrevisioneSe si preferisce, è possibile usare la funzione predict() per ottenere le previsoni del modello
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 9/13
pcr.pred<‐predict(pcr.fit)pcr.pred<‐as.data.frame(pcr.pred) # è preferibile costruire un data.frame con le previsionipcr.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 delleprevisionipcr.pred[50:70, c(1,7)]
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 10/13
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 previstoosservatoplot(Hitters$Salary,pcr.pred[,7],main="PCR con 6 componenti",xlab="Osservato",ylab="Previsto",col="red")
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 11/13
Regressione con PLSLa 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)
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 12/13
Data: X dimension: 263 19 Y dimension: 263 1Fit method: svdpcNumber of components considered: 19
VALIDATION: RMSEPCross‐validated using 10 random segments. (Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps 6 compsCV 452 352.4 349.7 349.2 346.6 341.6 341.0adjCV 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 compsCV 342.0 342.6 343.4 345.1 345.7 348.9 348.6adjCV 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 compsCV 343.0 345.4 336.6 338.5 334.8 337.6adjCV 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 compsX 38.31 60.16 70.84 79.03 84.29 88.63 92.26Salary 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 compsX 94.96 96.28 97.26 97.98 98.65 99.15 99.47Salary 46.75 46.86 47.76 47.82 47.85 48.10 50.40 15 comps 16 comps 17 comps 18 comps 19 compsX 99.75 99.89 99.97 99.99 100.00Salary 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 ilnumero ottimale di PLS da usare
Individuare il numero di PLS da usarevalidationplot(pls.fit, val.type="MSEP")
5/12/2015 Regressione con componenti principali (PCR)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L6__PCR.html 13/13
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 bibliograficiAn Introduction to Statistical Learning, with applications in R. (Springer, 2013)