的平方根或零作为自变量来构造的。然后为每个自变量添加一个额外的行。
我想知道是否有可能为所有案例得出一个证明,包括逻辑回归或其他 GLM。
的平方根或零作为自变量来构造的。然后为每个自变量添加一个额外的行。
我想知道是否有可能为所有案例得出一个证明,包括逻辑回归或其他 GLM。
岭回归最小化 。
(通常需要一个常数,但不会缩小。在这种情况下,它包含在和预测变量中——但如果你不想缩小它,你就没有对应的伪观察行。或者如果你确实想缩小它,你确实有一行。我会把它写成不计入,而不是缩小,因为它是更复杂的情况。另一种情况是一个微不足道的变化.)
-向量“x”,我们可以将第二项写为伪观察
但是通过检查,只需让,让并让所有其他(包括通常)。
然后
。
这适用于线性回归。它不适用于逻辑回归,因为普通逻辑回归不会最小化残差平方和。
[岭回归不是唯一可以通过这种伪观察技巧完成的事情——它们出现在许多其他情况下]
将这个方法推广到 GLM 确实并不困难,因为 GLM 通常使用迭代重新加权最小二乘来拟合。因此,在每次迭代中,可以用脊惩罚加权最小二乘步代替常规加权最小二乘步,以获得脊惩罚 GLM。事实上,结合自适应岭惩罚,这个配方用于拟合 L0 惩罚 GLM(也称为最佳子集,即非零系数总数受到惩罚的 GLM)。例如,这已在l0ara 包中实现,有关详细信息,请参阅这篇论文和这篇论文。
还值得注意的是,解决常规岭回归的最快封闭式方法是使用
lmridge_solve = function (X, y, lambda, intercept = TRUE) {
if (intercept) {
lambdas = c(0, rep(lambda, ncol(X)))
X = cbind(1, X)
} else { lambdas = rep(lambda, ncol(X)) }
solve(crossprod(X) + diag(lambdas), crossprod(X, y))[, 1]
}
对于n>=p
, 或使用的情况
lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]
何时p>n
以及对于没有截距的模型。
这比使用行扩充配方快,即做
lmridge_rbind = function (X, y, lambda, intercept = TRUE) {
if (intercept) {
lambdas = c(0, rep(lambda, ncol(X)))
X = cbind(1, X)
} else { lambdas = rep(lambda, ncol(X)) }
qr.solve(rbind(X, diag(sqrt(lambdas))), c(y, rep(0, ncol(X))))
}
如果您碰巧需要对拟合系数进行非负性约束,那么您可以这样做
library(nnls)
nnlmridge_solve = function (X, y, lambda, intercept = TRUE) {
if (intercept) {
lambdas = c(0, rep(lambda, ncol(X)))
X = cbind(1, X)
} else { lambdas = rep(lambda, ncol(X)) }
nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
}
顺便说一句,它给出的结果比
nnlmridge_rbind = function (X, y, lambda, intercept = TRUE) {
if (intercept) {
lambdas = c(0, rep(lambda, ncol(X)))
X = cbind(1, X)
} else { lambdas = rep(lambda, ncol(X)) }
nnls(A=rbind(X,diag(sqrt(lambdas))), b=c(Y,rep(0,ncol(X))))$x
}
(严格来说,只有解决方案nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
才是正确的)。
我还没有弄清楚如何针对该案例进一步优化非负约束案例p > n
- 让我知道是否有人会碰巧知道如何做到这一点...... [lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
不起作用]