Как сделать фиктивную переменную в R?

Итак, мой набор данных состоит из 15 переменных, одна из которых (пол) имеет только 2 уровня. Я хочу использовать его как фиктивную переменную, но уровни 1 и 2. Как мне это сделать? Я хочу иметь уровни 0 и 1, но я не знаю, как управлять этим в R!

3 ответов


С большинством инструментов моделирования R с интерфейсом формулы вам не нужно создавать фиктивные переменные, базовый код, который обрабатывает и интерпретирует формулу, сделает это за вас. Если вы хотите фиктивную переменную по какой-то другой причине, то есть несколько вариантов. Самый простой (IMHO) - использовать model.matrix():

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

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

что дает:

> 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

вы можете использовать любой столбец dummy как числовая фиктивная переменная; выберите какой столбец вы хотите быть 1на основе уровня. dummy[,1] выбирает 1 как представитель женского класса и dummy[,2] мужской класс.

приведите это как фактор, если вы хотите, чтобы он был интерпретирован как категориальный объект:

> 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

но это поражение объекта фактора; что такое 0 снова?


Ty это

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

если вы хотите, чтобы метки были 0 = мужской и 1 = женский, то...

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

на самом деле вам не нужно создавать фиктивную переменную, чтобы оценить модель с помощью lm давайте посмотрим такой пример:

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 

как вы можете видеть, R имеет дело с манекенами довольно хорошо, вы просто передаете их в формулу как factor переменная и R сделают все остальное за вас.

кстати, нет необходимости менять категории с c(2,1) в c (0,1) результаты будут такими же, как вы можете видеть в примере выше.


как было предложено многими выше, превратите его в фактор.

Если вы действительно хотите фиктивный код гендерной переменной, рассмотрите это

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