Збільшити штрафи GLM, використовуючи збільшення рядків?


12

Я читав, що регресія хребта може бути досягнута простим додаванням рядків даних до вихідної матриці даних, де кожен рядок побудований з використанням 0 для залежних змінних та квадратного кореня або нуля для незалежних змінних. Потім додається один додатковий рядок для кожної незалежної змінної.k

Мені було цікаво, чи можна отримати доказ для всіх випадків, у тому числі для логістичної регресії чи інших ГЛМ.


Ні, я отримав це з ncss.com/wp-content/themes/ncss/pdf/Procedures/NCSS/…, і це було коротко згадувано на сторінці 335-4
Сніжинка

1
Вибачте за видалення коментаря до вас. Я вирішив, що помилявся, перш ніж побачив вашу відповідь і видалив її.
Glen_b -Встановити Моніку

2
Невелике узагальнення цієї проблеми задається і відповідає на сайті stats.stackexchange.com/questions/15991 . Оскільки це питання не стосується логістичної регресії цього питання, я не голосую за об'єднання двох потоків.
whuber

GLM підходять, використовуючи ітераційно переосмислені найменші квадрати, як у bwlewis.github.io/GLM , і тому в межах кожної ітерації можна підставляти звичайний зважений найменший квадратичний крок з кроком, пеналізованим зваженим найменшим квадратом, щоб отримати хребет пенальті. Насправді, у поєднанні з адаптаційними штрафами за гребінь це застосовується для встановлення L0 пенімерованих GLM, як у пакеті l0ara, див. Biodatamining.biomedcentral.com/articles/10.1186/… та journals.plos.org/plosone/article?id=10.1371 /…
Tom Wenseleers

Відповіді:


13

Регресія хребта мінімізує .i=1n(yixiTβ)2+λj=1pβj2

(Часто потрібна константа, але не зменшена. У такому випадку вона входить до і предикторів, - але якщо ви не хочете її зменшувати, у вас немає відповідного рядка для псевдоспостереження. Або якщо ви хочете , щоб зменшити його, ви дійсно мають ряд для нього. Я напишу його , як ніби це не враховується в , і не зморщені, так як це більш складний випадок. інший випадок тривіальне зміна від цього .)βp

Ми можемо записати другий доданок як псевдоспостереження, якщо можемо записати кожне "y" і кожен із відповідних -векторів "x" таким, щоp(p+1)

(yn+jxn+jTβ)2=λβj2,j=1,,p

Але, перевіривши, просто нехай , нехай і нехай всі інші (включаючи як правило).yn+j=0xn+j,j=λxn+j,k=0xn+j,0=0

Потім

(yn+j[xn+j,0β0+xn+j,1β1+xn+j,2β2+...+xn+j,pβp])2=λβj2 .

Це працює для лінійної регресії. Це не працює для логістичної регресії, оскільки звичайна логістична регресія не мінімізує суму залишків у квадраті.

[Регресія хребта - не єдине, що можна зробити за допомогою таких псевдо-спостережень - вони придумані в ряді інших контекстів]


Дякую, я вже намагався переписати все, що стосується логістичної регресії, але я просто не міг реалізувати телефонний метод даних. І я не довіряю власним можливостям достатньо, щоб можна було сказати, що це неможливо.
Сніжинка

Принаймні, я не думаю, що це так. Я ще раз погляну на функцію ймовірності.
Glen_b -Встановіть Моніку

3
+1 Додаткові прийоми пов'язані регресії вводяться в відповідях на stats.stackexchange.com/a/32753 і stats.stackexchange.com/a/26187 , серед іншого .
whuber

GLM підходять, використовуючи ітераційно переосмислені найменші квадрати, хоча, як у bwlewis.github.io/GLM , і тому в межах кожної ітерації можна замінити ступінь звичайного зваженого найменшого квадрату з кроком, пеналізованим зваженим найменшим квадратом, щоб отримати хребет пенальті. Насправді, у поєднанні з адаптаційними штрафами за гребінь це застосовується для встановлення L0 пенімерованих GLM, як у пакеті l0ara, див. Biodatamining.biomedcentral.com/articles/10.1186/… та journals.plos.org/plosone/article?id=10.1371 /…
Том Венсельєр

@TomWenseleers дякую, так, це має повний сенс
Glen_b -Встановити Моніку

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.