2012-10-11 11 views
6

Mój zestaw danych składa się z 15 zmiennych, jedna z nich (płeć) ma tylko 2 poziomy. Chcę użyć go jako sztucznej zmiennej, ale poziomy to 1 i 2. Jak to zrobić? Chcę mieć poziomy 0 i 1, ale nie wiem jak to zarządzać w R!Jak utworzyć obojętną zmienną w R?

+1

Wygląda na to pytanie poprosiłem tutaj: http://stackoverflow.com/questions/11970611/convert-a-vector-into -logiczna-matryca – Chase

+3

Jeśli zmienisz ją na współczynnik i umieścisz w modelu R, zajmie się ona brudną pracą dla ciebie. –

+0

@ TylerRinker Dla lm i aov tak jest i być może dla innych, ale nie zawsze. Używam daisy i nie robi tego automatycznie: Błąd w daisy (train.X, metric = "gower", type = list (symm = 1: symm_bin_len)): co najmniej jedna zmienna binarna ma więcej niż 2 poziomy . – JStrahl

Odpowiedz

20

W przypadku większości narzędzi do modelowania R za pomocą interfejsu formuły nie ma potrzeby tworzenia fałszywych zmiennych, kod źródłowy, który obsługuje i interpretuje formułę, zrobi to za Ciebie. Jeśli chcesz mieć zmienną dummy z jakiegoś innego powodu, istnieje kilka opcji. Najprostszym (IMHO) jest użycie model.matrix():

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

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

co daje:

> 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 

można użyć kolumny dummy postaci numerycznej zmiennej manekina; wybierz kolumnę, która ma być poziomem bazowym 1. dummy[,1] wybiera 1 jako przedstawiciela klasy kobiet i dummy[,2] klasy męskiej.

Obsada to jako czynnik, jeśli ma to być interpretowane jako kategorycznego obiektu:

> 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 

Ale to jest pokonanie przedmiot czynnika; co to jest 0 ponownie?

9

Ty to

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 

Jeśli chcesz etykiety być 0 = 1 = Mężczyzna i Kobieta, potem ...

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 

Właściwie nie trzeba utworzyć zmienną manekina w aby oszacować model używając lm, zobaczmy ten przykład:

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 

Jak widać promocje R z manekinami całkiem dobrze, po prostu przekazujesz je do formuły jako zmienną factor, a R zrobi dla ciebie resztę.

Nawiasem mówiąc, nie ma potrzeby zmiany kategorii z c (2,1) na c (0,1), wyniki będą takie same jak w powyższym przykładzie.

1

Zgodnie z sugestiami wielu z powyższych, należy go zmienić na współczynnik.

Jeśli naprawdę chcesz do kodu manekina zmiennej płci, należy rozważyć ten

set.seed(100) 
gender = rbinom(100,1,0.5)+1 
gender_dummy = gender-1 
Powiązane problemy