web-dev-qa-db-ja.com

Rでダミー変数を作成するにはどうすればよいですか?

したがって、私のデータセットは15個の変数で構成され、そのうちの1つ(性別)には2つのレベルしかありません。ダミー変数として使いたいのですが、レベルは1と2です。どうすればいいですか?レベル0と1が欲しいのですが、Rでこれを管理する方法がわかりません!

7
lisa

数式インターフェイスを備えた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とは何ですか?

22
Gavin Simpson

これを結ぶ

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)に変更する必要はありません。結果は、上記の例と同じになります。

9
Jilber Urbina

上記の多くの人が示唆しているように、それを因数分解します。

本当に性別変数をダミーコード化したい場合は、これを検討してください

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