Есть ли способ получить "маргинальные эффекты" от объекта "glmer"

Я оцениваю логическую модель случайных эффектов с помощью 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)

Ответы

Ответ 1

Это гораздо менее технический ответ, но, возможно, полезный ресурс. Я являюсь поклонником пакета sjPlot, который предоставляет графики маргинальных эффектов объектов glmer, например:

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

В пакете предусмотрено множество опций для изучения фиксированных и случайных эффектов модели ярдов. https://github.com/strengejacke/sjPlot

Cheers, Бен

Ответ 2

Вы можете использовать ggeffects-package (примеры в пакет-виньетка). Итак, для вашего кода это может выглядеть так:

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

или вы используете, как описано в Benjamin, вы можете использовать sjPlot-package, используя функцию plot_model() с типом графика "pred" (это просто обертывает пакет ggeffects для графиков предельных эффектов):

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

Ответ 3

Мое решение не отвечает на вопрос,

"Есть ли способ получить" маргинальные эффекты "от объекта glmer",

но,

"Есть ли способ получить маргинальные логистические коэффициенты регрессии из условной логистической регрессии с одним случайным перехватом?"

Я предлагаю эту запись, потому что воспроизводимый пример был условной логистической регрессией с одним случайным перехватом, и я намереваюсь быть полезным. Пожалуйста, не уменьшайте; Я сниму, если этот ответ будет считаться слишком неактивным.

R-код основан на работе Патрика Хигерти (нажмите "Просмотреть сырье" , чтобы увидеть pdf), и я включаю воспроизводимый пример ниже из моей версии github его пакета lnMLE (извините предупреждения при установке - я делаю показ пакета Patrick non-CRAN). Я опускаю вывод для всех, кроме последней строки, compare, который показывает коэффициенты фиксированного эффекта бок о бок.

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

Вывод последней строки:

сравнить

            Marginal Conditional

(Intercept)    -2.43       -4.94

black           0.08        0.15

Я попытался воспроизвести воспроизводимый пример, но имел проблемы как с реализацией glmer, так и с lnMLE; снова я включаю только вывод, относящийся к результатам сравнения, и предупреждения из вызова 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)

Что дало:

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?

но я безрассудно продолжал без масштабирования, пытаясь применить logit.normal.mle к приведенному примеру. Однако условная модель не сходится или не дает стандартных оценок ошибок,

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

Последняя строка показывает, что условная модель из cfelr_cond не оценивала условную модель, а только возвращала предельные коэффициенты и стандартные ошибки.

>     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

Я надеюсь сгладить эти проблемы. Любая помощь/комментарии оцениваются. Я дам обновления статуса, когда смогу.