如何在缺少值的情况下执行RMSE?

如何在缺少值的情况下执行RMSE?,r,hydrogof,R,Hydrogof,我有一个庞大的数据集,有679行16列,其中有30%的缺失值。因此,我决定使用包impute中的函数impute.knn来插补这个缺失值,我得到了一个数据集,有679行16列,但没有缺失值 但现在我想使用RMSE检查准确性,我尝试了两个选项: 加载软件包hydroGOF并应用rmse功能 sqrt(平均值(obs sim)^2),na.rm=TRUE) 在两种情况下,我会出现错误:sim中的错误。obs:二进制运算符的非数字参数。 这是因为原始数据集包含NA值(某些值丢失) 如果删除缺少的值,如

我有一个庞大的数据集,有679行16列,其中有30%的缺失值。因此,我决定使用包impute中的函数impute.knn来插补这个缺失值,我得到了一个数据集,有679行16列,但没有缺失值

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

  • 加载软件包
    hydroGOF
    并应用
    rmse
    功能
  • sqrt(平均值(obs sim)^2),na.rm=TRUE)
  • 在两种情况下,我会出现错误:
    sim中的错误。obs:二进制运算符的非数字参数。

    这是因为原始数据集包含
    NA
    值(某些值丢失)

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

    干脆

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

    sqrt( mean( (df$model-df$measure)^2 , na.rm = TRUE ) )
    
    R包中的rmse()函数有一个NA remove参数:

    # require(hydroGOF)
    rmse(sim, obs, na.rm=TRUE, ...)
    
    根据文档,当
    na.rm
    为真时,预期的结果是什么

    “当在obs或sim中的第i个位置发现“NA”值时,第i个值 在计算之前,将删除obs和sim的副本。”

    如果没有,很难说为什么这对你不起作用

    如果要在输入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),])
    

    my.rmse或
    sqrt(平均值((df$model df$measure)^2,na.rm=TRUE))
    @JoshuaUlrich是的,那会更简单。我重新表述了这个问题,因为问题不是测试本身。而是缺少的值。@Telma_7919缺少的值不能计算,因为你不知道测量的变量是什么。所以在回答中使用第二行代码。它会删除缺少的值,并告诉你你的mod有多好el介于观察值和预期值之间。@Telma_7919,问题在于您如何处理缺少的值。此答案正确处理了它们。Ia,对不起。我也重新表述了问题。您的
    na.rm=T
    函数错误。它在
    sqrt
    中,但需要在
    mean
    中。您好,因为您在这里相对较新,您可能需要它阅读和了解其工作原理。当您收到解决问题的答案时,如果您通过单击小复选标记或向上投票一个有用的答案(您从未这样做过!!)来接受该答案,则StackOverflow对每个人都更有价值。您绝对没有义务这样做,但这是一种“回馈”的好方法如果某个答案确实解决了您的问题,请访问该网站。谢谢!请注意,我的原始答案使用了
    dplyr
    。我从
    dplyr::filter()起将其删除
    不保留原始行名。如果将原始行名另存为数据框中的另一列,您仍然可以想出一个使用
    dplyr
    的解决方案。
    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,])