matlab - 确定 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
告诉我们达到了迭代限制?
解决方案
我还没有在从返回的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
并相应地采取不同的操作,例如尝试使用一组备用参数来拟合模型。
推荐阅读
- javascript - 除非包含在内联代码或代码块中,否则如何查找带引号的字符串?
- angular - Angular FormArray 无效不将表单标记为无效
- javascript - 在 javascript 代理对象中转发和访问函数参数
- javascript - 实例化对象如何导出和导入 JS 文件?
- android - Kotlin 的后期初始化
- docker - 在 docker-compose.yaml 中设置 security_opt 不起作用
- php - 使用 Carbon 将日期保存到数据库中
- vb.net - 在焦点文本框和 DataGridView 单元格上使用虚拟键盘
- javascript - TypeError:无法读取注册页面未定义的属性“值”
- scala - 用于填充缺失值的 Spark Imputer