首页 > 解决方案 > 确定 MATLAB fitglm() 模型拟合是否收敛

问题描述

有许多 MATLAB 函数可以进行某种统计模型拟合,例如fitglm(). 由于各种原因,这些模型拟合可能无法收敛;这个问题不是关于什么会导致此类故障或如何防止它们。

我的问题是:除了查看控制台输出之外,还有其他方法可以确定给定的调用是否fitglm()收敛?执行此操作的明显方法似乎是通过输出参数的某些属性,但线性模型类的属性列表似乎不包含此基本信息。

一个最小的例子(受这个问题的启发):

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告诉我们达到了迭代限制?

标签: matlabstatisticsiterationdiagnosticsconvergence

解决方案


我还没有在从返回的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并相应地采取不同的操作,例如尝试使用一组备用参数来拟合模型。


推荐阅读