R和SAS中岭回归实现的区别

机器算法验证 r sas 岭回归
2022-03-09 21:32:05

我一直在阅读《应用线性统计模型》第 5 版第 11 章中对脊回归的描述。脊回归是在此处可用的体脂数据上完成的

教科书匹配 SAS 中的输出,其中反变换系数在拟合模型中给出为:

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

这从 SAS 显示为:

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

但是 R 给出了非常不同的系数:

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 
> 

谁能帮我理解为什么?

2个回答

虽然岭回归起初看起来像简单的算法,但魔鬼在细节中。显然原始变量被缩放,并且参数λ不是您认为给出原始描述的参数。从我收集的阅读R 帮助页面中给出的参考资料lm.ridge来看,没有一种公认的方法来进行岭回归。所以结果的差异只能用 R 和 SAS 使用的不同算法来解释。希望有知识的人能给出更详细的解答。

你可以通过查看源代码来了解 R 中应用了哪种算法lm.ridge只需输入lm.ridgeR 提示符。

使用 lm.ridge 还会产生一个缩放向量(尝试 head(model) 查看所有输出)。要获得您在 SAS 中看到的 R 中的预测值,请获取系数并除以标量向量。