attach()の効果についての注意点
2011/08/04にカテゴリカル変数の順序の変更には、以下のようにすれば良いとメモしていたが、その使い方に関連して、attach()の使用に関する注意点に1つ気づいたので新たにエントリを作っておく。
Sepal.Length2 <- factor(Sepal.Length, levels=c('versicolor','virginica','setosa'))
たとえば、以下の2つのスクリプトではどうも効果を持つ範囲が違うことがわかった。
# hoge.csv:xという因子変数(値は"C"、"V"、"A")とyという因子変数(値は"0"、"1")を持つファイル dat <- read.csv("hoge.csv") attach(dat) # 1つめ x <- factor(x, levels = c("C", "V", "A")) # 2つめ dat$x <- factor(dat$x, levels = c("C", "V", "A"))
この違いについては、2つめのスクリプトを実行する前にsummary(x)、summary(dat$x)としてみれば一目瞭然となる。summary(x)では、左のように表示され、summary(dat$x)では、右のように表示される。
C | V | A | A | C | V | |
---|---|---|---|---|---|---|
12 | 12 | 6 | 6 | 12 | 12 |
つまり2つめのスクリプトを実行する前に、以下のようなロジスティック回帰をしたら、リファレンスとして値Aが選ばれてしまうということになる。
res1 <- glm(y ~ x, binomial, data = dat) summary(res1)
データセット内の変数の順序など比較的広く影響を及ぼすものに対しきちんと変更を加える場合は、attach()せず、データセットを読み込んだ直後に変更を加える方が良いということになる。
ぶっちゃけ、プログラミングの経験があって、グローバル変数とかローカル変数とかになじみが深い人からすれば当たり前っちゃー当たり前なんだろうけど、そういった経験がない人が解析用にスクリプトを書き始めたときにはそれなりに嵌まりやすい点かなぁと*1。
*1:うまくいかない!と相談を求められても気づけるかどうかは自信がない。