如何使用缺失值执行RMSE?

时间:2013-07-17 14:48:47

标签: r hydrogof

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

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

  1. 加载包hydroGOF并应用rmse功能
  2. sqrt(mean (obs-sim)^2), na.rm=TRUE)
  3. 在两种情况下,我有错误:errors in sim .obs: non numeric argument to binary operator.

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

    如果删除缺失值,如何计算RMSE?然后obssim会有不同的尺寸。

3 个答案:

答案 0 :(得分:17)

如何简单......

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

显然假设您的数据框名为df,您必须决定 N (即nrow(df)包含缺少数据的两行;你想从 N 观察中排除这些吗?我猜是的,所以你可能不想nrow(df)使用sum( !is.na(df$measure) )而不是sqrt( mean( (df$model-df$measure)^2 , na.rm = TRUE ) ) 或者,关注@Joshua

{{1}}

答案 1 :(得分:5)

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

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

根据文档,当na.rm为TRUE时,它是预期的:

" 当在obs或sim中的第i个位置找到'NA'值时,第i个值 在计算之前删除了obs和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),])

假设您拥有&#34;模拟&#34; (估算)和&#34;观察&#34; (原始)数据集分别位于名为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,])

答案 2 :(得分:-1)

计算R中的RMSE,即使缺少值:

数学符号:

enter image description here

直觉:

RMSE回答了这个问题:&#34;列表d和列表p&#34;中的数字平均有多相似?两个列表的长度必须相同。 RMSE为您提供一个数字,表示d元素与p元素的距离。

示例代码:

#    Element 1 has zero error
#       |     Element 2 small error
#       |      |     Element 3, large error
#       |      |     |      Has one missing value
#       |      |     |      |     Two missing values
#       v      v     v      v     v
#       
d = c(0.000, 0.166, 0.333, NA,   NA)
p = c(0.000, 0.254, 0.998, 0.31, NA)

rmse = function(predictions, targets){

    #Option 1 to handle missing values (preferred)
    #Wipe out both elements when either side has a 
    #missing value.  This is dangerous because if
    #you've got a lot of NA's, then the remaining
    #elements will have more influence:

    predictions[is.na(targets)]     <- 0
    targets[is.na(targets)]         <- 0
    targets[is.na(predictions)]     <- 0
    predictions[is.na(predictions)] <- 0 

    #alternatively you could just set the NA's to some
    #default value, but this is dangerous since it 
    #injects a constant bias into the equation proportional
    #to how many NA's are replaced.

    #predictions[is.na(predictions)]     <- 0
    #targets[is.na(targets)]             <- 0

    return(sqrt(mean(((targets - predictions) ** 2))))
}

rmse_val = rmse(d, p)
print("rms error is: ")
print(rmse_val)

打印:

[1] "rms error is: "
[1] 0.387285

更直观地了解其工作原理和原因:

请参阅我用Python编写的RMSE的其他规范答案:https://stackoverflow.com/a/37861832/445131