lm.ridge 返回来自手动计算的不同结果

机器算法验证 r 岭回归
2022-03-23 23:22:14

我再次比较了岭回归的手动计算lm.ridge功能,但是,这两种技术的答案似乎不匹配。他们只匹配时λ=0.

set.seed(1)

x <- rnorm(1000,1,2)
x <- matrix(x,ncol=10,nrow=100)
y <- rnorm(100,2,5)

xs <- scale(x,T,T)
ys <- scale(y,T,T)


p <- dim(x)[2]
lam <- 2
# manual Calculation
bh <- solve(t(xs) %*% xs + lam * diag(p), t(xs) %*% ys)
# lm..ridge
fit <- lm.ridge(ys~xs-1, lambda=lam)
coef_fit <- as.matrix(coef(fit),nco1)
cbind(bh, coef_fit)

有谁知道为什么估计的系数只匹配λ=0但不适用于其他值λ年代?

更新: 抱歉之前没有缩放数据。我现在已经对数据进行了缩放,但估计的系数之间仍然存在差异。

> cbind(bh, coef_fit)
             [,1]         [,2]
xs1  -0.144767582 -0.144799855
xs2  -0.114627840 -0.114652989
xs3  -0.019612430 -0.019612567
xs4   0.007292303  0.007293982
xs5   0.044335298  0.044354816
xs6  -0.034135483 -0.034137483
xs7   0.020260806  0.020265217
xs8   0.058511001  0.058520197
xs9  -0.124643955 -0.124671909
xs10  0.060076729  0.060097567
1个回答

为了解决缩放问题,我建议您将 lambda 替换为 lambda*(n/(n-1))。这将解决差异。

在您的示例中,它将是lam*(100/99).

set.seed(1)
x <- rnorm(1000,1,2)
x <- matrix(x,ncol=10,nrow=100)
y <- rnorm(100,2,5)

xs <- scale(x,TRUE,TRUE)
ys <- scale(y,TRUE,TRUE)


p <- dim(x)[2]
lam <- 2
# manual Calculation
bh <- solve(t(xs) %*% xs + lam * diag(p), t(xs) %*% ys)
# lm..ridge
fit <- lm.ridge(ys~xs-1, lambda=lam*(100/99))
coef_fit <- as.matrix(coef(fit),nco1)


cbind(bh, coef_fit)

这将产生与下面完全相同的两列。

             [,1]         [,2]
xs1  -0.144767582 -0.144767582
xs2  -0.114627840 -0.114627840
xs3  -0.019612430 -0.019612430
xs4   0.007292303  0.007292303
xs5   0.044335298  0.044335298
xs6  -0.034135483 -0.034135483
xs7   0.020260806  0.020260806
xs8   0.058511001  0.058511001
xs9  -0.124643955 -0.124643955
xs10  0.060076729  0.060076729

编辑1它是如何工作的?

弄清楚这个 lm.ridge() 如何帮助我们理解它。

假设 x 已缩放并居中

系数的手动计算是 β^=(XX+λI)1XY.

lm.ridge()使用缩放 XXs=nn1X

fit$coef返回向量:

β^=(XsXs+λI)1XsY=(XX+n1nλI)1XYn1n.

fit$scale返回所有元素为的向量n1n并且具有相同的长度β^

coef(fit)返回 的值fit$coef/fit$scale

因此,要获得相同的值,您应该将 lambda 替换为 lambda*(n/(n-1))。