Matlab中fitlm回归模型if语句无法过滤R²=1模型的问题排查
Matlab fitlm模型筛选问题:无法过滤R²=1的模型
问题描述
我在Matlab中使用fitlm函数进行回归分析,希望筛选出普通R²大于0.75但不等于1,且Coefficients中第二个p值小于0.05的模型并绘图(这类模型表现良好但非完美,存在变量自对比情况)。
编写的代码如下:
%do the modelling mdl = fitlm(X,comp); %plot the good models if mdl.Rsquared.Ordinary > 0.75 && mdl.Rsquared.Ordinary < 1 && mdl.Coefficients.pValue(2) < 0.05 plot(mdl) end
尝试两种条件写法后遇到异常:
- 使用
mdl.Rsquared.Ordinary ~= 1时,能过滤R²<0.75和p值不满足的模型,但无法过滤R²=1的模型 - 使用
mdl.Rsquared.Ordinary < 1的条件也无效
想知道问题出在哪里?为什么R²>0.75的条件生效,而R²<1或≠1的条件不起作用?
问题根源:浮点数精度误差
Matlab中计算得到的"R²=1"并非严格等于数学意义上的1,而是一个非常接近1的浮点数(比如0.999999999999999或者1.000000000000002)。直接用==/~=/<1这类严格数值对比会因为浮点数的精度偏差失效:
- 当R²实际是
0.999999999999999时,mdl.Rsquared.Ordinary <1会返回true,但如果是1.000000000000001(因计算误差略大于1),<1就会返回false - 严格的
~=1对比会因为浮点数和1的微小偏差被判定为满足条件,导致R²接近1的模型被错误保留
解决方案:设置容差进行近似对比
不要用严格的数值相等/不等判断,而是设置一个接近1的容差阈值,或者判断R²与1的差值绝对值是否小于某个极小值:
写法1:设置上限阈值
% 设置接近1的上限,比如0.9999,可根据需求调整 if mdl.Rsquared.Ordinary > 0.75 && mdl.Rsquared.Ordinary < 0.9999 && mdl.Coefficients.pValue(2) < 0.05 plot(mdl) end
写法2:用差值绝对值判断
% 判断R²与1的差距是否大于极小值(比如1e-10),规避浮点数精度问题 if mdl.Rsquared.Ordinary > 0.75 && abs(mdl.Rsquared.Ordinary - 1) > 1e-10 && mdl.Coefficients.pValue(2) < 0.05 plot(mdl) end
补充说明
当回归模型出现完全拟合(比如自变量和因变量完全线性相关,或存在变量自对比)时,Matlab计算的R²可能会因为浮点运算的精度问题,表现为略大于或略小于1的数值,而非严格的1。使用容差对比能有效规避这类精度陷阱。
内容的提问来源于stack exchange,提问作者user2587726
相关产品推荐
相关产品推荐

