2012-10-11 24 views
6

Por lo tanto, mi conjunto de datos consta de 15 variables, una de ellas (sexo) tiene solo 2 niveles. Quiero usarlo como una variable ficticia, pero los niveles son 1 y 2. ¿Cómo hago esto? Quiero tener los niveles 0 y 1, pero no sé cómo administrar esto en R!¿Cómo puedo hacer una variable ficticia en R?

+1

suena así pregunta que hice aquí: http://stackoverflow.com/questions/11970611/convert-a-vector-into -logical-matrix – Chase

+3

Si lo convierte en un factor y lo pone en un modelo, R se encargará del trabajo sucio para usted. –

+0

@TylerRinker Para lm y aov este es el caso, y tal vez para otros, pero no siempre. Estoy usando daisy y no lo hago automáticamente: Error en daisy (train.X, metric = "gower", type = list (symm = 1: symm_bin_len)): al menos una variable binaria tiene más de 2 niveles . – JStrahl

Respuesta

20

Con la mayoría de las herramientas de modelado de R con una interfaz de fórmula, no necesita crear variables ficticias, el código subyacente que maneja e interpreta la fórmula lo hará por usted. Si desea una variable ficticia por alguna otra razón, entonces hay varias opciones. La forma más fácil (en mi humilde opinión) es utilizar model.matrix():

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

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

lo que da:

> 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 

Puede utilizar cualquiera de las columnas de dummy como una variable binaria numérica; elija la columna que desee que sea el nivel 1. dummy[,1] elige 1 como representando la clase femenina y dummy[,2] la clase masculina.

moldeada esto como un factor si se quiere que sea interpretado como un objeto contundente:

> 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 

Pero eso es derrotar el objeto del factor; ¿Qué es 0 otra vez?

9

Ty este

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 

Si desea que las etiquetas sean 0 = 1 = masculina y femenina, entonces ...

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 

En realidad no es necesario para crear una variable ficticia en para estimar un modelo utilizando lm, veamos este ejemplo:

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 

Como se puede ver ofertas R con los maniquíes bastante bien, simplemente pásalos a la fórmula como variable factor y R hará el resto por ti.

Por cierto, no hay necesidad de cambiar las categorías de c (2,1) a c (0,1), los resultados serán los mismos que se pueden ver en el ejemplo anterior.

1

Según lo sugerido por muchos más arriba, conviértalo en factor.

Si realmente desea código ficticio la variable de género, considere esto

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