spl*_*ter 10 r multinomial stargazer mlogit non-linear-regression
我想运行中的R多项式Logit并使用了两个库,nnet并且mlogit,其产生不同的结果和报告不同类型的统计数据.我的问题是:
什么是系数和报告标准误差之间discrepency的来源nnet和那些报道mlogit?
我想用Latex文件将结果报告给文件stargazer.这样做时,存在一个有问题的权衡:
如果我使用mlogit从那时开始的结果,我得到了我想要的统计数据,例如psuedo R平方,但输出是长格式的(见下面的例子).
如果我使用nnet那时的结果,格式是预期的,但它报告我不感兴趣的统计数据,如AIC,但不包括,例如,psuedo R平方.
我想在我使用时mlogit的格式化中报告统计数据.nnetstargazer
这是一个可重复的示例,有三种选择:
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)
Run Code Online (Sandbox Code Playgroud)
编译时的tex输出是我所说的"长格式",我认为这是不希望的:
现在,使用nnet:
library(nnet)
mlogit.model2 = multinom(y ~ 1 + col1+col2, data=mydata)
stargazer(mlogit.model2)
Run Code Online (Sandbox Code Playgroud)
给出tex输出:
这是我想要的"宽"格式.注意不同的系数和标准误差.
据我所知,有三个R封装,允许多项Logistic回归模型的估计:mlogit,nnet和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
Run Code Online (Sandbox Code Playgroud)
三个包估计的模型参数分别为:
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
Run Code Online (Sandbox Code Playgroud)
所述mlogit的命令globaltest符合模型而不使用参考结果的类别,因此,通常的参数可以如下计算:
(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
Run Code Online (Sandbox Code Playgroud)
关于三个封装中的参数的估计,这里mlogit::mlogit详细解释了所使用的方法.
在该模型与没有隐藏层,无偏置节点和一个输出SOFTMAX层一个神经网络; 在我们的例子中有3个输入单元和3个输出单元:nnet::multinom
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
Run Code Online (Sandbox Code Playgroud)
最大条件似然是multinom用于模型拟合的方法.使用最大似然
估计多项logit模型的参数,globaltest::mlogit并使用等效对数线性模型和泊松似然.这里描述了该方法.
对于由multinomMcFadden 估计的模型,伪R平方可以很容易地计算如下:
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
Run Code Online (Sandbox Code Playgroud)
此时,使用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
Run Code Online (Sandbox Code Playgroud)
结果如下:
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
Run Code Online (Sandbox Code Playgroud)
现在我正在研究最后一个问题:如何在上面的stargazer输出中可视化loglik,伪R2和其他信息.
如果您使用 stargazer,则可以使用它omit来删除不需要的行或引用。这是一个简单的例子,希望它能为您指明正确的方向。
注意。我的假设是您正在将 Rstudio 和 rmarkdown 与 knit 一起使用。
```{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"))
```
Run Code Online (Sandbox Code Playgroud)
请注意,第二个图像省略了 1:col1、2:col2、1:col2 和 2:col2