r lme4 marginal-effects

¿Hay una manera de obtener "efectos marginales" de un objeto ''glmer''



lme4 marginal-effects (3)

Estoy estimando el modelo logit de efectos aleatorios utilizando glmer y me gustaría informar Efectos marginales para las variables independientes. Para los modelos glm , el paquete mfx ayuda a calcular los efectos marginales. ¿Hay algún paquete o función para objetos glmer ?

Gracias por tu ayuda.

Un ejemplo reproducible se da a continuación.

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)


Esta es una respuesta mucho menos técnica, pero quizás proporciona un recurso útil. Soy un fan del paquete sjPlot que proporciona gráficos de efectos marginales de objetos glmer, como por ejemplo:

library(sjPlot) sjp.glmer(cfelr, type = "eff")

El paquete ofrece muchas opciones para explorar también los efectos fijos y aleatorios de un modelo glmer. https://github.com/strengejacke/sjPlot

Saludos ben


Mi solución no responde a la pregunta,

"¿Hay una manera de obtener" efectos marginales "de un objeto glmer ",

sino mas bien

"¿Hay alguna forma de obtener coeficientes de regresión logística marginal de una regresión logística condicional con una intersección aleatoria?"

Solo ofrezco este informe porque el ejemplo reproducible proporcionado fue una regresión logística condicional con una intercepción aleatoria y tengo la intención de ser útil. Por favor, no votes abajo; Voy a anotar si esta respuesta se considera demasiado fuera de tema.

El código R se basa en el trabajo de Patrick Heagerty (haga clic en "Ver sin procesar" para ver el pdf) , e incluyo un ejemplo reproducible a continuación de mi versión github de su paquete lnMLE (disculpe las advertencias en la instalación. El paquete de Patrick no CRAN). Estoy omitiendo la salida para todos excepto la última línea, compare , que muestra los coeficientes de efectos fijos de lado a lado.

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

La salida de la última línea:

comparar

Marginal Conditional (Intercept) -2.43 -4.94 black 0.08 0.15

Intenté el ejemplo reproducible dado, pero tuve problemas con las implementaciones glmer y lnMLE; de nuevo, solo glmer() la salida correspondiente a los resultados de comparación y las advertencias de la llamada glmer() :

##original question / answer... glmer() function gave a warning and the lnMLE did not fit well... 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)

El cual dio

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

pero tontamente seguí sin logit.normal.mle a logit.normal.mle , tratando de aplicar el logit.normal.mle al ejemplo dado. Sin embargo, el modelo condicional no converge ni produce estimaciones de error estándar,

summary(cfelr) library(devtools) install_github("lnMLE_1.0-2", "swihart") library(lnMLE) mydata$rank2 = mydata$rank==2 mydata$rank3 = mydata$rank==3 mydata$rank4 = mydata$rank==4 cfelr_cond = logit.normal.mle(meanmodel = admit ~ rank2+rank3+rank4+gpa+ran+gre, logSigma = ~1 , id=id, model="conditional", data=mydata, r=50, tol=1e-6, maxits=500) cfelr_cond cfelr_marg = logit.normal.mle(meanmodel = admit ~ rank2+rank3+rank4+gpa+ran+gre, logSigma = ~1 , id=id, model="marginal", data=mydata, r=50, tol=1e-6, maxits=500) cfelr_marg compare_glmer<-round(cbind(cfelr_marg$beta, cfelr_cond$beta,summary(cfelr)$coeff[,"Estimate"]),3) colnames(compare_glmer)<-c("Marginal", "Conditional","glmer() Conditional") compare_glmer

La última línea de la cual revela que el modelo condicional de cfelr_cond no evaluó un modelo condicional, solo devolvió los coeficientes marginales y no los errores estándar.

> compare_glmer Marginal Conditional glmer() Conditional (Intercept) -4.407 -4.407 -4.425 rank2 -0.667 -0.667 -0.680 rank3 -1.832 -1.833 -1.418 rank4 -1.930 -1.930 -1.585 gpa 0.547 0.548 0.869 ran 0.860 0.860 0.413 gre 0.004 0.004 0.002

Espero poder solucionar estos problemas. Cualquier ayuda / comentario apreciado. Daré actualizaciones de estado cuando pueda.


Podría usar el ggeffects-package (ejemplos en las package-vignettes ). Entonces, para tu código, esto podría verse así:

library(ggeffects) # dat is a data frame with marginal effects dat <- ggpredict(cfelr, term = "rank") plot(dat)

o usa, como describió Benjamin, el Podía usar sjPlot-package , usando la función plot_model() con plot-type "pred" (esto simplemente envuelve el paquete ggeffects para diagramas de efectos marginales):

library(sjPlot) plot_model(cfelr, type = "pred", term = "rank")