裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:ダミー変数の作成

2012年06月12日 | ブログラミング

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

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ちょっと前の記事の数値が妥... | トップ | ダメ出し:数式は整理して! »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事