Sto cercando di capire come riprodurre in Python alcuni lavori che ho svolto in SAS. Utilizzando questo set di dati , in cui la multicollinearità è un problema, vorrei eseguire l'analisi dei componenti principali in Python. Ho esaminato scikit-learn e statsmodels, ma non sono sicuro di come ottenere il loro output e convertirlo nella stessa struttura di risultati di SAS. Per prima cosa, SAS sembra eseguire PCA sulla matrice di correlazione quando si utilizza PROC PRINCOMP
, ma la maggior parte (tutte?) Delle librerie Python sembrano utilizzare SVD.
Nel set di dati , la prima colonna è la variabile di risposta e le successive 5 sono variabili predittive, denominate pred1-pred5.
In SAS, il flusso di lavoro generale è:
/* Get the PCs */
proc princomp data=indata out=pcdata;
var pred1 pred2 pred3 pred4 pred5;
run;
/* Standardize the response variable */
proc standard data=pcdata mean=0 std=1 out=pcdata2;
var response;
run;
/* Compare some models */
proc reg data=pcdata2;
Reg: model response = pred1 pred2 pred3 pred4 pred5 / vif;
PCa: model response = prin1-prin5 / vif;
PCfinal: model response = prin1 prin2 / vif;
run;
quit;
/* Use Proc PLS to to PCR Replacement - dropping pred5 */
/* This gets me my parameter estimates for the original data */
proc pls data=indata method=pcr nfac=2;
model response = pred1 pred2 pred3 pred4 / solution;
run;
quit;
So che l'ultimo passaggio funziona solo perché sto solo scegliendo PC1 e PC2, in ordine.
Quindi, in Python, questo è tutto per quanto ho ottenuto:
import pandas as pd
import numpy as np
from sklearn.decomposition.pca import PCA
source = pd.read_csv('C:/sourcedata.csv')
# Create a pandas DataFrame object
frame = pd.DataFrame(source)
# Make sure we are working with the proper data -- drop the response variable
cols = [col for col in frame.columns if col not in ['response']]
frame2 = frame[cols]
pca = PCA(n_components=5)
pca.fit(frame2)
La quantità di varianza che ogni PC spiega?
print pca.explained_variance_ratio_
Out[190]:
array([ 9.99997603e-01, 2.01265023e-06, 2.70712663e-07,
1.11512302e-07, 2.40310191e-09])
Cosa sono questi? Autovettori?
print pca.components_
Out[179]:
array([[ -4.32840645e-04, -7.18123771e-04, -9.99989955e-01,
-4.40303223e-03, -2.46115129e-05],
[ 1.00991662e-01, 8.75383248e-02, -4.46418880e-03,
9.89353169e-01, 5.74291257e-02],
[ -1.04223303e-02, 9.96159390e-01, -3.28435046e-04,
-8.68305757e-02, -4.26467920e-03],
[ -7.04377522e-03, 7.60168675e-04, -2.30933755e-04,
5.85966587e-02, -9.98256573e-01],
[ -9.94807648e-01, -1.55477793e-03, -1.30274879e-05,
1.00934650e-01, 1.29430210e-02]])
Sono questi gli autovalori?
print pca.explained_variance_
Out[180]:
array([ 8.07640319e+09, 1.62550137e+04, 2.18638986e+03,
9.00620474e+02, 1.94084664e+01])
Sono un po 'a corto di come ottenere dai risultati di Python per eseguire effettivamente la regressione dei componenti principali (in Python). Una delle librerie di Python riempie gli spazi vuoti in modo simile a SAS?
Eventuali suggerimenti sono apprezzati. Sono un po 'viziato dall'uso delle etichette nell'output SAS e non ho molta familiarità con i panda, intorpidito, scipy o scikit-learn.
Modificare:
Quindi, sembra che sklearn non operi direttamente su un frame di dati Panda. Diciamo che lo converto in un array intorpidito:
npa = frame2.values
npa
Ecco cosa ottengo:
Out[52]:
array([[ 8.45300000e+01, 4.20730000e+02, 1.99443000e+05,
7.94000000e+02, 1.21100000e+02],
[ 2.12500000e+01, 2.73810000e+02, 4.31180000e+04,
1.69000000e+02, 6.28500000e+01],
[ 3.38200000e+01, 3.73870000e+02, 7.07290000e+04,
2.79000000e+02, 3.53600000e+01],
...,
[ 4.71400000e+01, 3.55890000e+02, 1.02597000e+05,
4.07000000e+02, 3.25200000e+01],
[ 1.40100000e+01, 3.04970000e+02, 2.56270000e+04,
9.90000000e+01, 7.32200000e+01],
[ 3.85300000e+01, 3.73230000e+02, 8.02200000e+04,
3.17000000e+02, 4.32300000e+01]])
Se poi modifico il copy
parametro del PCA di sklearn in modo False,
che funzioni direttamente sull'array, secondo il commento qui sotto.
pca = PCA(n_components=5,copy=False)
pca.fit(npa)
npa
Per l'output, sembra che abbia sostituito tutti i valori npa
invece di aggiungere qualcosa all'array. Quali sono i valori npa
adesso? I punteggi dei componenti principali per l'array originale?
Out[64]:
array([[ 3.91846649e+01, 5.32456568e+01, 1.03614689e+05,
4.06726542e+02, 6.59830027e+01],
[ -2.40953351e+01, -9.36743432e+01, -5.27103110e+04,
-2.18273458e+02, 7.73300268e+00],
[ -1.15253351e+01, 6.38565684e+00, -2.50993110e+04,
-1.08273458e+02, -1.97569973e+01],
...,
[ 1.79466488e+00, -1.15943432e+01, 6.76868901e+03,
1.97265416e+01, -2.25969973e+01],
[ -3.13353351e+01, -6.25143432e+01, -7.02013110e+04,
-2.88273458e+02, 1.81030027e+01],
[ -6.81533512e+00, 5.74565684e+00, -1.56083110e+04,
-7.02734584e+01, -1.18869973e+01]])
copy=False
, ottengo nuovi valori. Quelli sono i punteggi dei componenti principali?