Rで計量ミクロ
> ダミー変数の作成
> Rでは説明変数に因子が含まれている場合、因子を自動でダミー変数に変換してくれるのでパッケージを利用するだけであればそのままでもかまいません。しかし、計量をSTATAやEviewsといった裏で何を計算しているのかわからない怪しいソフトウェアでなく、わざわざRでやろうとするみなさんの中には行列演算を行う場合も少なくないと思います。そんな場合は自分でダミー変数を作成する必要があります。ここでsexを、MaleとFemaleという因子をもつベクトルとします。
> > levels(sex)
> [1] "Female" "Male"
> そしてこのsexという因子ベクトルからfemaleというダミー変数を作りたいとします。 ダミー変数を作成する際は、ifelseという関数を使います。R使いなら、間違ってもforで回してifで条件分岐をしようなんて考えてはいけません。ifelse関数は、ifelse(test, yes, no)となっており、testがTUREならyesを、FALSEならnoとなるようなベクトルなり行列を返してくれる関数です。この場合、testにはFemaleならTRUEを、それ以外ならFALSEとなる条件式を入れ、yesに1を、noに0を入れればいいことになります。
> > female <- ifelse(sex=="Female",1,0)
著者も書いているように,たいていのソフトでは(R も例外ではなく),sex はカテゴリーデータだよ」と宣言しておくだけで(ダミー変数なんか作らなくても)ちゃんと分析してくれる。
しかし,めんどくさいのは,3カテゴリー以上の場合だよ。2カテゴリーの場合は簡単至極。
"Female" を 1 としたいならば,
ifelse(sex=="Female",1,0) などとしなくても female <- (sex == "Female")+0 とすればよいし,
そもそも,sex が factor なのだから,female <- 2-as.integer(sex) でよい。
実地検証
> library(rbenchmark)
> test1 <- function(x) ifelse(x == "Female", 1, 0)
> test2 <- function(x) (x == "Female")+0
> test3 <- function(x) 2-as.integer(x)
> n <- 1000000
> sex <- sample(factor(c("Male", "Female")), n, replace=TRUE)
> benchmark(test1(sex), test2(sex), test3(sex), columns = c("test", "replications", "elapsed", "relative"), replications=100)
test replications elapsed relative
1 test1(sex) 100 78.399 51.680290
2 test2(sex) 100 13.794 9.092947
3 test3(sex) 100 1.517 1.000000 # 50 倍速いぜ~,わいるどだろ~
> system.time(ifelse(sex == "Female", 1, 0))
ユーザ システム 経過
0.557 0.078 0.628
> system.time((sex == "Female")+0)
ユーザ システム 経過
0.115 0.007 0.122
> system.time(2-as.integer(sex))
ユーザ システム 経過
0.01 0.00 0.01
※コメント投稿者のブログIDはブログ作成者のみに通知されます