2015-04-23 2 views
0

J'utilise la bibliothèque rms pour effectuer une régression logistique régularisée, et je souhaite forcer l'interception à zéro. Je suis en utilisant ce qui suit et pour simuler la régression:R Supprimer les interceptions dans la régression logistique

library(rms) 
N = 100 
pred <- vapply(1:12, function(i) rnorm(N, mean = 0, sd =1), numeric(N)) 
resp <- 20*pred[, 1] - 3*pred[, 7] - 2*pred[, 8] + matrix(rnorm(N, sd = 0.1)) + 20 
pr <- 1/(1 + exp(-resp)) 
y <- rbinom(N, 1, pr) 
lrm(y ~ pred, penalty = 1) 

Le poste de How to remove intercept in R suggère d'inclure « 0 + » ou « - 1 » dans la formule du modèle. Cependant, cela ne semble pas fonctionner pour lrm.

+0

devez-vous utiliser la bibliothèque 'rms'? –

+0

Non. Je connais trois bibliothèques possibles, 'glmnet',' LiblinearC', et 'rms'; si vous en connaissez d'autres, cela ne me dérangerait pas d'en apprendre plus. J'ai trouvé que 'LiblinearC' fonctionnait plus longtemps et donnait des résultats plus étranges que' rms'; Je suis en train de tester 'glmnet' en ce moment. – TreeStump

+0

Je pense que glmnet est maintenant l'état de l'art. –

Répondre

1

Vous pouvez utiliser glmnet. Il comprend également une fonction de validation croisée pour choisir le paramètre de tournage.

library(glmnet) 
N = 1000 
pred <- vapply(1:12, function(i) rnorm(N, mean = 0, sd =1), numeric(N)) 
resp <- 20*pred[, 1] - 3*pred[, 7] - 2*pred[, 8] + matrix(rnorm(N, sd = 0.1)) + 20 
pr <- 1/(1 + exp(-resp)) 
y <- rbinom(N, 1, pr) 
result <- cv.glmnet(pred, y, family="binomial", intercept=FALSE) 
# best lambda based on cv 
result$lambda.min 
# coefficient 
coef(result$glmnet.fit, s=result$lambda.min)