# broom turns any R model into a tibble you can compare

> broom is an R package that extracts statistical results from fitted models into tidy tibbles through three verbs, tidy, glance and augment. It covers more than a hundred models from other packages plus most of the stats package, and the catch is that the shape of the output depends on the model you fitted.

**tidymodels/broom** — Convert statistical analysis objects from R into tidy format

- Repository: https://github.com/tidymodels/broom
- Website: https://broom.tidymodels.org
- Stars: 1,526 · Forks: 299
- Language: R
- License: NOASSERTION
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/tidymodels-broom

## Three verbs, three different shapes of answer

broom is built around three functions and each one answers a different question about a fitted model. `tidy()` summarizes information about model components, and for a regression model that usually means the coefficients, one row per term. `glance()` reports information about the entire model, and it returns a tibble with exactly one row of goodness of fit measures. `augment()` adds information about observations to a dataset, such as fitted values, residuals or cluster assignments. The separation matters more than it first appears, because it means you can ask for the summary of a model without touching the data it was fitted on, and you can ask for observation level quantities without pulling a summary back out of the same tibble.

## The dot prefix on augment columns is a deliberate collision guard

There is a detail in the augment documentation that is easy to skim past and costly to get wrong. All columns added to a dataset have a `.` prefix, so `.fitted`, `.resid`, `.hat`, `.sigma`, `.cooksd` and `.std.resid` cannot overwrite an existing column in the data you passed in. The practical effect is that augment is safe to apply to a frame that already carries columns with those names, which is exactly the situation you get when you augment the same data twice, once for a model and once for a second model. It also means the added columns sort separately from the original ones, since a leading dot pushes them to the end in most column orderings. This is a small design decision that removes a class of silent bug, and it is the kind of thing you notice only after it has already cost you an afternoon.

## One row per model is what makes glance() comparable

The value of `glance()` is not that it reports good statistics. It is that it reports them in a fixed shape, exactly one row, so that many models can be stacked into a single tibble and compared side by side. The README frames the use as checking for model misspecification and comparing many models, and the example makes the point concrete: fitting a linear model of Volume on Girth and Height and calling glance() on it returns r.squared, adj.r.squared, sigma, statistic, p.value, df, logLik, AIC and BIC, plus deviance, df.residual and nobs. The row count is fixed, but the column set is not. A glance() result from a different model class will carry a different set of measures, which is the central limitation of the whole package and the thing to plan around.

## Coverage is broad, and the coverage list is a generated document

broom tidies 100+ models from popular modelling packages, and almost all of the model objects in the stats package that ships with base R. That last part is the more useful half, since a plain `lm()` fit needs no extra dependency to be inspectable. The README points to `vignette("available-methods")` as the place that lists method availability, and that is a document you should read before designing around the package rather than after. The list is not static hand written documentation, it tracks which modelling packages have contributed methods, so a package that has not contributed one leaves you with an object that no verb will tidy. Adding methods for a new model class is treated as a normal contribution, and the README links an article on the tidymodels site describing the process.

## Installing broom, the whole modelling set, or the GitHub version

The installation section gives three routes, and the first one is a recommendation rather than a requirement. The README suggests installing the entire tidyverse modelling set, which includes broom, because tidymodels pulls in the surrounding packages.

```r
# we recommend installing the entire tidyverse
# modeling set, which includes broom:
install.packages("tidymodels")

# alternatively, to install just broom:
install.packages("broom")

# to get the development version from GitHub:
install.packages("pak")
pak::pak("tidymodels/broom")
```

The last route uses the pak package to pull the development version straight from GitHub, which is useful when you need a method that has not reached CRAN yet. The package is on CRAN, and the README badge for R-CMD-check shows the package is validated on every release against the standard R checks.

## A worked example with lm, and what the columns mean

The README's usage example fits a simple linear model and then tidies it, and the output shows the shape of a component summary in practice.

```r
library(broom)

fit <- lm(Volume ~ Girth + Height, trees)
tidy(fit)
#> # A tibble: 3 × 5
#>   term        estimate std.error statistic  p.value
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#> 1 (Intercept)  -58.0       8.64      -6.71 2.75e- 7
#> 2 Girth          4.71      0.264     17.8  8.22e-17
#> 3 Height         0.339     0.130      2.61 1.45e- 2
```

Three rows for an intercept and two predictors, and each row carries the term name, the estimate, the standard error, the test statistic and the p value. That table is what a plotting function or a report generator consumes, and building it by hand from a summary object is exactly the repetitive work broom exists to remove.

## Maintenance state, the generated README and where the source of truth is

The repository is not archived, and the last push was on 2026-05-14. The recent tags track closely with that, with v1.0.13 on 2026-05-14, v1.0.12 on 2026-05-12 and v1.0.11 on 2025-12-04, so the package is on a 1.0 line with patch releases and a fairly quick turnaround when something needs fixing. The version number matters when you pin: the current release line is 1.0.x, and the 1.0 boundary is a signal that the API is considered settled. One structural detail is worth knowing before you edit anything in the repository, because the README itself says so at the top. The README.md is generated from README.Rmd, and the comment asks that you edit the Rmd file instead, so a direct edit to the Markdown would be overwritten on the next build.

## Conclusion

broom fits an R user who fits many models and wants to compare them, plot them or feed them into a report without writing a bespoke extraction function per model class. It does not fit a pipeline that needs a guaranteed column set across every model, because the columns in a glance() result come from the model that produced it. Before you adopt it, run `vignette("available-methods")` to see whether the package that produces your model has methods, and check the R and package version requirements in DESCRIPTION before pinning broom 1.0.13 in a pipeline.

## FAQ

### What is the difference between tidy(), glance() and augment() in broom?

`tidy()` summarizes information about model components, `glance()` reports information about the whole model in exactly one row, and `augment()` adds observation level information such as fitted values and residuals to a dataset. The README recommends the `broom` vignette for a detailed introduction.

### How do I install broom in R?

The README recommends `install.packages("tidymodels")` for the whole modelling set, or `install.packages("broom")` for just broom. For the development version it points at `install.packages("pak")` followed by `pak::pak("tidymodels/broom")`.

### Does augment() overwrite columns in my original data?

No. The README states that all columns added to a dataset have a `.` prefix to prevent existing columns from being overwritten, which is where the `.fitted` and `.resid` names come from.

### Which models does broom support?

The README says broom tidies 100+ models from popular modelling packages and almost all of the model objects in the stats package that comes with base R. The vignette `available-methods` lists which methods are available.

### How can I add support for a new model class in broom?

The README points to an article on the tidymodels site that describes how to develop broom methods for new model objects. The repository also welcomes typo corrections, bug fixes, feature requests and documentation feedback, and issues tagged Beginner Friendly are pointed out as a starting point.

### What is the current release of broom and how often does it ship?

The most recent tag is broom 1.0.13 on 2026-05-14, with 1.0.12 two days earlier on 2026-05-12 and 1.0.11 on 2025-12-04. The last push to the repository was on 2026-05-14.

## Sources

- [Issues](https://github.com/tidymodels/broom/issues)
- [Project website](https://broom.tidymodels.org)
- [README](https://github.com/tidymodels/broom/blob/main/README.md)
- [Releases](https://github.com/tidymodels/broom/releases)
- [tidymodels/broom on GitHub](https://github.com/tidymodels/broom)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/tidymodels-broom
