# Conventions for MLModels Implementation

#### Brian J Smith

#### 2020-08-05

## Model Constructor Components

- `MLModel` is a function supplied by the MachineShop package. It allows for the integration of statistical and machine learning models supplied by other R packages with the MachineShop model fitting, prediction, and performance assessment tools.

- The following are guidelines for writing model constructor functions that are wrappers around the `MLModel` function.

- In this context, the term “constructor” refers to the wrapper function and “source package” to the package supplying the original model implementation.

### Constructor Arguments

- The constructor should produce a valid model if called without any arguments; i.e., not have any required arguments.

- The source package defaults will be used for parameters with `NULL` values.

- Model formula, data, and weights are separate from model parameters and should not be defined as constructor arguments.

### name Slot

- Use the same name as the constructor.

### packages Slot

- Include all packages whose functions are called directly from within the constructor.

- Use :: or ::: to reference source package functions.

### response_types Slot

- Include all response variable types (`"binary"`, `"factor"`, `"matrix"`, `"numeric"`, `"ordered"`, and/or `"Surv"`) that can be analyzed with the model.

### params Slot

- List of parameter values set by the constructor, typically obtained with `MachineShop:::params(environment())` if all arguments are to be passed to the source package fit function as supplied. Additional steps may be needed to pass the constructor arguments to the source package in a different format; e.g., when some model parameters must be passed in a control structure, as in `C50Model` and `CForestModel`.

### nvars Function

- Should have a single `data` argument that represents a model frame and return its number of analytic predictor variables.

### fit Function

- The first three arguments should be `formula`, `data`, and `weights` followed by an ellipsis (`...`).

- If weights are not supported, the following should be included in the function:

    if(!all(weights == 1)) warning("weights are not supported and will be ignored")

- Only add elements to the resulting fit object if they are needed and will be used in the `predict` or `varimp` functions.

- Return the fit object.

### predict Function

- The arguments are a model fit `object`, `newdata` frame, optionally `times` for prediction at survival time points, and an ellipsis.

- The predict function should return a vector or column matrix of probabilities for the second level of binary factors, a matrix whose columns contain the probabilities for factors with more than two levels, a matrix of predicted responses if matrix, a vector or column matrix of predicted responses if numeric, a matrix whose columns contain survival probabilities at `times` if supplied, or a vector of predicted survival means if `times` are not supplied.

### varimp Function

- Should have a single model fit `object` argument followed by an ellipsis.

- Variable importance results should generally be returned as a vector with elements named after the corresponding predictor variables. The package will handle conversions to a data frame and `VarImp` object. If there is more than one set of relevant variable importance measures, they can be returned as a matrix or data frame with predictor variable names as the row names.

## Documenting an MLModel

### Model Parameters

- Include the first sentences from the source package.

- Start sentences with the parameter value type (logical, numeric, character, etc.).

- Start sentences with lowercase.

- Omit indefinite articles (a, an, etc.) from the starting sentences.

### Details Section

- Include response types (binary, factor, matrix, numeric, ordered, and/or Surv).

- Include the following sentence:

> Default values for the arguments and further model details can be found in the source link below.

### Return (Value) Section

- Include the following sentence:

> MLModel class object.

### See Also Section

- Include a link to the source package function and the other method functions shown below.

    \code{\link[<source package>]{<fit function>}}, \code{\link{fit}},
    \code{\link{resample}}, \code{\link{tune}}

## Package Extensions

- If adding a new model to the package, save its source code in a file whose name begins with “ML_” followed by the model name, and ending with a .R extension; e.g., `"R/ML_CustomModel.R"`.

- Export the model in `NAMESPACE`.

- Add any required packages to the “Suggests” section of `DESCRIPTION`.

- Add the model to `R/MachineShop-package.R`.

- Add the model to `R/modelinfo.R`.

- Add a unit testing file to `tests/testthat`.