73

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

Il utilise juste 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.

+7

Vous devez effectuer l'étape de traitement des données en dehors de la formule ou de l'ajustement du modèle. Lors de la création du facteur 'b', vous pouvez spécifier l'ordre des niveaux en utilisant' factor (b, levels = c (3,1,2,4,5)) '. Faites cela dans une étape de traitement des données en dehors de l'appel 'lm()'. Ma réponse ci-dessous utilise la fonction 'relevel()' de sorte que vous pouvez créer un facteur, puis déplacer le niveau de référence pour l'adapter à vos besoins. –

+1

J'ai reformulé votre question.Vous êtes en fait après avoir changé le niveau de référence, ne pas en laisser un. –

+0

thx pour reformuler ma question. En effet, relevel() était ce que je cherchais. Merci pour la réponse détaillée et l'exemple cependant. Je ne suis pas sûr que la balise de régression linéaire soit un peu trompeuse parce qu'elle s'applique à tous les types de régression utilisant des explications factices ... –

Répondre

105

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 modifier le facteur b dans DF par l'utilisation de 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 
+2

Pour présélectionner la variable d'origine, n'utilisez pas 'within', mais' df $ bR = relevel (df $ b, ref = 3) '. – BurninLeo

24

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

+2

Les contrastes polynomiaux, pas une régression polynomiale. – hadley

+0

Existe-t-il un moyen de définir le niveau de référence en même temps que vous définissez le facteur, plutôt que dans un appel ultérieur de mise à niveau? –

28

D'autres ont mentionné la commande relevel qui est la meilleure solution si vous voulez changer le niveau de base pour toutes les analyses sur vos données (ou si vous êtes prêt à vivre avec la modification des données).

Si vous ne souhaitez pas modifier les données (il s'agit d'une modification ponctuelle, mais dans le futur, vous souhaitez rétablir le comportement par défaut), vous pouvez utiliser une combinaison de la fonction C (majuscule) pour définir les contrastes et les contr.treatments fonctionnent avec l'argument de base pour choisir quel niveau vous voulez être la ligne de base. Par exemple:

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

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')) 
3

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

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

fait exactement ce que vous avez demandé.

+0

Cela a été d'une grande aide! Seule solution qui comprenait un moyen de le faire dans la commande lm() qui était exactement ce dont j'avais besoin. Merci! – seeellayewhy

Questions connexes