トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

contrast coding

*disclaimer
1196845

[GLMM]

contrast coding


  • カテゴリカル変数をどう対比してコード化するか
  • デフォルトでtreatment codingになっている
  • 明示的にコーディングのことを説明する必要がある
  • sum codingのことを、contrast codingと呼ぶ人がいるが、紛らわしいのでやめるべきだとBrehm & Aldayは言っている。

 二種類のコード化

treatment coding (treatment contrast)


  • デフォルトはこちらになっている
  • 参照レベルに 0 を、もう一方に 1 をわりあてる
  • 切片は、すべて 0 の状態の値
  • 二要因ある場合、効果は、一方が 0 の時の効果を示す
    • 特定のレベル(0)の時の効果なので「単純主効果」に相当する

sum coding (sum contrasts)


  • contr.Sum() で設定する
  • 一方を -1 に、もう一方を 1 にする
    • 足すと0になる。0が平均となり、それが参照レベルとなる
  • 「参照レベル」は、各要因の平均(なので、いわゆる「主効果」となる)
    • reference levelは0となるが、0のカテゴリーがあるわけではなく、平均0がreference levelとなる。
  • 切片は、総平均(grand mean)

  • 分析結果表で、変数名に1がついているのは、主効果を意味する。
    • 切片に、その推測値を足した値がその変数全体の平均値を意味する。
      • 男女という性別の場合、男の平均値と女の平均値の真ん中の値のこととなる。

 注意すべき点

主効果を見たいのに単純主効果を調べて、それを主効果と誤解する点

  • デフォルトでは、単純主効果を調べるようになっている
    • アルファベットの早い方を「0」として「参照レベル」(比較の基準)にしている
  • 単純主効果では有意でも、主効果は有意ではないことがある。
    • 主効果としては有意ではないのに、単純主効果が有意なのを、主効果が有意だと誤解してしまう恐れがある(偽陽性 Type I error)

単純主効果だとわかってやっていれば、ある意味便利

  • 従来のANOVAだと、主効果の交互作用があった時に、さらに追加で単純主効果を調べるということをしていた
    • 最初から単純主効果が出るので、追加でしなくてよい
      • 今で言えば、あとからemmeansとかでペアごとの差を検定しなくてよい
    • しかし、逆に、主効果じたいは分かっていない状態

 Brehm and Alday (2022) Contrast coding in a decade of mixed modelsの具体例

要因A (Utensils)
要因B (Foods)

従属変数 RT(食べる速さ(分))

Utensilsの主効果はないが、単純主効果がある(食べ物による)

lme4: mixed model
car: contrastsの設定
jtools: 結果出力
kableExtra: 結果出力

  • フォークでスープを食べるには時間がかかる
  • スプーンでスパゲッティを食べるのにも時間がかかる
  • 食べる時間の速さを一般的に考えるときには、ナイフとフォークとスプーンを使った全体的での話でしょ、ということ
  • フォークでスープを食べるのに時間がかかるからと言って、食器を使うと食べるのが遅くなる、と判断してしまうのは変でしょ、ということ(部分から全体に及ぼす誤り)

contrasts() でコントラストがどうなっているか表示

  • デフォルトは、treatment codingで、0, 1
  • アルファベットの若いレベルが0で、referenceとなる
  • interceptは、ゼロのほうにセットされる。
    • この場合は、ForkでSaladの場合

contrasts(ds$Utensils)

      Spoon
Fork      0
Spoon     1

contrasts(ds$Foods)
      Soup
Salad    0
Soup     1

 参照レベルの変更


relevel(変数, ref = "新しい参照レベル")


現状確認 contrasts()
contrasts(sample.dat$Year)
##   2 3
## 1 0 0
## 2 1 0
## 3 0 1

変更
sample.dat$Year <- relevel(sample.dat$Year, ref = "2")

contrasts(sample.dat$Year)
##   1 3
## 2 0 0
## 1 1 0
## 3 0 1

2が一番上で、0, 0 となった。
  • ただし、2が一番上になったことからわかるように、2を先頭に持ってくるので、結果のグラフを描く時に、1,2,3ではなく、2,1,3という順になってしまう。
  • そもそも、順序の関係ないカテゴリーであれば問題ない。


基準とするカテゴリーの変更 base=番号


contrasts(sample.dat$Year)<-contr.treatment(3, base=2)

contrasts(sample.dat$Year)
##   1 3
## 1 1 0
## 2 0 0
## 3 0 1
  • 順序は、1,2,3で、2が基準0になっている。

 References

https://people.linguistics.mcgill.ca/~morgan/qmld-book/practical-regression-topics-1-multi-level-factors-contrast-coding-interactions.html#contrast-coding