Erreur de dimension GLM avec le package stats

For problems or questions about R.
Post Reply
Jean
Posts: 2
Joined: 01 Jun 2016, 14:53

Erreur de dimension GLM avec le package stats

Post by Jean » 01 Jun 2016, 15:27

Bonjour,

J'ai un petit souci avec mon code R. (Hé non ! Tout le monde n'est pas un Pro sur R :) )

J'aimerais expliquer une variable binomiale (qui peut prendre 0 ou 1 comme valeur) en fonction de variables explicatives grâce à un GLM (Modèle Linéaire Généralisé).

Voici un exemple minimal :

Code: Select all

# Voici un exemple minimal

set.seed(38) 							    # Pour obtenir un warning
nb_candidats_train = 20                                         # Nombre de candidats pour calibrer le modele
nb_var_explicatives = 5                                         # Nombre de variables explicatives
nb_candidats_test = 6                                           # Nombre de candidats pour tester le modele
nb_aleatoire_train = nb_candidats_train * nb_var_explicatives   # Juste le nombre de nombre aléatoire qu'il faut générer pour train
nb_aleatoire_test = nb_candidats_test * nb_var_explicatives     # Juste le nombre de nombre aléatoire qu'il faut générer pour test

# Determination de notre echantillon de calibrage
# Conversion du type pour pouvoir appliquer le GLM dessus
# On considere 5 variables explicatives et 1 variable binaire a expliquer
xtrain <- matrix( rnorm(nb_aleatoire_train), nrow = nb_candidats_train, ncol = nb_var_explicatives )       # x signifie que ca contient nos variables explicatives
ytrain <- matrix( rbinom(nb_candidats_train, size = 1, prob = 0.5), nrow = nb_candidats_train, ncol = 1 )  # y signifie que ca contient notre variable binaire expliquee

# Determination de notre echantillon de test
# A partir de xtest on veut predire ytest grace a la loi issu du GLM entre xtrain et ytrain
xtest <-  matrix( rnorm(nb_aleatoire_test), nrow = nb_candidats_test, ncol = nb_var_explicatives )  #  x signifie que ca contient nos variables explicatives

fit_glm <- glm(ytrain ~ xtrain, family=binomial(link="logit"))
ypred_glm <- predict.glm(fit_glm, newdata = as.data.frame(xtest), type="response")
J'obtiens alors deux warnings :

Le premier "1: glm.fit: algorithm did not converge 2: glm.fit: fitted probabilities numerically 0 or 1 occurred ".
Ce warning apparait lors de l'appel de la fonction glm.

Et le second est " 'newdata' had 6 rows but variables found have 20 rows ".
Ce warning apparaît lors de l'appelle de la fonction predict.glm. Je me suis renseigné et apparemment ce serait un problème de nom de variables. Il faudrait que les noms entre predict.glm(fit_glm,...) et as.data.frame(xtest) correspondent.

Le second warning m'intéresse beaucoup plus que le premier.

Merci d'avance pour votre aide.
Jean :)

Nicolas
Posts: 13
Joined: 25 Apr 2015, 08:56

Re: Erreur de dimension GLM avec le package stats

Post by Nicolas » 27 Jun 2016, 15:07

Bonjour Jean,

Pour le premier Warning, il s'agit de l'algorithme numérique qui derrière n'arrive pas à approcher une valeur, lorsque vous afficher glm_fit, vous voyez que les valeurs sont très élevées pour les paramètres. Or, dans votre exemple, vous simulez des valeurs indépendantes entre xtrain et ytrain, les valeurs implicites des coefficients de régression sont alors zéro et les estimateurs devraient en être relativement proche. Je pense qu'il s'agit juste de "pas de chance" pour cette graine de simulation, la changer résout le problème.

Pour le second, de manière personnelle, je n'aime pas trop les fonctions predict et predict.glm dans le cadre des modèles linéaires généralisés. Il est facile de faire des confusions entre les objets retournés et l'utilisation n'est pas si triviale. Le mieux de mon point de vue est malheureusement de créer sa propre fonction. Par exemple,

Code: Select all

pred.logit <- function(fit_glm, X)
{
	eta <- cbind(rep.int(1, nrow(X)), X) %*%fit_glm$coefficients
	return(exp(eta)/(1+exp(eta)))
}
pred.logit(fit_glm, xtest)
Désolé pour la réponse tardive.

Jean
Posts: 2
Joined: 01 Jun 2016, 14:53

Re: Erreur de dimension GLM avec le package stats

Post by Jean » 04 Jul 2016, 08:55

Bonjour,

Ce n'est pas exactement ce que j'attendais mais cela devrait faire l'affaire !

Merci beaucoup !
Jean :)

Post Reply