11

我有一个包含 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不同的大小。

4

2 回答 2

18

何况简单...

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 ) )
于 2013-07-17T14:56:15.137 回答
6

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

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

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

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

如果没有最小的可重现示例,很难说为什么这对您不起作用。

如果您想在输入 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,])
于 2014-09-08T20:12:42.423 回答