Ich versuche herauszufinden, wie ich in Python einige Arbeiten reproduzieren kann, die ich in SAS ausgeführt habe. Mit diesem Datensatz , bei dem Multikollinearität ein Problem darstellt, möchte ich eine Hauptkomponentenanalyse in Python durchführen. Ich habe mir Scikit-Learn- und Statistikmodelle angesehen, bin mir aber nicht sicher, wie ich ihre Ausgabe in dieselbe Ergebnisstruktur wie SAS konvertieren soll. Zum einen scheint SAS bei Verwendung eine PCA für die Korrelationsmatrix durchzuführen PROC PRINCOMP
, aber die meisten (alle?) Python-Bibliotheken scheinen SVD zu verwenden.
Im Datensatz ist die erste Spalte die Antwortvariable und die nächsten 5 sind Vorhersagevariablen, die als pred1-pred5 bezeichnet werden.
In SAS lautet der allgemeine Workflow:
/* 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;
Ich weiß, dass der letzte Schritt nur funktioniert, weil ich nur PC1 und PC2 der Reihe nach auswähle.
In Python ist dies ungefähr so weit wie ich gekommen bin:
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)
Wie viel Varianz erklärt jeder PC?
print pca.explained_variance_ratio_
Out[190]:
array([ 9.99997603e-01, 2.01265023e-06, 2.70712663e-07,
1.11512302e-07, 2.40310191e-09])
Was ist das? Eigenvektoren?
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]])
Sind das die Eigenwerte?
print pca.explained_variance_
Out[180]:
array([ 8.07640319e+09, 1.62550137e+04, 2.18638986e+03,
9.00620474e+02, 1.94084664e+01])
Ich bin ein wenig ratlos, wie ich von den Python-Ergebnissen zur tatsächlichen Durchführung der Hauptkomponentenregression (in Python) komme. Füllen eine der Python-Bibliotheken die Lücken ähnlich wie bei SAS aus?
Irgendwelche Tipps sind willkommen. Ich bin ein wenig verwöhnt von der Verwendung von Labels in der SAS-Ausgabe und ich bin nicht sehr vertraut mit Pandas, Numpy, Scipy oder Scikit-Learn.
Bearbeiten:
Es sieht also so aus, als würde sklearn nicht direkt mit einem Pandas-Datenrahmen arbeiten. Nehmen wir an, ich konvertiere es in ein Numpy-Array:
npa = frame2.values
npa
Folgendes bekomme ich:
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]])
Wenn ich dann den copy
Parameter von sklearns PCA False,
so ändere, dass er direkt auf dem Array ausgeführt wird, wie im folgenden Kommentar angegeben.
pca = PCA(n_components=5,copy=False)
pca.fit(npa)
npa
Gemäß der Ausgabe sieht es so aus, als ob alle Werte in ersetzt wurden, npa
anstatt etwas an das Array anzuhängen. Was sind die Werte npa
jetzt? Die Hauptkomponentenwerte für das ursprüngliche Array?
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
, erhalte ich neue Werte. Sind das die Hauptkomponentenwerte?