# Chapter A03: Methods available in glmbayes

#### Kjell Nygren

#### 2026-07-19

The glmb function and related method functions that handle the output are designed to be Bayesian versions of the glm function and many of its method functions. This vignette shows how the basic setup/calling of the functions compare and then walks through how the method functions for glmb can be called to generate similar outputs to those from the glm functions. GLM background is standard (McCullagh and Nelder 1989; Venables and Ripley 2002); the glmb interface parallels glm as described in (Hastie and Pregibon 1992).

Dobson Randomized Control Data

To understand how the outputs of the glmb function mirrors those for the glm function, it is useful to take a look at the first portion of the example that is provided with the glm function. The data are randomized controlled trial counts from (Dobson 1990). Here is a view of the data:

    ## Dobson (1990) Page 93: Randomized Controlled Trial :
    counts <- c(18,17,15,20,10,20,25,13,12)
    outcome <- gl(3,1,9)
    treatment <- gl(3,3)
    print(d.AD <- data.frame(treatment, outcome, counts))
    #>   treatment outcome counts
    #> 1         1       1     18
    #> 2         1       2     17
    #> 3         1       3     15
    #> 4         2       1     20
    #> 5         2       2     10
    #> 6         2       3     20
    #> 7         3       1     25
    #> 8         3       2     13
    #> 9         3       3     12

Calling the two functions

The example code for the glm function specifies a Poisson regression model for this data. The below code chunks shows how the glmb function can be used in much the same fashion but with some extra requirements. In particular, we need to provide a prior distribution (in this case a Multivariate Normal prior) and related constants (in this case, a prior Mean and and a prior Variance-Covariance matrix) for the coefficients of interest. Optionally, we can also tell the function how many draws to make from the posterior distribution (the default used here generates 1000 iid draws).

Here is the call to the classical glm function:

    ## Call to glm
    glm.D93 <- glm(counts ~ outcome + treatment,
                  family = poisson())

To use the glmb function, we first use a call to a function Prior_Setup to initialize the prior and to get the variable names needed. We use the default prior from the Prior_Setup function (discussed further in a separate vignette).

    ## Using glmb
    ## Step 1: Set up Default Prior
    ps=Prior_Setup(counts ~ outcome + treatment,family=poisson())
    #> Using default pwt = 0.01 (low-d default).
    mu=ps$mu
    V=ps$Sigma

We now call the glmb function and include the default prior distribution in addition to the two required arguments for the glm function.

    # Step 3: Call the glmb function
    glmb.D93<-glmb(counts ~ outcome + treatment, family=poisson(), pfamily=dNormal(mu=mu,Sigma=V))

In the above, it is worth noting the additional step that we went through when specifying the prior. We used a call to the function Prior_Setup to get the correct dimensions for the mean and variance-covariance matrices and to initialize the constants. The Prior_Setup function also provided information on the Variable names in the design matrix (which also corresponds to the names of the coefficients eventually estimated) so we can make informed changes to the prior if so desired.

The next couple of vignette’s will discuss the prior specification in more details. Here we instead focus on reviewing the output from the function and how it can be used.

Printing the output

Taking a look at the basic printed output, we can see that the two closely mirror each other with the glmb posterior means replacing the glm maximum likelihood estimates.

    ## Printed view of the output from the glm function
    print(glm.D93)
    #>
    #> Call:  glm(formula = counts ~ outcome + treatment, family = poisson())
    #>
    #> Coefficients:
    #> (Intercept)     outcome2     outcome3   treatment2   treatment3
    #>   3.045e+00   -4.543e-01   -2.930e-01    1.218e-15    8.438e-16
    #>
    #> Degrees of Freedom: 8 Total (i.e. Null);  4 Residual
    #> Null Deviance:       10.58
    #> Residual Deviance: 5.129     AIC: 56.76
    ## Printed view of the output from the glmb function
    print(glmb.D93)
    #>
    #> Call:  glmb(formula = counts ~ outcome + treatment, family = poisson(),
    #>     pfamily = dNormal(mu = mu, Sigma = V))
    #>
    #> Posterior Mean Coefficients:
    #> (Intercept)     outcome2     outcome3   treatment2   treatment3
    #>    3.029601    -0.458632    -0.294486     0.006827     0.002622
    #>
    #> Effective Number of Parameters: 5.039209
    #> Expected Residual Deviance: 10.19683
    #> DIC: 56.86822

In addition to the posterior means, the glmb printed output also returned three pieces of information that are similar to (but not quite the same) as the classical output. The “Effective Number of Parameters” should in general be close to (but not exactly the same) as the number of parameters estimated while the Expected Residual Deviance in general will be higher than the corresponding maximum likelihood estimate for the Residual Deviance (since the latter is designed to minimize it). Finally, the DIC is essentially a Bayesian version of the AIC. These measures will be discussed in greater detail in one of our later vignettes.

Methods Available

In addition to the basic print function output, the glmb function returns an object with an assigned class “glmb” for which a number of generic functions (or methods) are available. The class “glmb” inherits from “glm” and “lm” and as such many functions for those classes work directly for “glmb”. For some of the instances where the inherited methods fail and/or could produce incorrect results, we have implemented methods specifically for the glmb class. The methods for classes lm, glm, and glmb are listed below. We will use many of these later in this vignette.

    ## Methods for class "lm"
    methods(class="lm")
    #>  [1] add1             addterm          alias            anova
    #>  [5] boxcox           case.names       coerce           confint
    #>  [9] cooks.distance   deviance         dfbeta           dfbetas
    #> [13] dffits           drop1            dropterm         dummy.coef
    #> [17] effects          extractAIC       family           find_algorithm
    #> [21] formula          hatvalues        influence        initialize
    #> [25] kappa            labels           logLik           logtrans
    #> [29] model.frame      model.matrix     nobs             plot
    #> [33] predict          print            proj             qqnorm
    #> [37] qr               residuals        rstandard        rstudent
    #> [41] sexit_thresholds show             simulate         slotsFromS3
    #> [45] summary          variable.names   vcov
    #> see '?methods' for accessing help and source code

    ## Methods for class "glm"
    methods(class="glm")
    #>  [1] add1             addterm          anova            coerce
    #>  [5] confint          cooks.distance   deviance         dfbetas
    #>  [9] dffits           drop1            dropterm         effects
    #> [13] extractAIC       family           find_algorithm   formula
    #> [17] gamma.shape      influence        initialize       logLik
    #> [21] model.frame      n_obs            nobs             predict
    #> [25] print            profile          residuals        rstandard
    #> [29] rstudent         sexit_thresholds show             sigma
    #> [33] slotsFromS3      summary          vcov             weights
    #> see '?methods' for accessing help and source code

    ## Methods for class "glmb"
    methods(class="glmb")
    #>  [1] anova           case.names      check_prior     confint
    #>  [5] cooks.distance  describe_prior  dfbetas         dummy.coef
    #>  [9] extractAIC      find_algorithm  find_parameters get_data
    #> [13] get_parameters  get_priors      influence       logLik
    #> [17] model_info      plot            predict         print
    #> [21] residuals       rstandard       rstudent        simulate
    #> [25] simulate_prior  summary         variable.names  vcov
    #> see '?methods' for accessing help and source code

The summary functions

Let’s take a closer look at the outputs of the summary functions.

glm summary output

In turn, we see the Call, a list of Deviance residuals, and the estimated coefficients. The coefficients are then followed by some additional model related information.

    ## summary output for the "glm" class
    summary(glm.D93)
    #>
    #> Call:
    #> glm(formula = counts ~ outcome + treatment, family = poisson())
    #>
    #> Coefficients:
    #>               Estimate Std. Error z value Pr(>|z|)
    #> (Intercept)  3.045e+00  1.709e-01  17.815   <2e-16 ***
    #> outcome2    -4.543e-01  2.022e-01  -2.247   0.0246 *
    #> outcome3    -2.930e-01  1.927e-01  -1.520   0.1285
    #> treatment2   1.217e-15  2.000e-01   0.000   1.0000
    #> treatment3   8.438e-16  2.000e-01   0.000   1.0000
    #> ---
    #> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    #>
    #> (Dispersion parameter for poisson family taken to be 1)
    #>
    #>     Null deviance: 10.5814  on 8  degrees of freedom
    #> Residual deviance:  5.1291  on 4  degrees of freedom
    #> AIC: 56.761
    #>
    #> Number of Fisher Scoring iterations: 4

glmb summary output

The summary for the glmb function follow a similar structure but adds a table containing information related to the prior and the maximum likelihood above the table with the means for the estimated Bayesian coefficients. The output below the main table with coefficients is also modified to contain similar (but slightly different) pieces of information (the details of which are discussed elsewhere).

    ## summary output for the "glm" class
    summary(glmb.D93)
    #> Call
    #> glmb(formula = counts ~ outcome + treatment, family = poisson(), pfamily = dNormal(mu = mu, Sigma = V))
    #>
    #> Expected Residuals:
    #>        Min         1Q     Median         3Q        Max
    #> -0.9372941 -0.6272998 -0.1297250  0.8822105  1.0667146
    #>
    #> Prior and Maximum Likelihood Estimates with Standard Deviations
    #>
    #>              Null Mode Prior Mean   Prior.sd  Max Like. Like.sd
    #> (Intercept)  2.813e+00  2.813e+00  1.700e+00  3.045e+00   0.171
    #> outcome2     0.000e+00  0.000e+00  2.012e+00 -4.543e-01   0.202
    #> outcome3     0.000e+00  0.000e+00  1.918e+00 -2.930e-01   0.193
    #> treatment2   0.000e+00  0.000e+00  1.990e+00  1.217e-15   0.200
    #> treatment3   0.000e+00  0.000e+00  1.990e+00  8.438e-16   0.200
    #>
    #> Bayesian Estimates Based on 1000 iid draws
    #>
    #>              Post.Mode  Post.Mean    Post.Sd   MC Error Pr(Null_tail) SE(tail)
    #> (Intercept)  3.042e+00  3.030e+00  1.727e-01  5.460e-03     1.040e-01    0.010
    #> outcome2    -4.497e-01 -4.586e-01  2.061e-01  6.516e-03     1.500e-02    0.004
    #> outcome3    -2.901e-01 -2.945e-01  1.926e-01  6.091e-03     5.900e-02    0.007
    #> treatment2  -1.395e-05  6.827e-03  1.993e-01  6.301e-03     4.970e-01    0.016
    #> treatment3   1.209e-06  2.622e-03  2.068e-01  6.540e-03     4.830e-01    0.016
    #>             Pr(Prior_tail)
    #> (Intercept)          0.104
    #> outcome2             0.015 *
    #> outcome3             0.059 .
    #> treatment2           0.497
    #> treatment3           0.483
    #> ---
    #> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    #>   Directional Tail Summaries:
    #>
    #>                Metric vs Null vs Prior
    #>  Mahalanobis Distance  2.3754   2.3754
    #>      Tail Probability  0.0130   0.0130
    #>   [Tail probabilities are P(delta^T * Z <= 0) in whitened space]
    #>
    #>
    #> Distribution Percentiles
    #>
    #>                  1.0%      2.5%      5.0%    Median     95.0%     97.5% 99.0%
    #> (Intercept)  2.626147  2.673002  2.738241  3.033859  3.296909  3.355977 3.437
    #> outcome2    -0.925971 -0.863729 -0.782269 -0.460915 -0.128360 -0.044351 0.024
    #> outcome3    -0.728639 -0.655651 -0.609713 -0.295378  0.020515  0.088731 0.169
    #> treatment2  -0.475477 -0.395084 -0.324743  0.000636  0.333079  0.379612 0.455
    #> treatment3  -0.448828 -0.390079 -0.327893 -0.006440  0.349516  0.423885 0.513
    #>
    #> Effective Number of Parameters: 5.039209
    #> Expected Residual Deviance: 10.19683
    #> DIC: 56.86822
    #>
    #> Expected Mean dispersion: 1
    #> Sq.root of Expected Mean dispersion: 1
    #>
    #> Mean Likelihood Subgradient Candidates Per iid sample: 1.841

Model Fit, Predictions, Deviance Residuals, Covariance Matrices, and Confidence/Credible Intervals

Let’s next take a look at the outputs from these additional methods to see how they compare. Note that the Bayesian version of these contain random draws tied to the underlying distributions so the column means are mostly used in these comparisons.

Fitted values

    ## fitted outputs for the glm function
    fitted(glm.D93)
    #>        1        2        3        4        5        6        7        8
    #> 21.00000 13.33333 15.66667 21.00000 13.33333 15.66667 21.00000 13.33333
    #>        9
    #> 15.66667

    ## mean of fitted outputs for the glm function
    ## works without a "glmb" class specific generic function
    colMeans(fitted(glmb.D93))
    #>        1        2        3        4        5        6        7        8
    #> 20.99792 13.32933 15.69932 21.14754 13.40863 15.77937 21.05590 13.38086
    #>        9
    #> 15.72364

Predictions(linear predictors)

    ## predictions for the glm function
    predict(glm.D93)
    #>        1        2        3        4        5        6        7        8
    #> 3.044522 2.590267 2.751535 3.044522 2.590267 2.751535 3.044522 2.590267
    #>        9
    #> 2.751535

    ## predictions for the glmb function
    colMeans(glmb.D93$linear.predictors) # no current predict function
    #>        1        2        3        4        5        6        7        8
    #> 3.029601 2.570968 2.735115 3.036428 2.577796 2.741942 3.032223 2.573590
    #>        9
    #> 2.737737
    colMeans(predict(glmb.D93))
    #>        1        2        3        4        5        6        7        8
    #> 3.029601 2.570968 2.735115 3.036428 2.577796 2.741942 3.032223 2.573590
    #>        9
    #> 2.737737

Residuals

    ## residuals for the glm function
    residuals(glm.D93)
    #>           1           2           3           4           5           6
    #> -0.67124923  0.96272360 -0.16964662 -0.21998507 -0.95552353  1.04938637
    #>           7           8           9
    #>  0.84715368 -0.09167147 -0.96656372

    ## residuals for the glmb function
    colMeans(residuals(glmb.D93))
    #>           1           2           3           4           5           6
    #> -0.62729985  1.01288499 -0.12972498 -0.20633672 -0.93420006  1.06671459
    #>           7           8           9
    #>  0.88221053 -0.05581982 -0.93729414

vcov

    ## vcov for the glm function
    vcov(glm.D93)
    #>             (Intercept)      outcome2      outcome3    treatment2    treatment3
    #> (Intercept)  0.02920635 -1.587302e-02 -1.587302e-02 -2.000000e-02 -2.000000e-02
    #> outcome2    -0.01587302  4.087301e-02  1.587302e-02 -7.889764e-18 -7.435533e-18
    #> outcome3    -0.01587302  1.587302e-02  3.714961e-02 -5.991636e-18 -6.847584e-18
    #> treatment2  -0.02000000 -7.889764e-18 -5.991636e-18  4.000000e-02  2.000000e-02
    #> treatment3  -0.02000000 -7.435533e-18 -6.847584e-18  2.000000e-02  4.000000e-02

    ## vcov for the glmb function
    vcov(glmb.D93)
    #>             (Intercept)     outcome2     outcome3   treatment2   treatment3
    #> (Intercept)  0.02980834 -0.016883478 -0.014689614 -0.019534436 -0.021130393
    #> outcome2    -0.01688348  0.042462975  0.016592788 -0.001240305  0.000953073
    #> outcome3    -0.01468961  0.016592788  0.037095960 -0.002064684 -0.001502830
    #> treatment2  -0.01953444 -0.001240305 -0.002064684  0.039705890  0.021227052
    #> treatment3  -0.02113039  0.000953073 -0.001502830  0.021227052  0.042777843

confint

Confidence intervals

    ## confint for the glm function
    confint(glm.D93)
    #> Waiting for profiling to be done...
    #>                  2.5 %      97.5 %
    #> (Intercept)  2.6958215  3.36655581
    #> outcome2    -0.8577018 -0.06255840
    #> outcome3    -0.6753696  0.08244089
    #> treatment2  -0.3932548  0.39325483
    #> treatment3  -0.3932548  0.39325483

    ## confint for the glmb function
    confint(glmb.D93)
    #>                   2.5%       97.5%
    #> (Intercept)  2.6730025  3.35597690
    #> outcome2    -0.8637288 -0.04435061
    #> outcome3    -0.6556505  0.08873110
    #> treatment2  -0.3950836  0.37961189
    #> treatment3  -0.3900789  0.42388482

AIC/DIC, Deviance, and the Log-Likelihood

These model statistics are useful when comparing different model specifications. The Bayesian versions of these will be discussed in greater detail in a separate Vignette.

AIC/DIC

    ## AIC for the glm function (equivalent degrees of freedom and the AIC)
    extractAIC(glm.D93)
    #> [1]  5.00000 56.76132

    ## DIC for the glmb function (estimated effective number of parameters and the DIC)
    extractAIC(glmb.D93)
    #>        pD       DIC
    #>  5.039209 56.868220

Deviance

    ## Deviance for the glm function
    deviance(glm.D93)
    #> [1] 5.129141

    ## Deviance for the glmb function
    ## works without a "glmb" class specific generic function
    mean(deviance(glmb.D93))
    #> [1] 10.19683

Log-Likelihoods

    ## Deviance for the glm function
    logLik(glm.D93)
    #> 'log Lik.' -23.38066 (df=5)

    ## Deviance for the glmb function
    mean(logLik(glmb.D93))
    #> [1] -25.91451

Model Frame, formula, family, nobs, and show

These are mostly useful for understanding various aspects of the model.

Model Frames

    ## Model Frame for the glm function
    model.frame(glm.D93)
    #>   counts outcome treatment
    #> 1     18       1         1
    #> 2     17       2         1
    #> 3     15       3         1
    #> 4     20       1         2
    #> 5     10       2         2
    #> 6     20       3         2
    #> 7     25       1         3
    #> 8     13       2         3
    #> 9     12       3         3

    ## Model Frame for the glmb function
    model.frame(glmb.D93$glm)
    #>   counts outcome treatment
    #> 1     18       1         1
    #> 2     17       2         1
    #> 3     15       3         1
    #> 4     20       1         2
    #> 5     10       2         2
    #> 6     20       3         2
    #> 7     25       1         3
    #> 8     13       2         3
    #> 9     12       3         3

formula

    ## formula for the glm function
    formula(glm.D93)
    #> counts ~ outcome + treatment

    ## formula for the glmb function
    formula(glmb.D93)
    #> counts ~ outcome + treatment

family

    ## family for the glm function
    family(glm.D93)
    #>
    #> Family: poisson
    #> Link function: log

    ## family for the glmb function
    family(glmb.D93$glm)
    #>
    #> Family: poisson
    #> Link function: log

nobs

    ## nobs for the glm function
    nobs(glm.D93)
    #> [1] 9

    ## nobs for the glmb function
    nobs(glmb.D93)
    #> [1] 9

show

The show method returns the same output as the print function

# References

Dobson, A. J. 1990. An Introduction to Generalized Linear Models. Chapman; Hall.
Hastie, T. J., and D. Pregibon. 1992. “Generalized Linear Models.” Chap. 6 in Statistical Models in S, edited by J. M. Chambers and T. J. Hastie. Wadsworth & Brooks/Cole.
McCullagh, P., and J. A. Nelder. 1989. Generalized Linear Models. Chapman; Hall.
Venables, W. N., and B. D. Ripley. 2002. Modern Applied Statistics with S. Springer.