【问题标题】:computing ridge estimate manually in R, simple在 R 中手动计算岭估计,简单
【发布时间】:2015-05-30 16:59:04
【问题描述】:

我正在尝试学习岭回归,并且我正在使用 R。据我了解,以下代码中的 beta.r1beta.r2 应该相同

library(MASS)
n=50
v1=runif(n)
v2=v1+2
V=cbind(1,v1,v2)
w=3+v1+v2
I=diag(3)

lambda=2 #arbitrarily chosen

beta.r1=solve(t(V)%*%V+lambda*I)%*%t(V)%*%w

#Using library(MASS)
fit=lm.ridge(w~v1+v2,lambda=2, Inter=FALSE)
beta.r2=coef(fit)
#Shouldn't beta.r1 and beta.r2 be the same?

【问题讨论】:

  • 选择 n 为 50,抱歉忘记提及了
  • 这很有趣。可以通过在命令提示符下输入 lm.ridge 来检查实际的 lm.ridge 代码。它不是很长。然后,您可以复制它并对其进行修改,以便打印出中间结果,您可以检查差异。我会更多地研究它,因为我也对这个问题感兴趣,但现在我要说的是,它所做的与你的公式完全不同,除其他外,它还涉及输入数据的 svd。

标签: r regression manual


【解决方案1】:

我认为在 lm.ridge 代码中执行的变量缩放(您可以通过在 R 控制台中输入 lm.ridge 来访问)可能会导致差异。代码按其均方根值缩放每个变量:

Xscale <- drop(rep(1/n, n) %*% X^2)^0.5
X <- X/rep(Xscale, rep(n, p))

您的代码不执行任何变量缩放。

变量缩放在?lm.ridge帮助页面的lm.ridge返回内容的描述中有所提示:

scales:X 矩阵上使用的缩放比例。

因此您可以访问lm.ridge 使用的缩放比例:

fit$scales
#        v1        v2 
# 0.2650311 0.2650311 

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2015-08-13
    • 1970-01-01
    相关资源
    最近更新 更多