Python统计计算:MFB与MFE结果数值过低问题求助
计算MFB/MFE时数值过低的问题排查与解决
现有计算代码
import numpy as np # 当前使用的MFB/MFE计算代码 MFB=(2*np.nansum((MODEL-MEAS)))/(N*np.nansum(np.absolute(MODEL+MEAS))) MFE=(2*np.nansum(np.absolute(MODEL-MEAS)))/(N*np.nansum(np.absolute(MODEL+MEAS)))
数值过低的核心原因
- 分母冗余乘以N:标准MFB/MFE公式的分母一般为模型与观测值的绝对值和(或和的绝对值),不需要乘以样本量N。你代码中的
N*np.nansum(...)会将分母放大N倍,直接让计算结果缩小N倍,这是数值偏低的主要原因。 - 绝对值处理不符合标准公式:部分权威定义中,MFB/MFE的分母是
Σ(|MODEL| + |MEAS|),而非Σ(|MODEL+MEAS|)。当模型值与观测值符号相反时,后者会远小于前者,导致分母异常偏大,结果被进一步缩小。 - 与给定附图公式不匹配:如果附图中的公式分母无N因子、无绝对值(或绝对值位置不同),当前代码的额外处理必然导致结果偏差。
针对性解决办法
移除分母的N因子
先尝试去掉代码中的N,修正后代码:MFB = (2 * np.nansum(MODEL - MEAS)) / np.nansum(np.absolute(MODEL + MEAS)) MFE = (2 * np.nansum(np.absolute(MODEL - MEAS))) / np.nansum(np.absolute(MODEL + MEAS))调整绝对值的计算位置
如果附图公式中分母是各自绝对值的和,修改分母计算逻辑:# 计算模型与观测值各自绝对值的总和 denominator = np.nansum(np.absolute(MODEL) + np.absolute(MEAS)) MFB = (2 * np.nansum(MODEL - MEAS)) / denominator MFE = (2 * np.nansum(np.absolute(MODEL - MEAS))) / denominator确认有效样本数的使用
若公式确实需要用到样本量,需使用排除nan后的有效样本数,而非原始总样本数:# 获取有效样本数(排除nan值) N_valid = np.count_nonzero(~np.isnan(MODEL) & ~np.isnan(MEAS)) # 后续计算替换原N为N_valid
内容的提问来源于stack exchange,提问作者Dimitris Tsiaousidis
相关产品推荐
相关产品推荐

