如何在缺少值的情况下执行RMSE?
我有一个庞大的数据集,有679行16列,其中有30%的缺失值。因此,我决定使用包impute中的函数impute.knn来插补这个缺失值,我得到了一个数据集,有679行16列,但没有缺失值 但现在我想使用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值(某些值丢失) 如果删除缺少的值,如
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,])