Поместите в объект то, что вы считаете полезным и необходимым. Я думаю, что более важный вопрос заключается в том, как вы включаете эту информацию, а также как к ней обращаются.
Как минимум, укажите метод print()
, чтобы весь объект не выводился на экран при печати объекта. Если вы предоставляете метод summary()
, соглашение состоит в том, чтобы этот объект возвращал объект класса summary.foo
(где foo
- ваш класс), а затем предоставлял метод print.summary.foo()
- вы не хотите, чтобы ваш summary()
метод, выполняющий любую печать сам по себе.
Если у вас есть коэффициенты, подогнанные значения и остатки, и они просты, вы можете сохранить их в возвращаемом объекте как $coefficients
, $fitted.values
и $residuals
соответственно. Тогда методы по умолчанию для coef()
, fitted()
и resid()
будут работать без необходимости добавлять собственные методы. Если это не просто, предоставьте свои собственные методы для coef()
, fitted.values()
и residuals()
для вашего класса. Не просто, я имею в виду, например, если есть несколько типов остатков, и вам нужно обработать сохраненные остатки, чтобы получить запрошенный тип - тогда вам нужен собственный метод, который принимает аргумент type
или аналогичный для выбора из доступных типов остатков. См. ?residuals.glm
для примера.
Если предсказания могут быть полезны, то можно предоставить метод predict()
. Посмотрите на метод predict.lm()
, например, чтобы увидеть, какие аргументы следует принимать. Аналогичным образом можно указать update()
, если имеет смысл обновить модель путем добавления / удаления терминов или изменения параметров модели.
plot.lm()
приводит пример метода, который предоставляет несколько графиков диагностики для подобранной модели. Вы можете смоделировать свой метод для этой функции, чтобы выбрать из набора предопределенных графиков диагностики.
Если ваша модель имеет правдоподобие, то предоставление logLik()
метода для вычисления или извлечения его из подобранного объекта модели будет стандартным, deviance()
- еще одна аналогичная функция, если такая вещь уместна. Для доверительных интервалов параметров confint()
является стандартным методом.
Если у вас есть интерфейс формулы, то методы formula()
могут извлечь его. Если вы храните его в месте, которое ищет метод по умолчанию, ваша жизнь станет проще. Простой способ сохранить это - сохранить соответствующий вызов (match.call()
) в компоненте $call
. Методы извлечения фрейма модели (model.frame()
) и матрицы модели (model.matrix()
), которые являются данными, и расширенная (коэффициенты, преобразованные в переменные с помощью контрастов плюс любые преобразования или функции данных фрейма модели) модели, являются стандартным экстрактором функции. Посмотрите на примеры из стандартных функций моделирования R, чтобы узнать, как хранить / извлекать эту информацию.
Если вы используете интерфейс формулы, попробуйте следовать стандартному, нестандартному методу оценки, используемому в большинстве объектов модели R, которые имеют интерфейс / метод формулы. Вы можете найти подробности об этом на странице R Developer , в частности документ Томаса Ламли. Это дает множество советов о том, как заставить вашу функцию работать так, как ожидается, что будет работать функция моделирования R.
Если вы следуете этой парадигме, то экстракторы типа na.action()
должны просто работать, если вы следуете стандартным (нестандартным) правилам.