web-dev-qa-db-fra.com

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

Comment puis-je dire à R d'utiliser un certain niveau comme référence si j'utilise des variables explicatives binaires dans une régression?

C'est juste en utilisant 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 qui est utilisé par R.

96
Matt Bannert

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)

Maintenant, modifiez le facteur b dans 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
134
Gavin Simpson

D'autres ont mentionné la commande relevel qui constitue la meilleure solution si vous souhaitez modifier le niveau de base de toutes les analyses de vos données (ou si vous souhaitez modifier ces données).

Si vous ne souhaitez pas modifier les données (il s'agit d'un changement ponctuel, mais à l'avenir, vous souhaitez rétablir le comportement par défaut), vous pouvez utiliser une combinaison de la fonction C (note majuscule) pour: régler les contrastes et le contr.treatments fonction avec l'argument de base pour choisir le niveau de référence souhaité.

Par exemple:

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

La commande relevel() est une méthode abrégée de votre question. Ce qu'il fait est de réorganiser le facteur de sorte que le niveau de référence soit le premier. Par conséquent, la réorganisation de vos niveaux de facteurs aura également le même effet, mais vous donnera plus de contrôle. Peut-être que vous vouliez avoir les 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 m'est plus facile de voir dans mon code non seulement la référence mais également la position des autres valeurs (plutôt que de devoir regarder les résultats pour cela).

REMARQUE: NE PAS en faire un facteur ordonné. Un facteur avec un ordre spécifié et un facteur ordonné ne sont pas la même chose. lm() peut commencer à penser que vous voulez des contrastes polynomiaux si vous le faites.

28
John

Je sais que c'est une vieille question, mais j'avais un problème similaire et j'ai constaté que:

lm(x ~ y + relevel(b, ref = "3")) 

fait exactement ce que vous avez demandé.

24
Yan Alperovych

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'))
11
Harlan