mharinga
mharinga

Reputation: 1780

Extract offset term from glm

I am wondering how to extract the offset term from the following model:

mod <- glm(cyl ~ mpg + disp + offset(log(gear)), family = "poisson", data = mtcars)

I would like to write a function get_offset() which returns the offset term:

get_offset <- function(x){
  ...
}

get_offset(mod)
#> "log(gear)"

get_offset() should also return the offset term for the models:

mod2 <- glm(cyl ~ mpg + disp, offset = log(gear), family = "poisson", data = mtcars)
mod3 <- glm(cyl ~ mpg + offset(log(gear)) + disp, family = "poisson", data = mtcars)
mod4 <- glm(cyl ~ mpg + offset(gear) + disp, family = "poisson", data = mtcars)

Giving:

get_offset(mod2)
#> "log(gear)"

get_offset(mod3)
#> "log(gear)"

get_offset(mod4)
#> "gear"

Created on 2021-01-02 by the reprex package (v0.3.0)

Upvotes: 2

Views: 283

Answers (1)

akrun
akrun

Reputation: 887108

We could get the attributes from the terms

get_offset <- function(model) {
     nm1 <- names(attributes(model$terms)$dataClasses)
      if('(offset)' %in% nm1) {
             deparse(as.list(model$call)$offset)
        } else {

      sub("offset\\((.*)\\)$", "\\1", grep('offset', nm1, value = TRUE))
     }
   }

get_offset(mod)
#[1] "log(gear)"
get_offset(mod2)
#[1] "log(gear)"
get_offset(mod3)
#[1] "log(gear)"
get_offset(mod4)
#[1] "gear"

Upvotes: 4

Related Questions