Getting Started

The package is simple to use. First, lets load the basic packages.

library(rmdl)
#> Loading required package: vctrs
#> Loading required package: tibble
#> 
#> Attaching package: 'tibble'
#> The following object is masked from 'package:vctrs':
#> 
#>     data_frame

The mtcars dataset will serve as the example, and we will use linear regressions as the primary test. Next, we will evaluate a toy dataset and evaluate how a fmls object is generated.

# Look at potential data from the `mtcars` dataset
head(mtcars)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

baseFormula <- mpg ~ wt + hp
rFormula <- fmls(mpg ~ wt + hp)

# Similar to the base formula
rFormula
#> mpg ~ wt + hp

Now we can fit the hypothesis to its data - in this case, a simple linear regression. The option to return the model as raw or not is given. If TRUE, the default, then the expected result from the modeling fit will be returned in the form of a list of models, based on the fitting function provided.

# Uses a custom fit function to return linear models
listModels <-
  rFormula |>
  fit(.fn = lm, data = mtcars, raw = TRUE)

For our purposes though, we want to use the custom fit method, which retains more key information. This creates a mdl object, which is simply a wrapper around base or package-specific models.

# Uses a custom fit function 
rModel <-
  rFormula |>
  fit(.fn = lm, data = mtcars, raw = FALSE)

rModel
#> <model[1]>
#> lm(mpg ~ wt + hp)

The model wrapper is helpful in that it can be unpacked into a table of elements, which then stores our model for later usage in a research workflow. For this purpose, we introduce the mdl_tbl class, which another core class with specific and generic dispatch methods.

# An additional model to work with
r2Model <-
  fmls(am ~ cyl + hp, pattern = "sequential") |>
  fit(.fn = glm, family = "binomial", data = mtcars, raw = FALSE)

# Displays the two additional logistic regressions performed
r2Model
#> <model[2]>
#> glm(am ~ cyl)
#> glm(am ~ cyl + hp)

# Creation of a table of models
rTable <- model_table(mileage = rModel, automatic = r2Model)
rTable
#> <mdl_tbl>
#>   id        formula_index data_id name  model_call formula_call outcome exposure
#>   <chr>     <list>        <chr>   <chr> <chr>      <chr>        <chr>   <chr>   
#> 1 c6d92460… <int [3]>     mtcars  mile… lm         mpg ~ wt + … mpg     <NA>    
#> 2 8199c553… <dbl [3]>     mtcars  auto… glm        am ~ cyl     am      <NA>    
#> 3 4f19c116… <dbl [3]>     mtcars  auto… glm        am ~ cyl + … am      <NA>    
#> # ℹ 7 more variables: mediator <chr>, interaction <chr>, strata <lgl>,
#> #   level <lgl>, model_parameters <list>, model_summary <list>,
#> #   fit_status <lgl>

The mdl_tbl class is a useful way to store and manage multiple models, and can be used to generate tables for publication or for internal use. To quickly access the content (e.g. estimates, standard errors, etc.), there is an experimental function called flatten_models() that can be used. Note that we are also exponentiating the coefficients for the logistic regression models (called by name).

fTable <-
  rTable |>
  flatten_models(exponentiate = TRUE, which = "automatic") 

# Display contents
fTable
#> # A tibble: 8 × 34
#>   formula_call  model_call data_id name      number outcome exposure mediator
#>   <chr>         <chr>      <chr>   <chr>      <int> <chr>   <chr>    <chr>   
#> 1 mpg ~ wt + hp lm         mtcars  mileage        2 mpg     <NA>     <NA>    
#> 2 mpg ~ wt + hp lm         mtcars  mileage        2 mpg     <NA>     <NA>    
#> 3 mpg ~ wt + hp lm         mtcars  mileage        2 mpg     <NA>     <NA>    
#> 4 am ~ cyl      glm        mtcars  automatic      1 am      <NA>     <NA>    
#> 5 am ~ cyl      glm        mtcars  automatic      1 am      <NA>     <NA>    
#> 6 am ~ cyl + hp glm        mtcars  automatic      2 am      <NA>     <NA>    
#> 7 am ~ cyl + hp glm        mtcars  automatic      2 am      <NA>     <NA>    
#> 8 am ~ cyl + hp glm        mtcars  automatic      2 am      <NA>     <NA>    
#> # ℹ 26 more variables: interaction <chr>, strata <lgl>, level <lgl>,
#> #   term <chr>, estimate <dbl>, std_error <dbl>, statistic <dbl>,
#> #   p_value <dbl>, conf_low <dbl>, conf_high <dbl>, r_squared <dbl>,
#> #   adj_r_squared <dbl>, sigma <dbl>, model_statistic <dbl>,
#> #   model_p_value <dbl>, df <dbl>, log_lik <dbl>, aic <dbl>, bic <dbl>,
#> #   deviance <dbl>, df_residual <int>, nobs <int>, degrees_freedom <dbl>,
#> #   var_cov <list>, null_deviance <dbl>, df_null <int>

# Filter down to relevant models
fTable |>
  dplyr::select(name, number, outcome, term, estimate, conf_low, conf_high, p_value, nobs)
#> # A tibble: 8 × 9
#>   name      number outcome term       estimate conf_low conf_high  p_value  nobs
#>   <chr>      <int> <chr>   <chr>         <dbl>    <dbl>     <dbl>    <dbl> <int>
#> 1 mileage        2 mpg     (Intercep…  37.2     34.0      4.05e+1 2.57e-20    32
#> 2 mileage        2 mpg     wt          -3.88    -5.17    -2.58e+0 1.12e- 6    32
#> 3 mileage        2 mpg     hp          -0.0318  -0.0502  -1.33e-2 1.45e- 3    32
#> 4 automatic      1 am      (Intercep…  43.7      2.58     1.28e+3 1.45e- 2    32
#> 5 automatic      1 am      cyl          0.501    0.286    7.92e-1 6.42e- 3    32
#> 6 automatic      2 am      (Intercep… 341.       9.44     3.91e+4 4.76e- 3    32
#> 7 automatic      2 am      cyl          0.182    0.0436   5.05e-1 4.73e- 3    32
#> 8 automatic      2 am      hp           1.03     1.00     1.06e+0 4.23e- 2    32