Différence entre l'implémentation de régression de crête dans R et SAS


10

J'ai lu la description de la régression des crêtes dans Applied Linear Statistical Models , 5e Ed chapitre 11. La régression des crêtes est effectuée sur les données de graisse corporelle disponibles ici .

Le manuel correspond à la sortie dans SAS, où les coefficients transformés en arrière sont donnés dans le modèle ajusté comme:

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

Ceci est montré par SAS comme:

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

Mais R donne des coefficients très différents:

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 
> 

Quelqu'un peut-il m'aider à comprendre pourquoi?


J'ai utilisé le même ensemble de données et l'ai analysé dans SPSS. Les résultats sont similaires à SAS. Cependant, si nous pouvons standardiser les données comme dans le livre, la première valeur à c = 0 est similaire dans R et SPSS (exécutant une régression linéaire multiple). Cependant, les résultats sont assez différents lorsque nous allons plus loin comme indiqué ci-dessus. Moi aussi, je n'ai trouvé aucun indice de la différence entre les sorties pour les mêmes données.
asad

Réponses:


6

Bien que la régression de crête ressemble d'abord à un algorithme simple, le diable est dans les détails. Les variables apparemment originales sont mises à l'échelle et les paramètresλn'est pas le paramètre auquel on pourrait penser qu'il est donné la description d'origine. D'après ce que j'ai recueilli en lisant la référence donnée dans la page d'aide de R, lm.ridgeil n'y a pas une seule façon convenue de faire une régression de crête. Ainsi, la différence de résultats ne peut être expliquée que par différents algorithmes utilisés par R et SAS. J'espère que quelqu'un de plus compétent pourra donner une réponse plus détaillée.

Vous pouvez voir quel type d'algorithme est appliqué dans R en regardant la source de lm.ridge. Tapez simplement lm.ridgel'invite R.


J'ai trouvé ce lien utile pour déchiffrer comment lm.ridge calcule les coefficients: mail-archive.com/r-help@r-project.org/msg81115.html Mais toujours perplexe à quel point les résultats sont différents du texte que j'ai référencé et SAS , étant donné que chacun est censé revenir à l'échelle d'origine.
B_Miner

@ user2040, vérifiez que les mêmes données sont utilisées par SAS et R. Si ce sont les mêmes, alors la seule conclusion est que les algorithmes sont différents. Que dit la page d'aide de SAS?
mpiktas

@ user2040, j'ai répliqué la régression de la crête SAS sur R avec vos données. Nous savons donc avec certitude que les algorithmes sont différents.
mpiktas

1
Vous venez de me battre pour ça! :) Je regardais la page d'aide SAS à laquelle vous avez fait référence. J'ai comparé le RMSE (données dans l'échantillon uniquement, mais je n'ai pas encore validé avec un CV ou un bootstrap) et le résultat R était supérieur. être si différent par algorithme)? Je sais déjà que la théorie des modèles linéaires réguliers (IC, contrastes, etc.) est disponible pour la régression des crêtes (le bootstrapping se rapproche mais peut encore être trompeur en raison du biais).
B_Miner

0

L'utilisation de lm.ridge produit également un vecteur de mise à l'échelle (essayez head (modèle) pour voir toutes les sorties). Pour obtenir les valeurs prédites dans R que vous voyez dans SAS, prenez les coefficients et divisez-les par le vecteur scalaire.


2
Je n'obtiens pas ce résultat, pouvez-vous illustrer s'il vous plaît?
B_Miner
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.