Определение соответствия сходящейся модели MATLAB fitglm () - PullRequest
0 голосов
/ 16 сентября 2018

Существует много функций MATLAB, которые выполняют некоторую статистическую подгонку модели, например fitglm().Эти соответствия модели могут не совпадать по разным причинам;Этот вопрос НЕ о том, что может вызвать такие сбои или о том, как их предотвратить.

Мой вопрос: есть ли способ, кроме как посмотреть на вывод консоли, определить, сходится ли данный вызов fitglm()?Казалось бы, очевидный способ сделать это - воспользоваться некоторым свойством выходных аргументов, но список свойств класса Linear Model , похоже, не содержит этой базовой информации.

Минимальный пример (навеянный этим вопросом ):

x = [7 0;0 0;8 0;9 0;7 1;8 0;7 0;4 0;7 0;2 0];
y = [0 0 1 1 1 0 0 1 0 0]';
m = fitglm(x,y,'distr','binomial');

Warning: Iteration limit reached.

Что, если что-нибудь, о выводе m говорит нам, что предел итерации достигнут?

1 Ответ

0 голосов
/ 21 сентября 2018

Мне еще не удалось найти такую ​​информацию в объекте класса GeneralizedLinearModel , возвращаемом из fitglm.Тем не менее, один вариант, который технически не позволяет смотреть на вывод консоли, - это захват информации о последнем предупреждении с использованием lastwarn или warning:

>> [lastMsg, lastID] = lastwarn

lastMsg =

Iteration limit reached.

lastID =

stats:glmfit:IterationLimit


>> w = warning('query', 'last')

w = 

  struct with fields:

    identifier: 'stats:glmfit:IterationLimit'
         state: 'on'

Обратите внимание, что это все равно будет работать, даже если предупреждения были подавлены (т.е. предупреждения все еще генерируются и сохраняются, но не отображаются).

Один из способов, которыми вы могли бы воспользоватьсяэто для того, чтобы сначала установить последнее предупреждение для фиктивного сообщения (используя lastwarn), затем установить модель, затем снова получить последнее предупреждение и сравнить его с вашим фиктивным сообщением.Если он отличается, при установке модели выдается новое предупреждение:

lastwarn('Nothing to see here', 'this:is:not:a:warning');
m = fitglm(x, y, 'distr', 'binomial');
[lastMsg, lastID] = lastwarn;
warningWasThrown = ~strcmp(lastID, 'this:is:not:a:warning');

Кроме того, вы можете иметь оператор switch , который проверяет значение идентификатора предупреждения lastID исоответственно выполняет различные действия, такие как попытка подбора модели с альтернативным набором параметров.

...