一维序列不含缺测值时,由RMSE的定义可以计算RMSE
RMSE = (Ypre-Yobs)*(Ypre-Yobs)’/n
RMSE的定义
但是当一维序列Ypre与Yobs存在缺测值NaN时,此RMSE不能由上式直接计算。必须先找到他们同一位置都不缺测的数据点,即以下代码的ids
关键用到 MATLAB的isfinite函数:
TF = isfinite(A) 返回一个逻辑数组,其中的 1 (true) 对应数组 A 的有限元素,0 (false) 对应无限或 NaN 元素。如果 A 包含复数,则 isfinite(A) 中的 1 对应实部和虚部均为有限值的元素,0 对应实部或虚部中存在无限值或 NaN 值的元素。
function [yRMSE] = rmseYobs(Yobs,Ypre)
%RMSEYOBS 计算均方根误差 不含nan
% 注意输入均为行向量
% isfinite([1 nan 3 5 8 nan]) + isfinite([ 2 3 nan 4 nan 4] )==2
id1 = isfinite(Yobs);
id2 = isfinite(Ypre);
ids = find(id1+id2==2);
yRMSE = (Yobs(ids)-Ypre(ids))*(Yobs(ids)-Ypre(ids))'/(length(ids));
end
命令行窗口输入
rmseYobs([1 nan 3 5 8 nan],[2 3 nan 4 nan 4])
输出结果
1
只有数组第一与第四位置的元素参与计算。