Hi all,
To be able to modify the plot at will I want reproduce the plot obtained with:
plot(marginal_effects(MODEL_NAME), points=T)
As an example I used the data from
https://stats.idre.ucla.edu/r/dae/zip/
https://stats.idre.ucla.edu/stat/data/fish.csv
deleting a couple of extreme points for plot purposes:
fish<-read.csv(“https://stats.idre.ucla.edu/stat/data/fish.csv”)
fish$camper<-as.factor(fish$camper)
fish<-subset(fish, count!=149 & count!=65)
I ran the following ZERO-INFLATED model
mod_pois_zero = brms::brm(count ~ child + camper +(1| persons),
control = list(adapt_delta = 0.999, max_treedepth = 12),
iter = 6000,
cores = 4,
data = fish,
family = “zero_inflated_poisson”,
file=“mod_pois”)
I wrote the following script to plot estimate and raw data as for marginal_effects:
#extract posterior samples
d<-posterior_samples(mod_pois)
#select the variable(s) you want to plot
d_sub<-d[,c("b_Intercept", "b_child")]
#transform it to a matrix
d_sub1<-as.matrix(d_sub)
# to plot my simulation I have to extract the effect and add them to my original dataset
newdat<-data.frame(b_child = seq(-0,3, by = 0.025))
#if you choose the same length of your database you can add it easily
#put the entire range of your data
#create the matrix you are going to fill
Xmat <-model.matrix(~ b_child, data=newdat)
fitmat<-matrix(ncol=nrow(d), nrow=nrow(newdat))
#Fill the matrix
for(i in 1:nrow(d)) fitmat[,i] <- exp(Xmat%*%d_sub1[i,]) #poisson model
#for(i in 1:nrow(d)) fitmat[,i] <- Xmat%*%d_sub1[i,] #gaussian model
#add the credible interval and fit
newdat$lower<- apply(fitmat,1,quantile, prob=0.025)
newdat$upper<-apply(fitmat, 1, quantile, prob=0.975)
newdat$fit<-apply(fitmat, 1, quantile, prob=0.5)
#newdat$fit<-exp(Xmat%*% fixef(mod_pois)) #fixef does not work in brms
#now you can either merge newdat with your original database or plot them directly
plot(fish$count ~fish$child,
xlab =("b"), ylab = ("a"))
lines(newdat$b_child, newdat$fit, lwd=2)
lines(newdat$b_child, newdat$lower)
lines(newdat$b_child, newdat$upper)
the script works fine for norm and poisson models but the estimates with zero_inflated are wrong.
How can I back-transform zero inflated models? clearly exp()
is not enough.
Where can I find this information for the rest of the link functions ( e.g. skew normal, etc.)?
On a different note, the default plot plot(marginal_effects(MODEL), points=T)
always cut the extreme points, any idea why?
Also if someone has a better strategy to plot raw data and estimates from brms I would be glad to know. Online I could not find any example that I was able to reproduce.
Thanks and best regards