Unterschied zwischen der Implementierung der Ridge-Regression in R und SAS

10

Ich habe die Beschreibung der Kammregression in Applied Linear Statistical Models , 5. Ausgabe, Kapitel 11, gelesen . Die Kammregression wird anhand der hier verfügbaren Körperfettdaten durchgeführt .

Das Lehrbuch entspricht der Ausgabe in SAS, wobei die rücktransformierten Koeffizienten im angepassten Modell wie folgt angegeben werden:

Y=7.3978+0.5553X1+0.3681X20.1917X3

Dies wird von SAS wie folgt angezeigt:

proc reg data = ch7tab1a outest = temp outstb noprint;
  model y = x1-x3 / ridge = 0.02;
run;
quit;
proc print data = temp;
  where _ridge_ = 0.02 and y = -1;
  var y intercept x1 x2 x3;
run;
Obs     Y    Intercept       X1         X2         X3

 2     -1     -7.40343    0.55535    0.36814    -0.19163
 3     -1      0.00000    0.54633    0.37740    -0.13687

Aber R gibt sehr unterschiedliche Koeffizienten:

data <- read.table("http://www.cst.cmich.edu/users/lee1c/spss/V16_materials/DataSets_v16/BodyFat-TxtFormat.txt", 
                   sep=" ", header=FALSE)
data <- data[,c(1,3,5,7)]
colnames(data)<-c("x1","x2","x3","y")
ridge<-lm.ridge(y ~ ., data, lambda=0.02)   
ridge$coef
coef(ridge)

>   ridge$coef
       x1        x2        x3 
10.126984 -4.682273 -3.527010 
>   coef(ridge)
                   x1         x2         x3 
42.2181995  2.0683914 -0.9177207 -0.9921824 
> 

Kann mir jemand helfen zu verstehen warum?

B_Miner
quelle
Ich habe denselben Datensatz verwendet und in SPSS analysiert. Die Ergebnisse ähneln denen von SAS. Wenn wir jedoch die Daten wie im Buch standardisieren können, ist der erste Wert bei c = 0 in R und SPSS (Ausführen einer multiplen linearen Regression) ähnlich. Die Ergebnisse sind jedoch sehr unterschiedlich, wenn wir uns wie oben angegeben weiterentwickeln. Auch ich fand keinen Hinweis auf den Unterschied zwischen den Ausgaben für dieselben Daten.
Asad

Antworten:

6

Obwohl die Gratregression zunächst wie ein einfacher Algorithmus aussieht, steckt der Teufel im Detail. Anscheinend sind Originalvariablen skaliert und Parameterλist nicht der Parameter, von dem Sie denken, dass er die ursprüngliche Beschreibung enthält. Nach dem, was ich beim Lesen der Referenz auf der R-Hilfeseite zusammengetragen habe, lm.ridgegibt es keinen vereinbarten Weg, eine Gratregression durchzuführen. Der Unterschied in den Ergebnissen kann daher nur durch unterschiedliche Algorithmen erklärt werden, die von R und SAS verwendet werden. Hoffentlich kann jemand, der besser informiert ist, eine detailliertere Antwort geben.

Sie können sehen, welche Art von Algorithmus in R angewendet wird, indem Sie sich die Quelle von ansehen lm.ridge. Geben Sie einfach lm.ridgedie Eingabeaufforderung R ein.

mpiktas
quelle
Ich fand diesen Link hilfreich, um zu entschlüsseln, wie lm.ridge die Koeffizienten berechnet: mail-archive.com/[email protected]/msg81115.html Aber immer noch verwirrt, wie unterschiedlich die Ergebnisse von dem Text sind, auf den ich verwiesen habe, und SAS , vorausgesetzt, jeder ist angeblich wieder im ursprünglichen Maßstab.
B_Miner
@ user2040, überprüfen Sie, ob SAS und R dieselben Daten verwenden. Wenn sie identisch sind, ist die einzige Schlussfolgerung, dass die Algorithmen unterschiedlich sind. Welche SAS-Hilfeseite sagt das aus?
mpiktas
@ user2040, ich habe die SAS-Ridge-Regression auf R mit Ihren Daten repliziert . Wir wissen also mit Sicherheit, dass die Algorithmen unterschiedlich sind.
mpiktas
1
Du hast mich nur geschlagen! :) Ich habe mir die SAS-Hilfeseite angesehen, auf die Sie verwiesen haben. Ich habe den RMSE verglichen (nur In-Sample-Daten, noch nicht mit einem CV oder Bootstrap validiert) und das R-Ergebnis war überlegen. Glauben Sie also, dass die Ridge-Regression am besten für die Vorhersage und nicht für die Interpretation der Koeffizienten geeignet ist (da die Ergebnisse dies können?) nach Algorithmus so unterschiedlich sein)? Ich weiß bereits, dass die reguläre lineare Modelltheorie (CIs, Kontraste usw.) auf eine Gratregression aus ist (Bootstrapping rückt näher, kann aber aufgrund von Verzerrungen immer noch irreführend sein).
B_Miner
0

Die Verwendung von lm.ridge erzeugt auch einen Skalierungsvektor (versuchen Sie head (Modell), um die gesamte Ausgabe zu sehen). Um die vorhergesagten Werte in R zu erhalten, die Sie in SAS sehen, nehmen Sie die Koeffizienten und dividieren Sie sie durch den Skalarvektor.

Thomas
quelle
2
Ich verstehe dieses Ergebnis nicht, können Sie es bitte veranschaulichen?
B_Miner