A generalização desta receita para os GLMs não é realmente difícil, pois os GLMs geralmente são adequados usando mínimos quadrados com ponderação iterativa . Portanto, dentro de cada iteração, pode-se substituir a etapa regular de mínimos quadrados ponderada com uma etapa de mínimos quadrados ponderada penalizada de crista para obter um GLM penalizado de crista. De fato, em combinação com penalidades adaptativas da crista, esta receita é usada para ajustar GLMs penalizados por L0 (também conhecido como melhor subconjunto, ou seja, GLMs em que o número total de coeficientes diferentes de zero é penalizado). Isso foi implementado, por exemplo, no pacote l0ara , consulte este documento e este para obter detalhes.
Também é importante notar que a maneira mais rápida e fechada de resolver uma regressão regular de cume é usar
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]
}
para o caso em que n>=p
, ou usando
lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]
quando p>n
e para um modelo sem interceptação.
Isso é mais rápido do que usar a receita de aumento de linha , ou seja, fazer
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))))
}
Se você precisar de restrições de não-negatividade em seus coeficientes ajustados , basta fazer
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
}
que então dá um resultado um pouco mais preciso entre
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
}
(e estritamente falando, apenas a solução nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
é a correta).
Ainda não descobri como o caso restrito da não-negatividade poderia ser otimizado ainda mais para o p > n
caso - deixe-me saber se alguém saberia como fazer isso ... [ lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
não funciona]