Régression avec variables catégorielles en R : codage indicateur

Placez des facteurs dans un modèle linéaire — comment R code en variables indicatrices un prédicteur catégoriel, comment lire les coefficients par rapport au niveau de référence, changer la base et gérer les facteurs à plus de deux niveaux

Utilisez des prédicteurs catégoriels (facteurs) en régression linéaire en R. Découvrez comment R code automatiquement un facteur en variables indicatrices, interprétez chaque coefficient comme un écart au niveau de référence, changez la base avec relevel(), gérez les facteurs à plus de deux niveaux et obtenez le test global du facteur avec car::Anova().

Date de publication

23 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Un prédicteur catégoriel (facteur) entre directement dans lm() — R le code en variables indicatrices automatiquement en variables 0/1.
  • Un facteur à deux niveaux ajoute un coefficient = la différence entre les deux groupes ; un facteur à n niveaux ajoute n − 1 coefficients, chacun un écart au niveau de référence.
  • Le niveau de référence (la base) est le premier niveau du facteur ; changez-le avec relevel() — cela change l’interprétation, pas l’ajustement du modèle.
  • Lisez un coefficient comme sexMale ainsi : « l’écart moyen par rapport à la référence (Female), à autres prédicteurs constants ».
  • Pour le test global d’un facteur à plusieurs niveaux, utilisez car::Anova(model) — une seule p-value pour tout le facteur, pas par niveau.

Introduction

La régression a besoin de nombres, mais les données réelles sont pleines de catégories — sexe, groupe de traitement, département, rang. Un prédicteur catégoriel (facteur) peut entrer directement dans un modèle linéaire : R le recode en variables indicatrices (dummy) en coulisses, et les coefficients deviennent des différences entre groupes.

Le scénario : une université suit les salaires de ses enseignants et veut savoir s’ils diffèrent selon le sexe, et comment le salaire varie selon le rang du professeur — en contrôlant l’expérience et la discipline. C’est une régression avec prédicteurs catégoriels.

Les données : salaires universitaires

Nous utilisons le jeu de données Salaries (de carData, installé avec le paquet car) — les salaires sur neuf mois 2008–09 d’enseignants universitaires, avec sex, rank, discipline et yrs.service :

data("Salaries", package = "carData")
head(Salaries, 4)
      rank discipline yrs.since.phd yrs.service  sex salary
1     Prof          B            19          18 Male 139750
2     Prof          B            20          16 Male 173200
3 AsstProf          B             4           3 Male  79750
4     Prof          B            45          39 Male 115000

Un facteur à deux niveaux : sex

Placez le facteur directement dans lm(). R crée une variable indicatrice sexMale (1 = Male, 0 = Female) et le coefficient est la différence de salaire entre les groupes :

data("Salaries", package = "carData")

model <- lm(salary ~ sex, data = Salaries)
summary(model)$coef
             Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 101002.41   4809.386 21.001103 2.683482e-66
sexMale      14088.01   5064.579  2.781674 5.667107e-03

Interprétez-le par rapport au niveau de référence (Female, le premier niveau) :

  • (Intercept) = 101,002 — le salaire moyen du groupe de référence (Female).
  • sexMale = 14,088 — les hommes gagnent en moyenne $14,088 de plus ; la moyenne masculine est donc 101,002 + 14,088 = 115,090. La faible p-value indique que cette différence brute est significative.

contrasts() montre exactement comment R l’a codé :

data("Salaries", package = "carData")
contrasts(Salaries$sex)
       Male
Female    0
Male      1

Male est codé 1, Female 0 — Female est la base. Le choix est arbitraire et ne change pas l’ajustement, seulement le groupe par rapport auquel les coefficients sont mesurés.

Changer le niveau de référence avec relevel()

Utilisez relevel() pour faire de Male la base à la place. Les nombres se reflètent : l’intercept devient la moyenne masculine et le coefficient devient négatif :

data("Salaries", package = "carData")

Salaries$sex <- relevel(Salaries$sex, ref = "Male")
model <- lm(salary ~ sex, data = Salaries)
summary(model)$coef
             Estimate Std. Error   t value      Pr(>|t|)
(Intercept) 115090.42   1587.378 72.503463 2.459122e-230
sexFemale   -14088.01   5064.579 -2.781674  5.667107e-03

Désormais (Intercept) = 115,090 (moyenne masculine) et sexFemale = −14,088 — être Female est associé à une baisse de $14,088 par rapport aux Males. Même modèle, même ajustement ; seule l’interprétation a basculé.

Un facteur à plus de deux niveaux : rank

Un facteur à n niveaux devient n − 1 variables indicatrices. rank a trois niveaux (AsstProf, AssocProf, Prof), il ajoute donc deux coefficients — chacun un contraste avec la référence (AsstProf). Regardez d’abord les groupes :

library(ggpubr)

data("Salaries", package = "carData")

ggboxplot(Salaries, x = "rank", y = "salary",
          color = "rank", palette = "jco",
          add = "jitter", add.params = list(size = 0.6),
          xlab = "Rank", ylab = "Salary", legend = "none")

A boxplot of academic salary by professor rank with jittered points, showing salary increasing from assistant to associate to full professor.

Le model.matrix() de R montre le codage indicateur qu’il construit pour rank :

data("Salaries", package = "carData")

res <- model.matrix(~ rank, data = Salaries)
head(res[, -1])     # the two dummy columns (AsstProf is the baseline = both 0)
  rankAssocProf rankProf
1             0        1
2             0        1
3             0        0
4             0        1
5             0        1
6             1        0
Note

R utilise par défaut des contrastes de traitement (chaque niveau vs une référence) — le codage le plus naturel pour la plupart des analyses, et celui que suppose chaque interprétation ici. D’autres schémas existent (par ex. le codage par effet/somme, contr.sum, qui compare chaque niveau à la moyenne générale selon un motif −1/+1) ; passez à un autre avec options(contrasts = ...) ou contrasts()<- uniquement lorsqu’une analyse spécifique l’exige.

Tester le facteur entier et ajuster pour les autres variables

Les p-values par niveau d’un facteur à plusieurs niveaux ne vous disent pas si le facteur dans son ensemble compte. Ajustez le modèle complet et utilisez car::Anova() pour obtenir une p-value par prédicteur (il gère correctement les plans déséquilibrés) :

library(car)

data("Salaries", package = "carData")
model2 <- lm(salary ~ yrs.service + rank + discipline + sex, data = Salaries)
Anova(model2)
Anova Table (Type II tests)

Response: salary
                Sum Sq  Df  F value    Pr(>F)    
yrs.service 3.2448e+08   1   0.6324    0.4270    
rank        1.0288e+11   2 100.2572 < 2.2e-16 ***
discipline  1.7373e+10   1  33.8582 1.235e-08 ***
sex         7.7669e+08   1   1.5137    0.2193    
Residuals   2.0062e+11 391                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Après ajustement pour les autres, rank et discipline sont hautement significatifs, tandis que sex n’est plus significatif (p = 0.22) — l’écart brut lié au sexe s’explique en grande partie par le rang, la discipline et l’expérience. Pour lire les contrastes individuels, regardez les coefficients :

data("Salaries", package = "carData")
model2 <- lm(salary ~ yrs.service + rank + discipline + sex, data = Salaries)
round(summary(model2)$coef, 2)
              Estimate Std. Error t value Pr(>|t|)
(Intercept)   68351.67    4482.20   15.25     0.00
yrs.service     -88.78     111.64   -0.80     0.43
rankAssocProf 14560.40    4098.32    3.55     0.00
rankProf      49159.64    3834.49   12.82     0.00
disciplineB   13473.38    2315.50    5.82     0.00
sexMale        4771.25    3878.00    1.23     0.22

Par exemple, disciplineB = 13,473 — les départements appliqués (B) paient en moyenne $13,473 de plus que les départements théoriques (A), à rang, expérience et sexe constants.

Note

L’ANOVA est une régression avec prédicteurs catégoriels. Une ANOVA à un facteur n’est rien d’autre que lm(y ~ factor) ; car::Anova() extrait la table d’ANOVA classique de n’importe quel modèle linéaire. Voir l’ANOVA à un facteur pour la perspective centrée sur le test de la même mécanique.

Rapport

Une régression linéaire a prédit le salaire à partir des années de service, du rang, de la discipline et du sexe. Après ajustement pour les autres variables, le rang (F(2, 391) = 100, p < 0.001) et la discipline (F(1, 391) = 34, p < 0.001) étaient des prédicteurs significatifs, alors que le sexe ne l’était pas (F(1, 391) = 1.5, p = 0.22). Les enseignants des disciplines appliquées gagnaient en moyenne $13,473 de plus que ceux des disciplines théoriques.

Un facteur de niveaux \(L_0, L_1, \dots, L_{k}\) est encodé en \(k\) variables indicatrices \(D_1, \dots, D_k\), où \(D_j = 1\) lorsque l’observation appartient au niveau \(L_j\) et 0 sinon ; le niveau de référence \(L_0\) a tous ses \(D_j = 0\). Le modèle \(y = \beta_0 + \beta_1 D_1 + \dots + \beta_k D_k\) fait alors de \(\beta_0\) la moyenne du groupe de référence et de chaque \(\beta_j\) la différence entre le niveau \(L_j\) et la référence — ce qui explique exactement pourquoi les contrastes « de traitement » (par défaut) se lisent comme des comparaisons entre groupes.

Essayez en direct

Changez le niveau de référence de rank en "Prof" et réajustez — comment les coefficients changent-ils ? Le bac à sable démarre au premier Run.

🟢 Avec un agent IA

Demandez à Prova « ajoute un prédicteur catégoriel à ma régression et interprète les coefficients par rapport au niveau de référence » — elle répond avec du code que vous pouvez exécuter sur vos propres facteurs et explique chaque contraste. The runtime is the judge. Ask Prova →

Problèmes courants

Vous avez interprété un coefficient indicateur comme une moyenne absolue. Chaque coefficient de facteur est un écart au niveau de référence, pas une moyenne de groupe. La moyenne du groupe est l’intercept + ce coefficient (avec tous les autres prédicteurs à leur référence / zéro).

Vous avez lu les p-values par niveau comme la significativité du facteur. Pour un facteur à 3 niveaux ou plus, les p-values individuelles de summary() testent des contrastes isolés ; pour la question globale « ce facteur compte-t-il » utilisez car::Anova(model).

Votre variable « catégorielle » est en fait des codes numériques. Si un facteur est stocké en 1/2/3, R le traite comme un nombre (une tendance linéaire), pas comme des catégories. Enveloppez-le dans factor() pour qu’il soit codé en indicatrices.

Questions fréquentes

R les code en variables indicatrices automatiquement : un facteur à n niveaux devient n − 1 variables indicatrices (0/1), avec le premier niveau comme référence. Vous placez simplement le facteur dans la formule (lm(y ~ group)) ; chaque coefficient est la différence entre ce niveau et la référence.

Chaque coefficient est l’écart moyen de la réponse entre ce niveau et le niveau de référence, à autres prédicteurs constants. L’intercept est la valeur prédite du groupe de référence. Ainsi sexMale = 14088 signifie que les hommes gagnent en moyenne $14,088 de plus que la référence (Female).

Utilisez relevel(factor, ref = "level") avant l’ajustement, ou définissez explicitement les niveaux du facteur avec factor(x, levels = ...). Cela change le groupe auquel les coefficients sont comparés — l’interprétation — mais pas l’ajustement ni les prédictions du modèle.

Utilisez car::Anova(model), qui donne une p-value par prédicteur (le facteur entier), pas par niveau indicateur. Il utilise par défaut les sommes des carrés de type II, qui gèrent correctement les plans déséquilibrés — préférable au anova() de base pour des données d’observation.

Testez vos connaissances

  1. Exécutez. Dans la cellule live, relevelez rank en "Prof" et réajustez salary ~ rank. Que signifie désormais le coefficient rankAsstProf ?
  2. Conceptuel. Dans le modèle complet, sex est non significatif, mais un simple lm(salary ~ sex) est hautement significatif. Quel résultat décrit le mieux si le sexe cause un écart de rémunération, et pourquoi ?

Remplissez le blanc avec "Prof". Avec Prof comme base, les autres coefficients sont des écarts par rapport aux professeurs titulaires (ils seront donc négatifs). Pour la question 2, réfléchissez à ce que le modèle complet ajuste.

Avec rank relevelé en "Prof", rankAsstProf est l’écart de salaire moyen des professeurs assistants par rapport aux professeurs titulaires (un grand nombre négatif). Pour la question 2 : le modèle complet est plus informatif sur un écart de rémunération causal. Le lm(salary ~ sex) brut mélange le sexe avec le rang, la discipline et l’expérience ; une fois que vous ajustez pour ceux-ci, l’effet direct du sexe n’est pas significatif — l’écart brut s’explique en grande partie par le fait que les hommes occupent des rangs plus élevés et ont plus d’ancienneté, et non par le sexe en soi.

AstuceQuel modèle choisir ?

Conclusion

Vous savez maintenant utiliser les variables catégorielles en régression en R : déposez un facteur dans lm() et laissez R le coder en indicatrices, interprétez chaque coefficient comme un écart au niveau de référence, changez la base avec relevel(), gérez les facteurs à plus de deux niveaux, et obtenez le test global du facteur avec car::Anova(). Catégories et nombres cohabitent sans problème dans le même modèle.

Leçons connexes

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Régression en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Chaque résultat de cette page a été produit par le code montré, exécuté au moment du build contre un environnement R figé — modifiez n’importe quel bloc et faites Run pour le reproduire vous-même.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Régression avec variables catégorielles en R : codage
    indicateur},
  date = {2026-06-23},
  url = {https://www.datanovia.com/learn/biostatistics/regression/regression-with-categorical-variables-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Régression avec variables catégorielles en R : codage indicateur.” 2026. June 23. https://www.datanovia.com/learn/biostatistics/regression/regression-with-categorical-variables-in-r.