Menggeneralisasi resep ini ke GLM memang tidak sulit karena GLM biasanya cocok digunakan dengan kuadrat terkecil yang berulang secara berulang . Oleh karena itu, dalam setiap iterasi seseorang dapat menggantikan langkah kuadrat terkecil tertimbang reguler dengan punggungan dihukum kuadrat terkecil kuadrat langkah untuk mendapatkan punggungan yang dihukum GLM. Faktanya, dalam kombinasi dengan penalti ridge adaptif resep ini digunakan untuk menyesuaikan L0 GLM yang dihukum (alias subset terbaik, yaitu GLMs di mana jumlah total koefisien bukan nol dihukum). Ini telah diterapkan misalnya dalam paket l0ara , lihat makalah ini dan ini untuk detailnya.
Perlu dicatat juga bahwa cara tercepat untuk menyelesaikan regresi ridge biasa adalah bentuk tertutup
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]
}
untuk kasus di mana n>=p
, atau menggunakan
lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]
kapan p>n
dan untuk model tanpa intersep.
Ini lebih cepat daripada menggunakan resep augmentasi baris , yaitu melakukan
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))))
}
Jika Anda akan membutuhkan kendala nonnegativitas pada koefisien yang dipasang Anda maka Anda bisa melakukannya
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
}
yang kemudian memberikan hasil yang sedikit lebih akurat daripada
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
}
(dan sebenarnya hanya solusinya nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
yang benar).
Saya belum menemukan bagaimana kasus yang dibatasi nonnegativitas dapat dioptimalkan lebih lanjut untuk p > n
kasus ini - beri tahu saya jika ada yang tahu cara melakukan ini ... [ lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
tidak berfungsi]