确定MATLAB fitglm()模型是否适合收敛

时间:2018-09-16 20:02:18

标签: matlab statistics iteration diagnostics convergence

有许多MATLAB函数可以进行某种统计模型拟合,例如requests.get(host+endpoint+auth_token)。这些模型拟合可能由于各种原因而无法收敛。这个问题与导致此类故障的原因或预防方法无关。

我的问题是:除了查看控制台输出之外,是否有其他方法可以确定对fitglm()的给定调用是否收敛?显而易见的方法似乎是通过输出参数的某些属性来实现的,但是Linear Model class的属性列表似乎并不包含此基本信息。

一个最小的例子(受this question的启发):

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. 的什么(如果有的话)告诉我们达到了迭代限制?

1 个答案:

答案 0 :(得分:1)

我还没有在GeneralizedLinearModel class object返回的fitglm中找到任何此类信息。但是,从技术上避免查看控制台输出的一个选项是使用lastwarnwarning捕获有关最后警告的信息:

>> [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'

请注意,即使warnings have been suppressed(即使仍生成并存储警告,但不显示警告),该操作仍然有效。

您可以使用此方法的一种方法是,首先将上一条警告设置为虚拟消息(使用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的值,并相应地采取不同的操作,例如尝试使用另一组参数拟合模型。