いつものパスタブログ

研究とか,Rとか

Rでロジットモデル

Rで多項ロジット,順序ロジットの最適解が何か迷っていたが,ひとまず見つかったっぽいのでメモ

二項ロジット

これは簡単で,2値のfactorを従属変数,リンク関数をglm(family = binomial('logit'))のように指定してやればOK
ちなみにbinomial('probit')にしてやればプロビット回帰になる

多項ロジット

nnet::multinomは検定とかやってくれないし,かといってmlogit::mlogitは独自のデータ形式を要求してくるので面倒くさい.ただ,nnetbroomに対応しているので,検定部分はbroomに任せることでこの問題は解決.
ということでこれからはnnetで推定→broomに放り込んで検定というのを使っていきたい

順序ロジット

MASS::polrが最有力か?ただし,data.frame形式しか受け付けていないのでtibbleのままデータを入れるとエラーになるのが難点.以前LMestで潜在移行モデルを動かした時にも似たようなことがあった.なんとかならんものか...
ちなみにpolrってなんだろうと思ったら,proportional odds logistic regression(比例オッズロジスティック回帰)の略でした.

一般化順序ロジット

平行性の仮定を一部緩めた部分比例オッズモデル(partial proportional odds model)1とかをやりたいときは,VGAM::vglmが使える.
x1,x2,x3のうち,x1だけ平行性の仮定を緩めたいときは,以下のように書く

VGAM::vglm(formula = y ~ x1 + x2 + x3, 
           family = VGAM::cumulative(parallel = FALSE ~ 1 + x1, reverse = TRUE),
           data = data) 

parallelの書き方がミソで,parallel = FALSEのあとに等値制約を緩めたいパラメタをformulaで記述する.今回の場合は切片(閾値)とx1の係数だけは各段階で異なるので~ 1 + x1と記述する.また,parallel = TRUEとすると通常の順序ロジットモデルになる.
reverseは係数の符号を反転させるオプションで,reverse = TRUEを入れるとStataのgologit2を用いた時の結果と同じになる.


  1. 教育社会学での使用例は近藤・古田(2009)とか.