Как сделать фиктивную переменную в 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