rmodelsummary

How to report an object of class htest using modelsummary in R


I'm trying to use modelsummary to report a test. A sample of what test I use is on the following lines:

library(stats)
library(modelsummary)

set.seed(10)

ts1 <- rnorm(200, mean = 10, sd = 3) %>% ts()

test <- Box.test(ts1,lag = 5, type = "Ljung-Box", fitdf = 2)

class(test)

After generating the test, I try to create very simple functions called tidy.htest and glance.htest as printed below:

tidy.htest <- function(s, ...) {
  
  ret <- data.frame(
    term   = "Test Statistic",
    estimate  = s$statistic[[1]],
    p.value   = s$p.value)
  ret
}

glance.htest <- function(s, ...) {
  
  ret <- data.frame(
    DF = s$parameter[[1]]
  )
  ret
}

and then I run

modelsummary(test)

But I get the following error:

Error: `modelsummary could not extract the required information from a model of class "htest". The
  package tried a sequence of 2 helper functions to extract estimates:
  
  parameters::parameters(model)
  broom::tidy(model)
  
  To draw a table, one of these commands must return a `data.frame` with a column named "term". The
  `modelsummary` website explains how to summarize unsupported models or add support for new models
  yourself: https://vincentarelbundock.github.io/modelsummary/articles/modelsummary.html
  
  These errors messages were generated during extraction:
  
  `parameters::parameters(model)` did not return a data.frame with a `term` column.
`broom::tidy(model)` did not return a data.frame with a `term` column.

I'm sorry if there is something obvious that I didn't get, but it seems that the problem is that there is no "term" column but tidy.htest does generate a "term" column.

I'd really appreciate if someone could help. Thanks in advance!


Solution

  • Background: modelsummary uses the broom or parameters packages to extract coefficients from model objects. The problem is that both of these packages have methods to handle htest objects, but that neither returns a "standard" object. In particular, we do not get a term column, which modelsummary requires.

    When you tried to define your own methods, there's a conflict which gets resolved in favor of the built-in broom method.

    One workaround would be to change the class of your object and define new methods against that class:

    library(stats)
    library(modelsummary)
    set.seed(10)
    ts1 <- rnorm(200, mean = 10, sd = 3) |> ts()
    test <- Box.test(ts1,lag = 5, type = "Ljung-Box", fitdf = 2)
    
    tidy.custom <- function(s, ...) {
      ret <- data.frame(
        term   = "Test Statistic",
        estimate  = s$statistic[[1]],
        p.value   = s$p.value)
      ret
    }
    
    glance.custom <- function(s, ...) {
      ret <- data.frame(
        DF = s$parameter[[1]]
      )
      ret
    }
    
    class(test) <- "custom"
    
    modelsummary(test, statistic = "p.value")
    
    +----------------+---------+
    |                | (1)     |
    +================+=========+
    | Test Statistic | 3.971   |
    +----------------+---------+
    |                | (0.265) |
    +----------------+---------+