为了得到我的预测模型和真实值之间的相对RMSE,我使用了以下代码。
ratio<-prediction1/ISEtrain
rRMSE1<-sqrt(mean((1-ratio)^2))
但是我失败了,输出为“[1] Inf”。我的代码哪里出错了?
谢谢!
ratio<-prediction1/ISEtrain
rRMSE1<-sqrt(mean((1-ratio)^2))
但是我失败了,输出为“[1] Inf”。我的代码哪里出错了?
谢谢!
你得到了 Inf
,这是因为你正在除以零。
根据维基百科关于标准化均方根误差(https://en.wikipedia.org/wiki/Root-mean-square_deviation)的定义,你可能想要:
sqrt( mean( (prediction1-ISEtrain)^2) ) / ( max(ISEtrain)-min(ISEtrain) )
获取相对RMSE(或标准化RMSE)有两种方法:
Divide RMSE by standard deviation of observed values:
sqrt(mean((prediction1 - ISEtrain)^2)) / sd(ISEtrain)
Divide RMSE by difference between max and min of observed values (as David mentioned):
sqrt(mean((prediction1 - ISEtrain)^2)) / diff(range(ISEtrain))
这两种方法都存在于“hydroGOF”软件包中,并且完全相同,但是执行此操作的正确函数名称为nrmse()
而不是先前提到的rmse()
。
library("hydroGOF")
nrmse(prediction1, ISEtrain, norm = "sd")
nrmse(prediction1, ISEtrain, norm = "maxmin")
是的,但是在hydroGOF软件包中计算rmse的方法与相对均方根误差不同,请参见下文:
RRMSE = (sqrt(sum(predicted-observed)^2))/ (number of observations * mean of observation)
HydroGOF中的RMSE计算是:
rmse = sqrt (mean((sim-obs)^2, na.rm=TRUE)
很不幸,这些计算方式非常不同。
目前我不知道有包含此功能的软件包,因此可能需要自己创建。
如果你只想要RMSE,你也可以使用hydroGOF软件包的内置函数,例如:
rmse(prediction1,ISEtrain, na.rm=TRUE)
这个函数可以轻松处理NA或缺失值,只需设置na.rm=TRUE
,详见文档。
此外,该软件包还包含其他有用的拟合度函数,如NRMSE、MAE、GOF等。
ISEtrain
中有任何零吗? - David Heckmann