【问题标题】:Determining whether MATLAB fitglm() model fit converged确定 MATLAB fitglm() 模型拟合是否收敛
【发布时间】:2019-02-20 19:10:10
【问题描述】:

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

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

一个最小的例子(灵感来自this question):

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 的输出告诉我们达到了迭代限制,如果有的话?

【问题讨论】:

    标签: matlab statistics iteration diagnostics convergence


    【解决方案1】:

    我还没有在fitglm 返回的GeneralizedLinearModel class object 中找到任何此类信息。但是,技术上避免查看控制台输出的一个选项是使用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 的值并相应地采取不同的操作,例如尝试使用一组备用参数拟合模型。

    【讨论】:

    • @MattMizumi:是的,我有点惊讶他们没有返回这种信息,无论是作为另一个输出还是模型对象的属性。也许他们打算仅将警告消息用于此目的。
    猜你喜欢
    • 2021-06-22
    • 2014-07-07
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多