2012-10-11 1 views
6

Quindi il mio set di dati è composto da 15 variabili, una delle quali (sesso) ha solo 2 livelli. Voglio usarlo come variabile dummy, ma i livelli sono 1 e 2. Come faccio a fare questo? Voglio avere i livelli 0 e 1, ma non so come gestirlo in R!Come si crea una variabile fittizia in R?

+1

Suona come questa domanda ho chiesto qui: http://stackoverflow.com/questions/11970611/convert-a-vector-into -logical-matrix – Chase

+3

Se lo trasformi in un fattore e lo metti in un modello R si prende cura del lavoro sporco per te. –

+0

@TylerRinker Per lm e aov questo è il caso, e forse per gli altri, ma non sempre. Sto usando daisy e non lo fa automaticamente: Errore in daisy (train.X, metric = "gower", tipo = lista (symm = 1: symm_bin_len)): almeno una variabile binaria ha più di 2 livelli . – JStrahl

risposta

20

Con la maggior parte degli strumenti di modellazione di R con un'interfaccia formula non è necessario creare variabili dummy, il codice sottostante che gestisce e interpreta la formula lo farà per voi. Se vuoi una variabile dummy per qualche altra ragione, allora ci sono diverse opzioni. Il metodo più semplice (secondo me) è quello di utilizzare model.matrix():

set.seed(1) 
dat <- data.frame(sex = sample(c("male","female"), 10, replace = TRUE)) 

model.matrix(~ sex - 1, data = dat) 

che dà:

> dummy <- model.matrix(~ sex - 1, data = dat) 
> dummy 
    sexfemale sexmale 
1   0  1 
2   0  1 
3   1  0 
4   1  0 
5   0  1 
6   1  0 
7   1  0 
8   1  0 
9   1  0 
10   0  1 
attr(,"assign") 
[1] 1 1 
attr(,"contrasts") 
attr(,"contrasts")$sex 
[1] "contr.treatment" 

> dummy[,1] 
1 2 3 4 5 6 7 8 9 10 
0 0 1 1 0 1 1 1 1 0 

È possibile utilizzare uno colonna dummy come una variabile dummy numerica; scegli la colonna che desideri sia il livello basato su 1. dummy[,1] sceglie 1 come rappresentante della classe femminile e dummy[,2] la classe maschile.

Fusioni questo come un fattore, se lo si vuole essere interpretato come un oggetto categorica:

> factor(dummy[, 1]) 
1 2 3 4 5 6 7 8 9 10 
0 0 1 1 0 1 1 1 1 0 
Levels: 0 1 

Ma che sta sconfiggendo l'oggetto del fattore; che cos'è 0 di nuovo?

9

Ty questo

set.seed(001) # generating some data 
sex <- factor(sample(1:2, 10, replace=TRUE)) # this is what you have 
[1] 1 1 2 2 1 2 2 2 2 1 
Levels: 1 2 

sex<-factor(ifelse(as.numeric(sex)==2, 1,0)) # this is what you want 
sex 
[1] 0 0 1 1 0 1 1 1 1 0 
Levels: 0 1 

Se si vuole etichette da 0 = maschio e 1 = Femmina, quindi ...

sex<-factor(ifelse(as.numeric(sex)==2, 1,0), labels=c('M', 'F')) 
sex # this is what you want 
[1] M M F F M F F F F M 
Levels: M F 

In realtà non è necessario creare una variabile dummy in per stimare un modello con lm, vediamo questo esempio:

set.seed(001) # Generating some data 
N <- 100 
x <- rnorm(N, 50, 20) 
y <- 20 + 3.5*x + rnorm(N) 
sex <- factor(sample(1:2, N, replace=TRUE)) 

# Estimating the linear model 
lm(y ~ x + sex) # using the first category as the baseline (this means sex==1) 

Call: 
    lm(formula = y ~ x + sex) 

Coefficients: 
(Intercept)   x   sex2 
    19.97815  3.49994  -0.02719  


# renaming the categories and labelling them 
sex<-factor(ifelse(as.numeric(sex)==2, 1,0), labels=c('M', 'F')) 
lm(y ~ x + sex) # the same results, baseline is 'Male' 

Call: 
lm(formula = y ~ x + sex) 

Coefficients: 
(Intercept)   x   sexF 
    19.97815  3.49994  -0.02719 

Come si può vedere offerte R con i manichini abbastanza bene, basta passarli nella formula come variabile factor e R farà il resto per te.

Tra l'altro non è necessario cambiare le categorie da c (2,1) a c (0,1), i risultati saranno gli stessi che è possibile vedere nell'esempio sopra.

1

Come suggerito da molti sopra, trasformarlo in fattore.

Se davvero si vuole codice fittizio la variabile di genere, in considerazione questa

set.seed(100) 
gender = rbinom(100,1,0.5)+1 
gender_dummy = gender-1