R语言中含NaN的两个dataframe计算平均绝对误差(MAE)报错如何解决
问题原因分析
- 自定义函数报错:你在定义函数时使用了
df1$AU、df2$UF1这类带$符号的变量作为形参,不符合R的参数命名规则,导致R无法正常解析函数的参数列表,na.rm参数没有被正确识别,因此运行时会提示找不到na.rm对象。 - Metrics包
mae函数报错:Metrics包内置的mae函数本身没有设计na.rm参数,你传入na.rm = TRUE属于多余参数,因此会报unused argument错误。
正确解决方案
方案1:使用修正后的自定义函数(推荐)
MAE的数学定义就是观测值和预测值绝对差的均值,你直接运行mean(abs(df1$AU-df2$UF1), na.rm=TRUE)得到的结果就是正确的MAE值,na.rm=TRUE已经自动跳过了所有包含NaN的配对观测,符合你的数据处理需求。
你可以把自定义函数修正为通用格式,方便批量计算三组MAE:
# 修正后的自定义MAE函数 mae1 <- function(actual, predicted, na.rm = TRUE) { mean(abs(actual - predicted), na.rm = na.rm) } # 分别计算三组MAE mae1(df1$AU, df2$UF1) mae1(df1$AU, df2$UF2) mae1(df1$AU, df2$UF3)
调用函数时不需要额外传na.rm=TRUE,因为已经设为默认值。
方案2:使用Metrics包的正确调用方式
如果你要使用Metrics包的内置函数,需要先手动筛选出观测值和预测值都非NaN的有效观测,再传入函数计算:
library(Metrics) # 筛选有效观测的索引 valid_idx <- complete.cases(df1$AU, df2$UF1) # 计算MAE mae(df1$AU[valid_idx], df2$UF1[valid_idx])
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

