Узагальнити цей рецепт до ГЛМ справді не складно, оскільки зазвичай ГММ підходять, використовуючи ітераційно переосмислені найменші квадрати . Отже, в межах кожної ітерації можна підміняти звичайний середньозважений крок з найменшими квадратами з кроком пенальті, зваженим найменшим квадратом, щоб отримати хребет, покараний 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
}
що дає дещо точніший результат btw, ніж
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
не працює]