R function to calculate first differences after a Bayesian logit or probit model. First differences are a method to summarize effects across covariates. This quantity represents the difference in predicted probabilities for each covariate for cases with low and high values of the respective covariate. For each of these differences, all other variables are held constant at their median. For more, see Long (1997, Sage Publications) and King, Tomz, and Wittenberg (2000, American Journal of Political Science 44(2): 347-361).

mcmcFD(modelmatrix, mcmcout, link = "logit", ci = c(0.025, 0.975), percentiles = c(0.25, 0.75), fullsims = FALSE)

modelmatrix | model matrix, including intercept (if the intercept is among the
parameters estimated in the model). Create with model.matrix(formula, data).
Note: the order of columns in the model matrix must correspond to the order of columns
in the matrix of posterior draws in the |
---|---|

mcmcout | posterior distributions of all logit coefficients,
in matrix form. This can be created from rstan, MCMCpack, R2jags, etc. and transformed
into a matrix using the function as.mcmc() from the coda package for |

link | type of generalized linear model; a character vector set to |

ci | the bounds of the credible interval. Default is |

percentiles | values of each predictor for which the difference in Pr(y = 1)
is to be calculated. Default is |

fullsims | logical indicator of whether full object (based on all MCMC draws
rather than their average) will be returned. Default is |

if `fullsims = FALSE`

(default), a data frame with four columns:

median_fd: median first difference

lower_fd: lower bound of credible interval of the first difference

upper_fd: upper bound of credible interval of the first difference

VarName: name of the variable as found in

`modelmatrix`

VarID: identifier of the variable, based on the order of columns in

`modelmatrix`

and`mcmcout`

. Can be adjusted for plotting

if `fullsims = TRUE`

, a data frame with as many columns as predictors in the model. Each row
is the first difference for that variable based on one set of posterior draws. Column names are taken
from the column names of `modelmatrix`

.

King, Gary, Michael Tomz, and Jason Wittenberg. 2000. “Making the Most of Statistical Analyses: Improving Interpretation and Presentation.” American Journal of Political Science 44 (2): 347–61. http://www.jstor.org/stable/2669316

Long, J. Scott. 1997. Regression Models for Categorical and Limited Dependent Variables. Thousand Oaks: Sage Publications

.old_wd <- setwd(tempdir()) # \donttest{ ## simulating data set.seed(123456) b0 <- 0.2 # true value for the intercept b1 <- 0.5 # true value for first beta b2 <- 0.7 # true value for second beta n <- 500 # sample size X1 <- runif(n, -1, 1) X2 <- runif(n, -1, 1) Z <- b0 + b1 * X1 + b2 * X2 pr <- 1 / (1 + exp(-Z)) # inv logit function Y <- rbinom(n, 1, pr) data <- data.frame(cbind(X1, X2, Y)) ## formatting the data for jags datjags <- as.list(data) datjags$N <- length(datjags$Y) ## creating jags model model <- function() { for(i in 1:N){ Y[i] ~ dbern(p[i]) ## Bernoulli distribution of y_i logit(p[i]) <- mu[i] ## Logit link function mu[i] <- b[1] + b[2] * X1[i] + b[3] * X2[i] } for(j in 1:3){ b[j] ~ dnorm(0, 0.001) ## Use a coefficient vector for simplicity } } params <- c("b") inits1 <- list("b" = rep(0, 3)) inits2 <- list("b" = rep(0, 3)) inits <- list(inits1, inits2) ## fitting the model with R2jags set.seed(123) fit <- R2jags::jags(data = datjags, inits = inits, parameters.to.save = params, n.chains = 2, n.iter = 2000, n.burnin = 1000, model.file = model)#> Compiling model graph #> Resolving undeclared variables #> Allocating nodes #> Graph information: #> Observed stochastic nodes: 500 #> Unobserved stochastic nodes: 3 #> Total graph size: 3506 #> #> Initializing model #>## running function with logit xmat <- model.matrix(Y ~ X1 + X2, data = data) mcmc <- coda::as.mcmc(fit) mcmc_mat <- as.matrix(mcmc)[, 1:ncol(xmat)] object <- mcmcFD(modelmatrix = xmat, mcmcout = mcmc_mat) object#> median_fd lower_fd upper_fd VarName VarID #> X1 0.1279803 0.04797413 0.2021423 X1 1 #> X2 0.1613502 0.08375733 0.2381197 X2 2