在R中的多项式逻辑回归:nnet包中的multinom结果与mlogit包中的mlogit不同?

6

两个R函数,multinom(包nnet)和mlogit(包mlogit)都可以用于多项式 logistic 回归。但为什么这个例子返回的系数p值结果不同呢?

#准备数据

mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
mydata$rank <- factor(mydata$rank)
mydata$gre[1:10] = rnorm(10,mean=80000)

#multinom:

test = multinom(admit ~ gre + gpa + rank, data = mydata)
z <- summary(test)$coefficients/summary(test)$standard.errors
# For simplicity, use z-test to approximate t test.
pv <- (1 - pnorm(abs(z)))*2 
pv
# (Intercept)         gre         gpa       rank2       rank3       rank4 
# 0.00000000  0.04640089  0.00000000  0.00000000  0.00000000  0.00000000 

#mlogit:

mldata = mlogit.data(mydata,choice = 'admit', shape = "wide")

mlogit.model1 <- mlogit(admit ~ 1 | gre + gpa + rank, data = mldata)
summary(mlogit.model1)
# Coefficients :
#   Estimate  Std. Error t-value  Pr(>|t|)    
# 1:(intercept) -3.5826e+00  1.1135e+00 -3.2175 0.0012930 ** 
#   1:gre          1.7353e-05  8.7528e-06  1.9825 0.0474225 *  
#   1:gpa          1.0727e+00  3.1371e-01  3.4195 0.0006274 ***
#   1:rank2       -6.7122e-01  3.1574e-01 -2.1258 0.0335180 *  
#   1:rank3       -1.4014e+00  3.4435e-01 -4.0697 4.707e-05 ***
#   1:rank4       -1.6066e+00  4.1749e-01 -3.8482 0.0001190 ***

为什么multinormmlogit的p值如此不同?我猜这是因为我使用mydata$gre[1:10] = rnorm(10,mean=80000)添加了离群值。如果离群值是一个不可避免的问题(例如在基因组学、代谢组学等领域),应该使用哪个R函数?


当响应是二元的时候,为什么要估计多项式模型?如果你估计一个简单的逻辑回归GLM,你会得到与mlogit相同的结果:summary(glm(admit ~ gre + gpa + rank, data = mydata, family=binomial)) - Jason Morgan
嗨@JasonMorgan,据我所知,多项式逻辑回归是二项式逻辑回归的扩展。因此,使用多项式程序处理二元依赖变量应该是可行的。在这个问题中,我旨在找出为什么两个R函数用于多项式程序会给出两个不同的结果,尽管它们使用相同的样本(虽然样本具有二元结果)。 - WCMC
2
如果按照nnet函数的建议对数据进行缩放,您将获得相同的标准误差。 - Jason Morgan
真的!我没注意到它! - WCMC
2个回答

4
作为替代方案,您可以使用 broom,它可以输出 multinom 类模型的整洁格式。
library(broom)

tidy(test)

它将返回一个包含z统计量和p值的data.frame。查看tidy文档以获取更多信息。

附言:由于我无法从您发布的链接获取数据,因此无法复制结果


3
这里的区别在于 Wald $z$ 检验(即你在 pv 中计算的内容)和似然比检验(即 summary(mlogit.model) 返回的结果)之间的区别。Wald 检验计算较为简单,但通常具有较少理想的性质(例如,其置信区间不是标度不变的)。您可以在此处阅读有关这两个过程的更多信息。
要对您的 nnet 模型系数执行 LR 检验,您可以加载 carlmtest 包,并调用 Anova(test)(尽管您需要为单个 df 测试做一些更多的工作)。

1
好的参考资料!谢谢。 - WCMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接