93 votes

Générer une variable fictive

J'ai eu des difficultés à générer les variables fictives suivantes dans R :

J'analyse des données de séries chronologiques annuelles (période 1948-2009). J'ai deux questions :

  1. Comment puis-je générer une variable muette pour l'observation n°10, c'est-à-dire pour l'année 1957 (valeur = 1 en 1957 et zéro sinon) ?

  2. Comment générer une variable muette qui est nulle avant 1957 et prend la valeur 1 à partir de 1957 et jusqu'en 2009 ?

118voto

David J. Harris Points 1312

Une autre option qui peut mieux fonctionner si vous avez beaucoup de variables est factor y model.matrix .

year.f = factor(year)
dummies = model.matrix(~year.f)

Cela comprendra une colonne d'interception (tous les 1) et une colonne pour chacune des années de votre ensemble de données, sauf une, qui sera la valeur "par défaut" ou d'interception.

Vous pouvez modifier la façon dont le "défaut" est choisi en jouant avec les paramètres suivants contrasts.arg en model.matrix .

De plus, si vous voulez omettre l'intercept, vous pouvez simplement laisser tomber la première colonne ou ajouter +0 à la fin de la formule.

J'espère que cela vous sera utile.

61voto

Martin O'Leary Points 1186

La façon la plus simple de produire ces variables fictives est la suivante :

> print(year)
[1] 1956 1957 1957 1958 1958 1959
> dummy <- as.numeric(year == 1957)
> print(dummy)
[1] 0 1 1 0 0 0
> dummy2 <- as.numeric(year >= 1957)
> print(dummy2)
[1] 0 1 1 1 1 1

Plus généralement, vous pouvez utiliser ifelse pour choisir entre deux valeurs en fonction d'une condition. Ainsi, si au lieu d'une variable muette 0-1, vous souhaitez, pour une raison quelconque, utiliser, disons, 4 et 7, vous pourriez utiliser ifelse(year == 1957, 4, 7) .

53voto

zx8754 Points 13573

Utilisation de mannequins::mannequins() :

library(dummies)

# example data
df1 <- data.frame(id = 1:4, year = 1991:1994)

df1 <- cbind(df1, dummy(df1$year, sep = "_"))

df1
#   id year df1_1991 df1_1992 df1_1993 df1_1994
# 1  1 1991        1        0        0        0
# 2  2 1992        0        1        0        0
# 3  3 1993        0        0        1        0
# 4  4 1994        0        0        0        1

20voto

Paquet mlr comprend createDummyFeatures à cette fin :

library(mlr)
df <- data.frame(var = sample(c("A", "B", "C"), 10, replace = TRUE))
df

#    var
# 1    B
# 2    A
# 3    C
# 4    B
# 5    C
# 6    A
# 7    C
# 8    A
# 9    B
# 10   C

createDummyFeatures(df, cols = "var")

#    var.A var.B var.C
# 1      0     1     0
# 2      1     0     0
# 3      0     0     1
# 4      0     1     0
# 5      0     0     1
# 6      1     0     0
# 7      0     0     1
# 8      1     0     0
# 9      0     1     0
# 10     0     0     1

createDummyFeatures laisse tomber la variable originale.

https://www.rdocumentation.org/packages/mlr/versions/2.9/topics/createDummyFeatures
.....

19voto

alistaire Points 5898

Les autres réponses ici proposent des voies directes pour accomplir cette tâche - une tâche que de nombreux modèles (par ex. lm ) fera pour vous en interne de toute façon. Néanmoins, voici comment créer des variables fictives à l'aide de la célèbre méthode de Max Kuhn caret y recipes paquets. Bien qu'un peu plus verbeux, ils s'adaptent tous deux facilement à des situations plus complexes et s'intègrent parfaitement à leurs cadres respectifs.


caret::dummyVars

Avec caret la fonction pertinente est dummyVars qui a un predict pour l'appliquer à un cadre de données :

df <- data.frame(letter = rep(c('a', 'b', 'c'), each = 2),
                 y = 1:6)

library(caret)

dummy <- dummyVars(~ ., data = df, fullRank = TRUE)

dummy
#> Dummy Variable Object
#> 
#> Formula: ~.
#> 2 variables, 1 factors
#> Variables and levels will be separated by '.'
#> A full rank encoding is used

predict(dummy, df)
#>   letter.b letter.c y
#> 1        0        0 1
#> 2        0        0 2
#> 3        1        0 3
#> 4        1        0 4
#> 5        0        1 5
#> 6        0        1 6

recipes::step_dummy

Avec recipes la fonction pertinente est step_dummy :

library(recipes)

dummy_recipe <- recipe(y ~ letter, df) %>% 
    step_dummy(letter)

dummy_recipe
#> Data Recipe
#> 
#> Inputs:
#> 
#>       role #variables
#>    outcome          1
#>  predictor          1
#> 
#> Steps:
#> 
#> Dummy variables from letter

Selon le contexte, extraire les données avec prep et soit bake o juice :

# Prep and bake on new data...
dummy_recipe %>% 
    prep() %>% 
    bake(df)
#> # A tibble: 6 x 3
#>       y letter_b letter_c
#>   <int>    <dbl>    <dbl>
#> 1     1        0        0
#> 2     2        0        0
#> 3     3        1        0
#> 4     4        1        0
#> 5     5        0        1
#> 6     6        0        1

# ...or use `retain = TRUE` and `juice` to extract training data
dummy_recipe %>% 
    prep(retain = TRUE) %>% 
    juice()
#> # A tibble: 6 x 3
#>       y letter_b letter_c
#>   <int>    <dbl>    <dbl>
#> 1     1        0        0
#> 2     2        0        0
#> 3     3        1        0
#> 4     4        1        0
#> 5     5        0        1
#> 6     6        0        1

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