web-dev-qa-db-ja.com

Rの多項ロジット:mlogitとnnet

Rで多項ロジットを実行したいのですが、2つのライブラリ nnetmlogit を使用しました。これらは、異なる結果を生成し、異なるレポートを作成します。統計の種類。私の質問は次のとおりです。

  1. nnetによって報告された係数と標準誤差とmlogitによって報告されたものとの間の不一致の原因は何ですか?

  2. Latexを使用して結果をstargazerファイルに報告したいと思います。そうする場合、問題のあるトレードオフがあります。

    • mlogitの結果を使用すると、疑似Rの二乗など、必要な統計が得られますが、出力は長い形式になります(以下の例を参照)。

    • nnetの結果を使用すると、形式は期待どおりですが、AICなどの興味のない統計が報告されますが、たとえば、疑似決定係数は含まれません。

    mlogitを使用するときに、nnetの形式でstargazerによって統計が報告されるようにしたいと思います。

これは再現可能な例であり、3つの選択肢があります。

library(mlogit)

df = data.frame(c(0,1,1,2,0,1,0), c(1,6,7,4,2,2,1), c(683,276,756,487,776,100,982))
colnames(df) <- c('y', 'col1', 'col2')
mydata = df

mldata <- mlogit.data(mydata, choice="y", shape="wide")
mlogit.model1 <- mlogit(y ~ 1| col1+col2, data=mldata)

コンパイルされたときのtex出力は、私が「ロングフォーマット」と呼んでいるものであり、これは望ましくないと思います。

enter image description here

ここで、nnetを使用します。

library(nnet)
mlogit.model2 = multinom(y ~ 1 + col1+col2, data=mydata)
stargazer(mlogit.model2)

Tex出力を提供します:

enter image description here

これは私が望む「ワイド」フォーマットです。異なる係数と標準誤差に注意してください。

10
splinter

私の知る限り、多項ロジスティック回帰モデルの推定を可能にする3つのRパッケージがあります:mlogitnnet、およびglobaltest(Bioconductorから)。ここでは、mnlogitのより高速で効率的な実装であるmlogitパッケージについては考慮していません。
上記のパッケージはすべて異なるアルゴリズムを使用しており、小さなサンプルの場合、異なる結果が得られます。これらの違いは、中程度のサンプルサイズでは消えます(n <- 100で試してください)。
James Keirsteadのブログ から取得した次のデータ生成プロセスを検討してください。

n <- 40
set.seed(4321)
df1 <- data.frame(x1=runif(n,0,100), x2=runif(n,0,100))
df1 <- transform(df1, y=1+ifelse(100 - x1 - x2 + rnorm(n,sd=10) < 0, 0,
      ifelse(100 - 2*x2 + rnorm(n,sd=10) < 0, 1, 2)))
str(df1)
'data.frame':   40 obs. of  3 variables:
 $ x1: num  33.48 90.91 41.15 4.38 76.35 ...
 $ x2: num  68.6 42.6 49.9 36.1 49.6 ...
 $ y : num  1 1 3 3 1 1 1 1 3 3 ...
table(df1$y)
 1  2  3 
19  8 13 

3つのパッケージによって推定されたモデルパラメータはそれぞれ次のとおりです。

library(mlogit)
df2 <- mlogit.data(df1, choice="y", shape="wide")
mlogit.mod <- mlogit(y ~ 1 | x1+x2, data=df2)
(mlogit.cf <- coef(mlogit.mod))

2:(intercept) 3:(intercept)          2:x1          3:x1          2:x2          3:x2 
   42.7874653    80.9453734    -0.5158189    -0.6412020    -0.3972774    -1.0666809 
#######
library(nnet)
nnet.mod <- multinom(y ~ x1 + x2, df1)
(nnet.cf <- coef(nnet.mod))

  (Intercept)         x1         x2
2    41.51697 -0.5005992 -0.3854199
3    77.57715 -0.6144179 -1.0213375
#######
library(globaltest)
glbtest.mod <- globaltest::mlogit(y ~ x1+x2, data=df1)
(cf <- glbtest.mod@coefficients)

                      1          2          3
(Intercept) -41.2442934  1.5431814 39.7011119
x1            0.3856738 -0.1301452 -0.2555285
x2            0.4879862  0.0907088 -0.5786950

mlogitglobaltestコマンドは、参照結果カテゴリを使用せずにモデルに適合します。したがって、通常のパラメーターは次のように計算できます。

(glbtest.cf <- rbind(cf[,2]-cf[,1],cf[,3]-cf[,1]))
     (Intercept)         x1         x2
[1,]    42.78747 -0.5158190 -0.3972774
[2,]    80.94541 -0.6412023 -1.0666813

3つのパッケージのパラメータの推定に関して、mlogit::mlogitで使用される方法が詳細に説明されています ここ
nnet::multinomでは、モデルは隠れ層、バイアスノード、ソフトマックス出力層のないニューラルネットワークです。この場合、3つの入力ユニットと3つの出力ユニットがあります。

nnet:::summary.nnet(nnet.mod)
a 3-0-3 network with 12 weights
options were - skip-layer connections  softmax modelling 
 b->o1 i1->o1 i2->o1 i3->o1 
  0.00   0.00   0.00   0.00 
 b->o2 i1->o2 i2->o2 i3->o2 
  0.00  41.52  -0.50  -0.39 
 b->o3 i1->o3 i2->o3 i3->o3 
  0.00  77.58  -0.61  -1.02

最大条件付き尤度は、モデルフィッティングのためにmultinomで使用される方法です。
多項ロジットモデルのパラメーターは、最尤法を使用し、同等の対数線形モデルとポアソン尤度を使用してglobaltest::mlogitで推定されます。メソッドについて説明します ここ

multinomで推定されたモデルの場合、McFaddenの疑似決定係数は次のように簡単に計算できます。

nnet.mod.loglik <- nnet:::logLik.multinom(nnet.mod)
nnet.mod0 <- multinom(y ~ 1, df1)
nnet.mod0.loglik <- nnet:::logLik.multinom(nnet.mod0)
(nnet.mod.mfr2 <- as.numeric(1 - nnet.mod.loglik/nnet.mod0.loglik))
[1] 0.8483931

この時点で、stargazerを使用して、mlogit::mlogitによって推定されたモデルのレポートを生成します。これは、multinomのレポートと可能な限り類似しています。
基本的な考え方は、multinomによって作成されたオブジェクトの推定された係数と確率を対応するmlogitの推定値に置き換えることです。

# Substitution of coefficients
nnet.mod2 <- nnet.mod
cf <- matrix(nnet.mod2$wts, nrow=4)
cf[2:nrow(cf), 2:ncol(cf)] <- t(matrix(mlogit.cf,nrow=2))
# Substitution of probabilities
nnet.mod2$wts <- c(cf)
nnet.mod2$fitted.values <- mlogit.mod$probabilities

結果は次のとおりです。

library(stargazer)
stargazer(nnet.mod2, type="text")

==============================================
                      Dependent variable:     
                  ----------------------------
                        2              3      
                       (1)            (2)     
----------------------------------------------
x1                   -0.516**      -0.641**   
                     (0.212)        (0.305)   

x2                   -0.397**      -1.067**   
                     (0.176)        (0.519)   

Constant             42.787**      80.945**   
                     (18.282)      (38.161)   

----------------------------------------------
Akaike Inf. Crit.     24.623        24.623    
==============================================
Note:              *p<0.1; **p<0.05; ***p<0.01

現在、私は最後の問題に取り組んでいます。上記のstargazer出力でloglik、疑似R2、およびその他の情報を視覚化する方法です。

9
Marco Sandri

Stargazerを使用している場合は、omitを使用して不要な行または参照を削除できます。ここに簡単な例があります、うまくいけば、それはあなたを正しい方向に向けるでしょう。

nb。私の仮定は、knitrでRstudioとrmarkdownを使用していることです。

```{r, echo=FALSE}
library(mlogit)

df = data.frame(c(0,1,1,2,0,1,0), c(1,6,7,4,2,2,1), c(683,276,756,487,776,100,982))
colnames(df) <- c('y', 'col1', 'col2')
mydata = df

mldata <- mlogit.data(mydata, choice = "y", shape="wide")
mlogit.model1 <- mlogit(y ~ 1| col1+col2, data=mldata)
mlogit.col1 <- mlogit(y ~ 1 | col1, data = mldata)
mlogit.col2 <- mlogit(y ~ 1 | col2, data = mldata)

```

# MLOGIT

```{r echo = FALSE, message = TRUE, error = TRUE, warning = FALSE, results = 'asis'}
library(stargazer)
stargazer(mlogit.model1, type = "html")
stargazer(mlogit.col1, 
          mlogit.col2,
          type = "html",
          omit=c("1:col1","2:col1","1:col2","2:col2"))


```

結果:

enter image description here

2番目の画像では1:col1、2:col2、1:col2、2:col2が省略されていることに注意してください

enter image description here

2
Technophobe01