Ридж наказал GLM, используя увеличение строки?


12

Я читал, что регрессия гребня может быть достигнута простым добавлением строк данных в исходную матрицу данных, где каждая строка создается с использованием 0 для зависимых переменных и квадратного корня из k или нуля для независимых переменных. Затем добавляется одна дополнительная строка для каждой независимой переменной.

Мне было интересно, можно ли получить доказательства для всех случаев, в том числе для логистической регрессии или других GLM.


Нет, я получил это от 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 , и поэтому в каждой итерации можно заменить шаг регулярных взвешенных наименьших квадратов с шагом взвешенных наименьших квадратов с штрафом по гребню, чтобы получить штраф по GLM по штрафу. Фактически, в сочетании с адаптивными штрафами за хребты это используется для соответствия штрафованным GL0 GLM, как в пакете l0ara, см. Biodatamining.biomedcentral.com/articles/10.1186/… и journals.plos.org/plosone/article?id=10.1371 /…
Том Венселерс

Ответы:


13

Ридж регрессии минимизирует .i=1n(yixiTβ)2+λj=1pβj2

(Часто требуется постоянная, но не сокращенная. В этом случае она включается в и предикторы - но если вы не хотите сокращать ее, у вас нет соответствующей строки для псевдонаблюдения. Или если вы хотите , чтобы уменьшить его, вы делаете иметь строку для него. Я напишу его , как будто это не учитывается в р , и не сморщенные, так как это более сложный случай. другой случай тривиальное изменение от этого. )βp

Мы можем записать второе слагаемое как псевдонаблюдения, если мы можем записать каждое «y» и каждый из соответствующих ( p + 1 ) -векторов «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 , и поэтому в каждой итерации можно заменить обычный шаг взвешенных наименьших квадратов с шагом взвешенных наименьших квадратов с хребтом, оштрафованным на гребень, чтобы получить GLM, оштрафованный на хребте. Фактически, в сочетании с адаптивными штрафами за хребты это используется для соответствия штрафованным GL0 GLM, как в пакете l0ara, см. Biodatamining.biomedcentral.com/articles/10.1186/… и journals.plos.org/plosone/article?id=10.1371 /…
Том Венселерс

@ TomWenseleers спасибо, да, это имеет смысл
Glen_b

0

Обобщение этого рецепта для 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не работает]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.