有没有办法从"glmer"对象中获得"边际效应"

Rfa*_*fan 21 r lme4 marginal-effects

我正在使用估计随机效应logit模型glmer,我想报告自变量的边际效应.对于glm模型,包mfx有助于计算边际效应.glmer对象有任何包或函数吗?

谢谢你的帮助.

下面给出了可重现的例子

mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
mydata$rank <- factor(mydata$rank) #creating ranks
id <- rep(1:ceiling(nrow(mydata)/2), times=c(2)) #creating ID variable
mydata <- cbind(mydata,data.frame(id,stringsAsFactors=FALSE)) 
set.seed(12345)
mydata$ran <- runif(nrow(mydata),0,1) #creating a random variable

library(lme4)
cfelr <- glmer(admit ~ (1 | id) + rank + gpa + ran + gre, data=mydata ,family = binomial)
summary(cfelr)
Run Code Online (Sandbox Code Playgroud)

Jul*_*ler 5

这是使用该包的方法margins()

library(margins)
library(lme4)

gm1 <- glmer(cbind(incidence, size - incidence) ~ period +
                 (1 | herd),
             data = cbpp,
             family = binomial)

m <- margins(gm1, data = cbpp)
m
Run Code Online (Sandbox Code Playgroud)


swi*_*art 1

我的解决方案没有回答问题,

\n\n

“有没有办法从对象中获取 \xe2\x80\x9cmarginal Effects\xe2\x80\x9d glmer”,

\n\n

反而,

\n\n

“有没有一种方法可以从具有一个随机截距的条件逻辑回归中获取边际逻辑回归系数?”

\n\n

我只提供这篇文章,因为提供的可重现示例是具有一个随机截距的条件逻辑回归,我打算提供帮助。请不要投反对票;如果这个答案被认为太偏离主题,我会删除。

\n\n

R 代码基于 Patrick Heagerty 的工作(点击“View Raw”查看 pdf),下面我在他的 lnMLE 包的 github 版本中包含了一个可重现的示例(请原谅安装时的警告 - 我\'硬塞帕特里克的非 CRAN 包)。我省略了除最后一行 之外的所有输出,compare该行并排显示了固定效应系数。

\n\n
library(devtools)\ninstall_github("lnMLE_1.0-2", "swihart")\nlibrary(lnMLE)\n## run the example from the logit.normal.mle help page\n## see also the accompanying document (click \'View Raw\' on page below:)\n## https://github.com/swihart/lnMLE_1.0-2/blob/master/inst/doc/lnMLEhelp.pdf\ndata(eye_race)\nattach(eye_race)\nmarg_model <- logit.normal.mle(meanmodel = value ~ black,\n                           logSigma= ~1,\n                           id=eye_race$id,\n                           model="marginal",\n                           data=eye_race,\n                           tol=1e-5,\n                           maxits=100,\n                           r=50)\nmarg_model\ncond_model <- logit.normal.mle(meanmodel = value ~ black,\n                           logSigma= ~1,\n                           id=eye_race$id,\n                           model="conditional",\n                           data=eye_race,\n                           tol=1e-5,\n                           maxits=100,\n                           r=50)\ncond_model\ncompare<-round(cbind(marg_model$beta, cond_model$beta),2)\ncolnames(compare)<-c("Marginal", "Conditional")\ncompare\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一行的输出:

\n\n
\n

比较

\n
\n\n
            Marginal Conditional\n\n(Intercept)    -2.43       -4.94\n\nblack           0.08        0.15\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了给出的可重现示例,但在 glmer 和 lnMLE 实现上都遇到了问题;再次,我只包含与比较结果和调用警告相关的输出glmer()

\n\n
##original question / answer... glmer() function gave a warning and the lnMLE did not fit well...\nmydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")\nmydata$rank <- factor(mydata$rank) #creating ranks\nid <- rep(1:ceiling(nrow(mydata)/2), times=c(2)) #creating ID variable\nmydata <- cbind(mydata,data.frame(id,stringsAsFactors=FALSE))\nset.seed(12345)\nmydata$ran <- runif(nrow(mydata),0,1) #creating a random variable\n\nlibrary(lme4)\ncfelr <- glmer(admit ~ (1 | id) + rank + gpa + ran + gre, \n               data=mydata,\n               family = binomial)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给出了:

\n\n
Warning messages:\n1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :\n  Model failed to converge with max|grad| = 0.00161047 (tol = 0.001, component 2)\n2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :\n  Model is nearly unidentifiable: very large eigenvalue\n - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio\n - Rescale variables?\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我愚蠢地继续没有重新调整,试图将其应用于logit.normal.mle给定的示例。但是,条件模型不会收敛或产生标准误差估计,

\n\n
summary(cfelr)\nlibrary(devtools)\ninstall_github("lnMLE_1.0-2", "swihart")\nlibrary(lnMLE)\n\nmydata$rank2 = mydata$rank==2\nmydata$rank3 = mydata$rank==3\nmydata$rank4 = mydata$rank==4\n\ncfelr_cond =  logit.normal.mle(meanmodel = admit ~ rank2+rank3+rank4+gpa+ran+gre, \n                               logSigma = ~1 , \n                               id=id, \n                               model="conditional", \n                               data=mydata, \n                               r=50, \n                               tol=1e-6, \n                               maxits=500)\ncfelr_cond\n\n\ncfelr_marg =  logit.normal.mle(meanmodel = admit ~ rank2+rank3+rank4+gpa+ran+gre,\n                               logSigma = ~1 , \n                               id=id, \n                               model="marginal", \n                               data=mydata, \n                               r=50, \n                               tol=1e-6, \n                               maxits=500)\ncfelr_marg\n\n\ncompare_glmer<-round(cbind(cfelr_marg$beta, cfelr_cond$beta,summary(cfelr)$coeff[,"Estimate"]),3)\ncolnames(compare_glmer)<-c("Marginal", "Conditional","glmer() Conditional")\ncompare_glmer\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中的最后一行表明,条件模型cfelr_cond没有评估条件模型,而只是返回边际系数,没有标准误差。

\n\n
>     compare_glmer\n\n            Marginal Conditional glmer() Conditional\n\n(Intercept)   -4.407      -4.407              -4.425\n\nrank2         -0.667      -0.667              -0.680\n\nrank3         -1.832      -1.833              -1.418\n\nrank4         -1.930      -1.930              -1.585\n\ngpa            0.547       0.548               0.869\n\nran            0.860       0.860               0.413\n\ngre            0.004       0.004               0.002\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望能够解决这些问题。任何帮助/评论表示赞赏。我会尽可能提供状态更新。

\n