Changement de catégorie de référence dans un GLM

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Harentsoa RASAMOELINA
Messages : 3
Enregistré le : 31 Oct 2006, 20:33

Changement de catégorie de référence dans un GLM

Messagepar Harentsoa RASAMOELINA » 28 Mar 2007, 14:20

Bonjour,
Dans une régression logistique, j'essaie de changer la catégorie de référence de la covariable "age" mais je n'y arrive pas.
Après avoir importé les données via le package RODBC, j'ai fait les commandes

factor(as.charachter(age),levels=c("jeune","adulte","vieux")
R exécute sans problème
Quand je vérifie les levels de la variable age, ça a bien changé en jeune, adulte vieux( et non plus par ordre alphabétique)

Mais quand je lance le GLM, il garde toujours la catégorie "adulte" comme référence. ET c'est là que je bloque.
Est-ce que quelqu'un pourrait m'aider
Merci d'avance

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 28 Mar 2007, 15:22

Bonjour,

Je ne sais pas trop d'ou provient ton problème mais je pense que tu peux t'en sortir en regardant les contrastes associés à ton facteur :

Code : Tout sélectionner

y<- rnorm(90)
x <- gl(3,30,labels=c("adulte","jeune","vieux"))
glm(y~x)
Call:  glm(formula = y ~ x)

Coefficients:
(Intercept)      xadulte       xvieux 
  -0.331954     0.005436     0.129585 

Degrees of Freedom: 89 Total (i.e. Null);  87 Residual
Null Deviance:      75.28
Residual Deviance: 74.96        AIC: 247

contrasts(x)
       jeune vieux
adulte     0     0
jeune      1     0
vieux      0     1
# et pour mettre dans ce cas jeune en référence par exemple :
contrasts(x) <- contr.treatment(levels(x),2)
contrasts(x)
       adulte vieux
adulte      1     0
jeune       0     0
vieux       0     1

glm(y~x)
Call:  glm(formula = y ~ x)

Coefficients:
(Intercept)      xadulte       xvieux 
  -0.331954     0.005436     0.129585 

Degrees of Freedom: 89 Total (i.e. Null);  87 Residual
Null Deviance:      75.28
Residual Deviance: 74.96        AIC: 247


Après à toi de modifier en fonction des contrats que tu observes pour ta variable. Au lieu de passer par un factor(as.character(...),...) tu peux aussi utiliser la fonction relevel(fac,ref) qui te permet de mettre le level que tu veux en référence et tu arrives au même résultat.

En espérant t'avoir aidé même si je ne sais pas d'où peut provenir le souci.

Maxime

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 28 Mar 2007, 16:32

Il faudrait que tu nous donnes le résultat de

Code : Tout sélectionner

levels(age)

ainsi que la sortie du modèle.

Je parierai bien que tu as créé une nouvelle variable age mais que tu ne l'as pas placée dans le data.frame à partir duquel tu as estimé le modèle. Qque chose comme

Code : Tout sélectionner

age <- factor(as.character(myData$age), levels = c("jeune", "adulte", "vieux"))

glm(incidence ~ age, family = binomial, data = myData)



Dans ce cas, R va chercher age dans myData, pas dans l'espace de travail. Il faudrait alors faire

Code : Tout sélectionner

myData$age <- factor(as.character(myData$age), levels = c("jeune", "adulte", "vieux"))

glm(y/n ~ age, weights = n, family = binomial, data = myData)



Renaud

Harentsoa RASAMOELINA
Messages : 3
Enregistré le : 31 Oct 2006, 20:33

Messagepar Harentsoa RASAMOELINA » 29 Mar 2007, 11:33

Bonjour,
Un grand merci à vous deux.
J'ai essayé les 2 méthodes et ça marche (même résultats et changement de catégorie de référence).
Renaud a eu parfaitement raison sur l'origine du problème.
Harena

Harentsoa RASAMOELINA
Messages : 3
Enregistré le : 31 Oct 2006, 20:33

Messagepar Harentsoa RASAMOELINA » 29 Mar 2007, 11:44

Voici les détails

Code : Tout sélectionner

#effet de l'age
attach(mydata)
levels(age)
[1] "adulte" "jeune"  "vieux"

age=factor(as.character(age),levels=c("jeune","adulte","vieux"))

# ou
contrasts(age)=contr.treatment(levels(age),2)

#les deux donnent
levels(age)
[1] "jeune"  "adulte" "vieux"
# l'origine du problème c'était:
age=factor(as.character(mydata$age),levels=c("jeune","adulte","vieux"))
# comme l'a spécifié Renaud

#et  bingo

roa=glm(cbind(btv,effectif-btv)~age, family=binomial)
summary(roa)

Call:
glm(formula = cbind(btv, effectif - btv) ~ age, family = binomial)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.7217  -0.9466  -0.3933   0.8416   2.4767

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -2.7020     0.3114  -8.676  < 2e-16 ***
ageadulte     0.7304     0.3857   1.894   0.0583 .
agevieux      2.1255     0.3514   6.049 1.46e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 140.527  on 55  degrees of freedom
Residual deviance:  85.673  on 53  degrees of freedom
AIC: 159.21

Number of Fisher Scoring iterations: 4

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 29 Mar 2007, 16:39

NB: il est préférable d'utiliser l'opérateur d'affectation "<-" plutôt que "=" afin d'éviter les confusions avec l'opérateur de comparaison "==".

Renaud

Invité

Unknown

Messagepar Invité » 29 Mar 2007, 19:27

A Supprimer


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité