【问题标题】:How to perform RMSE with missing values?如何使用缺失值执行 RMSE?
【发布时间】:2013-07-16 04:44:57
【问题描述】:

我有一个包含 679 行和 16 列的庞大数据集,其中 30% 的缺失值。所以我决定用 impute 包中的函数 impute.knn 来估算这个缺失值,我得到了一个包含 679 行和 16 列但没有缺失值的数据集。

但现在我想使用 RMSE 检查准确性,我尝试了 2 个选项:

  1. 加载包hydroGOF并应用rmse函数
  2. sqrt(mean (obs-sim)^2), na.rm=TRUE)

在两种情况下我有错误:errors in sim .obs: non numeric argument to binary operator.

发生这种情况是因为原始数据集包含 NA 值(缺少某些值)。

如果删除缺失值,如何计算 RMSE?那么obssim 会有不同的大小。

【问题讨论】:

  • 对不起。我也改写了这个问题。
  • 您的na.rm=T 使用了错误的功能。它在sqrt,但需要在mean
  • 您好,由于您在这里比较新,您可能想阅读aboutfaq 了解 SO 的工作原理。如果当您收到解决问题的答案时,您可以通过单击小复选标记接受它或为有用的答案投票(您从未做过!!),StackOverflow 对每个人来说都更有价值。您绝对没有义务这样做,但如果答案确实解决了您的问题,这是“回馈”网站的好方法。谢谢!

标签: r hydrogof


【解决方案1】:

干脆……

sqrt( sum( (df$model - df$measure)^2 , na.rm = TRUE ) / nrow(df) )

显然假设您的数据框被称为 df 并且您必须决定您的 N(即 nrow(df) 包括缺少数据的两行;你想要要从 N 观察中排除这些?我猜是的,所以你可能想使用 nrow(df) 而不是 sum( !is.na(df$measure) ) )或者,跟随 @Joshua 只是

sqrt( mean( (df$model-df$measure)^2 , na.rm = TRUE ) )

【讨论】:

  • sqrt(mean((df$model-df$measure)^2,na.rm=TRUE))
  • @JoshuaUlrich 是的,那会更容易。
  • 我改写了这个问题,因为问题不在于测试本身。这是缺失值。
  • @Telma_7919 缺失值无法计算在内,因为您不知道测量变量是什么。所以在答案中使用第二行代码。它将删除缺失值,并告诉您您的模型在观察到的和预期之间有多好。
  • @Telma_7919,问题在于您如何处理缺失值。这个答案正确对待它们。
【解决方案2】:

R包hydroGOF中的rmse()函数有一个NA-remove参数:

# require(hydroGOF)
rmse(sim, obs, na.rm=TRUE, ...)

根据文档,当na.rm 为 TRUE 时会达到预期效果:

"当在obs OR sim中的第i个位置找到一个'NA'值时,第i个值 obs AND sim 在计算之前被删除。"

没有minimal reproducible example,很难说为什么它不适合你。

如果您想在输入到 hydroGOF::rmse() 函数之前消除缺失值,您可以这样做:

my.rmse <- rmse(df.sim[rownames(df.obs[!is.na(df.obs$col_with_missing_data),]),]
     , df.obs[!is.na(df.obs$col_with_missing_data),])

假设您在名为 df.sim 和 df.obs 的不同数据框中分别拥有“模拟”(估算)和“观察”(原始)数据集,它们是从相同的原始数据框创建的,因此具有相同的维度和行名。

如果您有多个缺少数据的列,这是一种执行相同操作的规范方法:

rows.wout.missing.values <- with(df.obs, rownames(df.obs[!is.na(col_with_missing_data1) & !is.na(col_with_missing_data2) & !is.na(col_with_missing_data3),]))
my.rmse <- rmse(df.sim[rows.wout.missing.values,], df.obs[rows.wout.missing.values,])

【讨论】:

  • 请注意,我的原始答案使用了dplyr。我已经删除了它,因为dplyr::filter() 确实 not 保留了原始行名。如果您将原始行名保存为数据框中的另一列,您仍然可以提出使用 dplyr 的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2013-02-15
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多