したがって、私のデータセットは15個の変数で構成され、そのうちの1つ(性別)には2つのレベルしかありません。ダミー変数として使いたいのですが、レベルは1と2です。どうすればいいですか?レベル0と1が欲しいのですが、Rでこれを管理する方法がわかりません!
数式インターフェイスを備えた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
とは何ですか?
これを結ぶ
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