Regression model summary from `{easystats}`"

library(flexdashboard)
library(easystats)

# Since not all regression model are supported across all packages, make the
# dashboard chunks more fault-tolerant. E.g. a model might be supported in
# `{parameters}`, but not in `{report}`.
#
# For this reason, `error = TRUE`
knitr::opts_chunk$set(
  error = TRUE,
  out.width = "100%"
)

# helper function for printing `{report}` outputs
bracket_to_parantheses <- function(text) {
  gsub("]", ")", gsub("[", "(", text, fixed = TRUE), fixed = TRUE)
}
# Get user-specified model data
model <- params$model

# Is it supported by `{easystats}`? Skip evaluation of the following chunks if not.
is_supported <- insight::is_model_supported(model)

if (!is_supported) {
  unsupported_message <- sprintf(
    "Unfortunately, objects of class `%s` are not yet supported in {easystats}.\n
    For a list of supported models, see `insight::supported_models()`.",
    class(model)[1]
  )
}

Model fit

Column {data-width=700}

Assumption checks

check_model_args <- c(list(model), params$check_model_args)
# add verbose, if not done yet
if (is.null(check_model_args$verbose)) check_model_args$verbose <- FALSE
tryCatch(
  {
    do.call(performance::check_model, check_model_args)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
  }
)
cat(unsupported_message)

Column {data-width=300}

Indices of model fit

# {performance}
performance_args <- c(list(model), params$performance_args)
# add verbose, if not done yet
if (is.null(performance_args$verbose)) performance_args$verbose <- FALSE
table_performance <- do.call(performance::performance, performance_args)
print_md(table_performance, layout = "vertical", caption = NULL)
cat(unsupported_message)

For interpretation of performance metrics, please refer to this documentation.

Parameter estimates

Column {data-width=550}

Plot

# `{parameters}`
parameters_args <- c(list(model), params$parameters_args)
# add verbose, if not done yet
if (is.null(parameters_args$verbose)) parameters_args$verbose <- FALSE
table_parameters <- do.call(parameters::parameters, parameters_args)

plot(table_parameters)
cat(unsupported_message)

Column {data-width=450}

Tabular summary

print_md(table_parameters, caption = NULL)
cat(unsupported_message)

To find out more about table summary options, please refer to this documentation.

Predicted Values

Column {data-width=600}

Plot

# {modelbased}
int_terms <- find_interactions(model, component = "conditional", flatten = TRUE)
con_terms <- find_variables(model)$conditional

if (is.null(int_terms)) {
  model_terms <- con_terms
} else {
  model_terms <- clean_names(int_terms)
  int_terms <- unique(unlist(strsplit(clean_names(int_terms), ":", fixed = TRUE)))
  model_terms <- c(model_terms, setdiff(con_terms, int_terms))
}

# check some exceptions here: logistic regression models with factor response
# usually require the response to be included in the model, else `get_modelmatrix()`
# fails, which is required to compute SE/CI for `get_predicted()`
response <- find_response(model)
minfo <- model_info(model)
model_data <- get_data(model)
include_response <- minfo$is_binomial && minfo$is_logit && is.factor(model_data[[response]])

text_modelbased <- tryCatch(
  {
    lapply(unique(model_terms), function(i) {
      dgrid <- get_datagrid(
        model,
        by = i,
        range = "grid",
        preserve_range = FALSE,
        verbose = FALSE,
        include_response = include_response
      )
      estimate_expectation(model, data = dgrid, verbose = FALSE)
    })
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)

if (!is.null(text_modelbased)) {
  ggplot2::theme_set(theme_modern())
  # all_plots <- lapply(text_modelbased, function(i) {
  #   out <- do.call(visualisation_recipe, c(list(i), modelbased_args))
  #   plot(out) + ggplot2::ggtitle("")
  # })
  all_plots <- lapply(text_modelbased, function(i) {
    out <- visualisation_recipe(i, show_data = "none")
    plot(out) + ggplot2::ggtitle("")
  })

  see::plots(all_plots, n_columns = round(sqrt(length(text_modelbased))))
}
cat(unsupported_message)

Column {data-width=400}

Tabular summary

if (!is.null(text_modelbased)) {
  for (i in text_modelbased) {
    tmp <- print_md(i)
    tmp <- gsub("Variable predicted", "\nVariable predicted", tmp, fixed = TRUE)
    tmp <- gsub("Predictors modulated", "\nPredictors modulated", tmp, fixed = TRUE)
    tmp <- gsub("Predictors controlled", "\nPredictors controlled", tmp, fixed = TRUE)
    print(tmp)
  }
}
cat(unsupported_message)

Text reports

Column {data-width=500}

Textual summary

# {report}
text_report <- tryCatch(
  {
    report(model, verbose = FALSE)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)


text_report_performance <- tryCatch(
  {
    report_performance(model, verbose = FALSE)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)

if (!is.null(text_report)) {
  cat(bracket_to_parantheses(text_report))
  cat("\n")
}

if (!is.null(text_report_performance)) {
  cat(bracket_to_parantheses(text_report_performance))
}
cat(unsupported_message)

Column {data-width=500}

Model information

model_info_data <- insight::model_info(model, verbose = FALSE)
model_info_data <- datawizard::data_to_long(as.data.frame(insight::compact_list(model_info_data)))

DT::datatable(model_info_data)
cat(unsupported_message)


Try the easystats package in your browser

Any scripts or data that you put into this service are public.

easystats documentation built on Sept. 11, 2024, 7:59 p.m.