我有一个庞大的数据集,包含679行和16列,缺失值为30%。所以我决定用包impute中的函数impute.knn来估算这个缺失的值,我得到了一个包含679行和16列但没有缺失值的数据集。
但现在我想使用RMSE检查准确性,我尝试了两个选项:
hydroGOF
并应用rmse
功能sqrt(mean (obs-sim)^2), na.rm=TRUE)
在两种情况下,我有错误:errors in sim .obs: non numeric argument to binary operator.
这是因为原始数据集包含NA
值(缺少某些值)。
如果删除缺失值,如何计算RMSE?然后obs
和sim
会有不同的尺寸。
答案 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)
数学符号:
直觉:
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