Estou usando o glmnet para calcular estimativas de regressão de crista. Eu obtive alguns resultados que me fizeram suspeitar que o glmnet está realmente fazendo o que eu acho que ele faz. Para verificar isso, escrevi um script R simples, onde comparo o resultado da regressão de cume feita por resolve e a do glmnet, a diferença é significativa:
n <- 1000
p. <- 100
X. <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
beta1 <- solve(t(X)%*%X+5*diag(p),t(X)%*%Y)
beta2 <- glmnet(X,Y, alpha=0, lambda=10, intercept=FALSE, standardize=FALSE,
family="gaussian")$beta@x
beta1-beta2
A norma da diferença é geralmente em torno de 20, o que não pode ser devido a algoritmos numericamente diferentes, devo estar fazendo algo errado. Quais são as configurações que tenho que definir glmnet
para obter o mesmo resultado que o cume?
r
ridge-regression
glmnet
John
fonte
fonte
Respostas:
A diferença que você está observando se deve à divisão adicional pelo número de observações, N, que o GLMNET usa em sua função objetivo e padronização implícita de Y por seu desvio padrão da amostra, como mostrado abaixo.
onde usamos no lugar de 1 / ( n - 1 ) para s y , s y = ∑ i ( y i - ˉ y ) 21/n 1/(n−1) sy
Ao diferenciar em relação ao beta, definir a equação para zero,
E resolvendo para beta, obtemos a estimativa,
Para recuperar as estimativas (e as respectivas penalidades correspondentes) na métrica original de Y, o GLMNET multiplica as estimativas e as lambdas por e retorna esses resultados ao usuário,sy
Xunstd. =s
Compare esta solução com a derivação padrão da regressão de crista.
Observe que é dimensionado por um fator extra de N. Além disso, quando usamos a função ou , a penalidade será implicitamente dimensionada em 1 / s y . Ou seja, quando usamos essas funções para obter as estimativas do coeficiente para alguns λ ∗ , estamos efetivamente obtendo estimativas para λ = λ ∗ / s y .λ 1/sy λ∗ λ=λ∗/sy
predict()
coef()
Com base nestas observações, a pena utilizados em GLMNET necessita de ser dimensionado por um factor de .sy/N
Os resultados generalizam para a inclusão de uma interceptação e variáveis X padronizadas. Modificamos uma matriz X padronizada para incluir uma coluna de unidades e a matriz diagonal para ter uma entrada zero adicional na posição [1,1] (isto é, não penaliza a interceptação). Em seguida, você pode padronizar as estimativas pelos respectivos desvios padrão da amostra (verifique novamente se você está usando 1 / n ao calcular o desvio padrão).
Adicionado código para mostrar X padronizado sem interceptação:
fonte
De acordo com https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html , quando a família estiver
gaussian
,glmnet()
deve minimizarAo usarx padronizada, a solução para a penalidade relatada λ é a solução para minimizar
glmnet(x, y, alpha=1)
para ajustar o laço com as colunas emglmnet_2.0-13
, ao usarglmnet(x, y, alpha=0)
para ajustar a regressão de crista, a solução para uma penalidade relatadaO que pode acontecer é que a função primeiro padronizey para y0 0 e depois minimiza
Para o laço (α = 1 ), dimensionamento η de volta para relatar a penalidade como ηsy faz sentido. Então para todosα , ηsy deve ser relatado como uma penalidade para manter a continuidade dos resultados α . Provavelmente, essa é a causa do problema acima. Isso se deve em parte ao uso de (2) para resolver (1). Apenas quandoα = 0 ou α = 1 existe alguma equivalência entre os problemas (1) e (2) (ou seja, uma correspondência entre os λ em (1) e o η em 2)). Para qualquer outroα ∈ ( 0 , 1 ) , os problemas (1) e (2) são dois problemas de otimização diferentes e não há correspondência individual entre os λ em (1) e o η em 2).
fonte