134 votes

Comment forcer R à utiliser un niveau de facteur spécifié comme référence dans une régression?

D'une manière ou d'une autre, je ne le trouve pas dans mes notes ... ni ne trouve l'object sur le net. Comment puis-je dire à R d'utiliser un certain niveau comme référence si j'utilise des explications factices dans une régression? Cela utilise simplement un niveau par défaut.

 lm(x ~ y + as.factor(b)) 
 

avec b {0,1,2,3,4}. Disons que je veux utiliser 3 au lieu du zéro utilisé par R.

Merci d'avance!

178voto

Gavin Simpson Points 72349

Voir la fonction relevel() . Voici un exemple:

 set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)
 

Modifiez maintenant le facteur b en DF en utilisant la fonction relevel() :

 DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)
 

Les modèles ont estimé différents niveaux de référence.

 > coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759
 

38voto

Greg Snow Points 22040

D'autres ont mentionné la relevel de commande qui est la meilleure solution si vous souhaitez modifier le niveau de base pour toutes les analyses de données sur votre (ou sont prêts à vivre avec modification des données).

Si vous ne voulez pas modifier les données (ce qui est un changement, mais dans le futur, vous voulez le comportement par défaut à nouveau), puis vous pouvez utiliser une combinaison de la C (notez les majuscules) de la fonction à régler les contrastes et le contr.les traitements de la fonction avec l'argument de base pour choisir le niveau qui vous voulez être la ligne de base. Par exemple:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )

33voto

John Points 11714

Le relevel() la commande est une méthode abrégée à votre question. Ce qu'il fait est de réorganiser le facteur, de sorte que quelle que soit la réf niveau est le premier. Par conséquent, la réorganisation de votre taux de facteur sera également le même effet, mais vous donne plus de contrôle. Peut-être que vous voulais avoir des niveaux 3,4,0,1,2. Dans ce cas...

bFactor <- factor(b, levels = c(3,4,0,1,2))

Je préfère cette méthode car il est plus facile pour moi de le voir dans mon code, non seulement ce que la référence était, mais la position des autres valeurs (plutôt que d'avoir à regarder les résultats pour ça).

REMARQUE: NE PAS en faire un commandés facteur. Un facteur de l'ordre et l'ordre facteur ne sont pas la même chose. lm() peut commencer à penser que vous voulez polynôme contrastes si vous faites cela.

12voto

Harlan Points 5486

Vous pouvez également marquer manuellement la colonne avec un attribut contrasts , qui semble être respecté par les fonctions de régression:

 contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X