Skip to content

Commit

Permalink
Support for fixest::feglm(), fixest::femlm(), fixest::feols()
Browse files Browse the repository at this point in the history
  and `fixest::feNmlm()`

fix #167
  • Loading branch information
larmarange committed Jul 1, 2022
1 parent bf30b8b commit 04d83ae
Show file tree
Hide file tree
Showing 15 changed files with 107 additions and 49 deletions.
3 changes: 2 additions & 1 deletion DESCRIPTION
@@ -1,6 +1,6 @@
Package: broom.helpers
Title: Helpers for Model Coefficients Tibbles
Version: 1.7.0.9003
Version: 1.7.0.9004
Authors@R: c(
person("Joseph", "Larmarange", , "joseph@larmarange.net", role = c("aut", "cre"),
comment = c(ORCID = "0000-0001-7097-700X")),
Expand Down Expand Up @@ -37,6 +37,7 @@ Suggests:
covr,
datasets,
emmeans,
fixest,
forcats,
gam,
gee,
Expand Down
4 changes: 3 additions & 1 deletion NAMESPACE
Expand Up @@ -11,6 +11,7 @@ S3method(model_get_coefficients_type,clogit)
S3method(model_get_coefficients_type,coxph)
S3method(model_get_coefficients_type,crr)
S3method(model_get_coefficients_type,default)
S3method(model_get_coefficients_type,fixest)
S3method(model_get_coefficients_type,geeglm)
S3method(model_get_coefficients_type,glm)
S3method(model_get_coefficients_type,glmerMod)
Expand All @@ -27,12 +28,14 @@ S3method(model_get_model,mira)
S3method(model_get_model_frame,biglm)
S3method(model_get_model_frame,coxph)
S3method(model_get_model_frame,default)
S3method(model_get_model_frame,fixest)
S3method(model_get_model_frame,model_fit)
S3method(model_get_model_frame,survreg)
S3method(model_get_model_matrix,biglm)
S3method(model_get_model_matrix,brmsfit)
S3method(model_get_model_matrix,clm)
S3method(model_get_model_matrix,default)
S3method(model_get_model_matrix,fixest)
S3method(model_get_model_matrix,glmmTMB)
S3method(model_get_model_matrix,model_fit)
S3method(model_get_model_matrix,multinom)
Expand All @@ -58,7 +61,6 @@ S3method(model_get_terms,model_fit)
S3method(model_get_weights,default)
S3method(model_get_weights,model_fit)
S3method(model_get_weights,svyglm)
S3method(model_get_xlevels,biglm)
S3method(model_get_xlevels,brmsfit)
S3method(model_get_xlevels,default)
S3method(model_get_xlevels,felm)
Expand Down
2 changes: 2 additions & 0 deletions NEWS.md
Expand Up @@ -4,6 +4,8 @@

- Support for `parsnip::model_fit` objects (#161)
- Support for `biglm::bigglm()` and `biglmm::bigglm()` models (#155)
- Support for `fixest::feglm()`, `fixest::femlm()`, `fixest::feols()`
and `fixest::feNmlm()` (#167)

**New features**

Expand Down
29 changes: 17 additions & 12 deletions R/model_get_coefficients_type.R
Expand Up @@ -28,18 +28,20 @@ model_get_coefficients_type.default <- function(model) {
#' @export
#' @rdname model_get_coefficients_type
model_get_coefficients_type.glm <- function(model) {
if (model$family$family == "binomial" && model$family$link == "logit")
return("logistic")
if (model$family$family == "binomial" && model$family$link == "log")
return("relative_risk")
if (model$family$family == "binomial" && model$family$link == "cloglog")
return("prop_hazard")
if (model$family$family == "poisson" && model$family$link == "log")
return("poisson")
if (model$family$family == "quasibinomial" && model$family$link == "logit")
return("logistic")
if (model$family$family == "quasipoisson" && model$family$link == "log")
return("poisson")
if (!is.null(model$family)) {
if (model$family$family == "binomial" && model$family$link == "logit")
return("logistic")
if (model$family$family == "binomial" && model$family$link == "log")
return("relative_risk")
if (model$family$family == "binomial" && model$family$link == "cloglog")
return("prop_hazard")
if (model$family$family == "poisson" && model$family$link == "log")
return("poisson")
if (model$family$family == "quasibinomial" && model$family$link == "logit")
return("logistic")
if (model$family$family == "quasipoisson" && model$family$link == "log")
return("poisson")
}
"generic"
}

Expand All @@ -53,6 +55,9 @@ model_get_coefficients_type.negbin <- function(model) {
#' @rdname model_get_coefficients_type
model_get_coefficients_type.geeglm <- model_get_coefficients_type.glm

#' @export
#' @rdname model_get_coefficients_type
model_get_coefficients_type.fixest <- model_get_coefficients_type.glm

#' @export
#' @rdname model_get_coefficients_type
Expand Down
6 changes: 6 additions & 0 deletions R/model_get_model_frame.R
Expand Up @@ -66,3 +66,9 @@ model_get_model_frame.biglm <- function(model) {
model_get_model_frame.model_fit <- function(model) {
model_get_model_frame(model$fit)
}

#' @export
#' @rdname model_get_model_frame
model_get_model_frame.fixest <- function(model) {
stats::model.frame.default(model$fml, data = get(model$call$data, model$call_env))
}
5 changes: 5 additions & 0 deletions R/model_get_model_matrix.R
Expand Up @@ -102,3 +102,8 @@ model_get_model_matrix.model_fit <- function(model, ...) {
model_get_model_matrix(model$fit, ...)
}

#' @export
#' @rdname model_get_model_matrix
model_get_model_matrix.fixest <- function(model) {
stats::model.matrix.default(model$fml, data = get(model$call$data, model$call_env))
}
21 changes: 12 additions & 9 deletions R/model_get_xlevels.R
Expand Up @@ -19,6 +19,17 @@ model_get_xlevels.default <- function(model) {
NULL # nocov
}
)
if (is.null(xlevels)) {
xlevels <- tryCatch(
stats::.getXlevels(
stats::terms(model),
model %>% model_get_model_frame()
),
error = function(e) {
NULL # nocov
}
)
}
xlevels %>% .add_xlevels_for_logical_variables(model)
}

Expand Down Expand Up @@ -64,17 +75,9 @@ model_get_xlevels.glmmTMB <- model_get_xlevels.lmerMod
#' @rdname model_get_xlevels
model_get_xlevels.plm <- model_get_xlevels.lmerMod

#' @export
#' @rdname model_get_xlevels
model_get_xlevels.biglm <- function(model) {
stats::.getXlevels(
stats::terms(model),
model %>% model_get_model_frame()
)
}

#' @export
#' @rdname model_get_xlevels
model_get_xlevels.model_fit <- function(model) {
model_get_xlevels(model$fit)
}

4 changes: 4 additions & 0 deletions data-raw/DATASET.R
Expand Up @@ -35,6 +35,10 @@ supported_models <-
'`biglm::bigglm()`','',
'`biglmm::bigglm()`','',
'`parsnip::model_fit`', 'Supported as long as the type of model and the engine is supported.',
'`fixest::feglm()`','',
'`fixest::femlm()`','',
'`fixest::feols()`','',
'`fixest::feNmlm()`','',
) %>%
dplyr::arrange(.data$model)

Expand Down
Binary file modified data/supported_models.rda
Binary file not shown.
3 changes: 3 additions & 0 deletions man/model_get_coefficients_type.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions man/model_get_model_frame.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions man/model_get_model_matrix.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 0 additions & 3 deletions man/model_get_xlevels.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 30 additions & 23 deletions man/supported_models.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions tests/testthat/test-tidy_plus_plus.R
Expand Up @@ -636,3 +636,20 @@ test_that("tidy_plus_plus() works with parsnip::model_fit object", {
)
expect_equivalent(res1, res2)
})

test_that("tidy_plus_plus() works with fixest models", {
skip_on_cran()
skip_if_not_installed("fixest")

mod <- fixest::feols(fml = mpg ~ am + factor(carb), data = mtcars)
expect_error(
res <- mod %>% tidy_plus_plus(),
NA
)

mod <- fixest::feglm(Sepal.Length ~ Sepal.Width + Petal.Length | Species, iris, "poisson")
expect_error(
res <- mod %>% tidy_plus_plus(),
NA
)
})

0 comments on commit 04d83ae

Please sign in to comment.