Est-il un moyen d'obtenir des "effets marginaux" de un " glmer` objet

j'estime le modèle logit à effets aléatoires en utilisant glmer et je tiens à signaler les Effets Marginaux pour les variables indépendantes. glm modèles, paquet mfx aide à calculer les effets marginaux. Y a-t-il un paquet ou une fonction pour glmer objets?

Merci pour votre aide.

un exemple reproductible est donné ci-dessous

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)
17
demandé sur Rfan 2014-06-12 09:42:14

3 réponses

C'est une réponse beaucoup moins technique, mais peut-être fournit une ressource utile. Je suis un fan de l' sjPlot paquet qui fournit des tracés des effets marginaux des objets glmer, comme so:

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

le paquet fournit beaucoup d'options pour explorer les effets fixes et aléatoires d'un modèle glmer aussi bien. https://github.com/strengejacke/sjPlot

Cheers, Ben

1
répondu Benjamin Gowan 2017-10-21 22:38:17

vous pourriez utiliser le ggeffects-paquet (exemples dans le package-vignettes). Donc, pour votre code, cela pourrait ressembler à ceci:

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

ou que vous utilisez, que Benjamin décrit, Vous pouvez utiliser le sjPlot-package, en utilisant le plot_model() fonction avec l'intrigue de type "pred" (ceci enroule simplement le paquet ggeffects pour les tracés à effet marginal):

library(sjPlot)
plot_model(cfelr, type = "pred", term = "rank")
1
répondu Daniel 2017-10-23 14:46:44

ma solution ne répond pas à la question,

"Est-il un moyen d'obtenir des "effets marginaux" à partir d'un glmer objet",

mais plutôt,

"Est-il un moyen d'obtenir marginal de la logistique des coefficients de régression à partir d'une régression logistique conditionnelle avec un intercept aléatoire?"

Je n'offre ce relevé que parce que l'exemple reproductible fourni était une régression logistique conditionnelle avec une interception aléatoire et je suis ayant l'intention d'être utile. S'il vous plaît ne pas baisser la note; je retirerai si cette réponse est jugée trop hors sujet.

le code R est basé sur le travail de Patrick Heagerty (cliquez sur "View Raw" pour voir pdf), et j'inclus un exemple reproductible ci-dessous de ma version github de son paquet inmle (excuse the warnings at installation -- i'm shoehorning Patrick's non-CRAN package). J'Omets la sortie pour tous sauf la dernière ligne,compare, ce qui montre l'effet fixe coefficients côte à côte.

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 sortie de La dernière ligne:

comparer

            Marginal Conditional

(Intercept)    -2.43       -4.94

black           0.08        0.15

j'ai essayé l'exemple reproductible donné, mais j'ai eu des problèmes avec les implémentations glmer et lnMLE; encore une fois, je n'inclus que les sorties relatives aux résultats de comparaison et les avertissements de glmer() appel:

##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)

Qui a donné:

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?

mais j'ai bêtement continué sans changer, en essayant pour appliquer l' logit.normal.mle pour l'exemple donné. Cependant, le modèle conditionnel ne converge pas et ne produit pas des estimations d'erreur standard,

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

dont la dernière ligne révèle que le modèle conditionnel de cfelr_cond n'ont pas évalué un modèle conditionnel mais ont simplement retourné les coefficients marginaux et aucune erreur-type.

>     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

j'espère régler ces problèmes. Toute aide / commentaire apprécié. Je ferai des mises à jour quand je pourrai.

0
répondu swihart 2014-08-28 17:51:02