如何使用缺失值执行RMSE?

Tel*_*919 11 r hydrogof

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

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

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

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

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

如果删除缺失值,如何计算RMSE?然后obs,sim将有不同的大小.

Sim*_*lon 17

简单来说......

sqrt( sum( (df$model - df$measure)^2 , na.rm = TRUE ) / nrow(df) )
Run Code Online (Sandbox Code Playgroud)

显然假设你的数据框被调用df,你必须决定你的N(即nrow(df)包括缺少数据的两行;你想从N个观察中排除这些吗?我猜是的,所以nrow(df)你可能不想使用sum( !is.na(df$measure) ))或者在@Joshua之后

sqrt( mean( (df$model-df$measure)^2 , na.rm = TRUE ) )
Run Code Online (Sandbox Code Playgroud)

  • 或`sqrt(mean((df $ model-df $ measure)^ 2,na.rm = TRUE))` (5认同)

c.g*_*rez 5

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

# require(hydroGOF)
rmse(sim, obs, na.rm=TRUE, ...)
Run Code Online (Sandbox Code Playgroud)

根据文档,预期何时na.rm为TRUE:

" 当在obs OR sim中的第i个位置找到'NA'值时,在计算之前移除了obs和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),])
Run Code Online (Sandbox Code Playgroud)

假设您在分别名为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,])
Run Code Online (Sandbox Code Playgroud)