R中的RMSE(均方根偏差)计算

时间:2014-10-07 13:53:22

标签: r statistics equation

我对目标变量V1进行了V12Wavelength的数字要素观察。我想计算Vx列之间的RMSE。数据格式如下。

每个变量“Vx”以5分钟的间隔测量。我想计算所有Vx变量观测值之间的RMSE,我该怎么做?

I have different observations for Wavelength variable, each variable ,Vx is measured at 5-minute interval,

这是我找到的链接,但我不确定如何获得y_pred: https://www.kaggle.com/wiki/RootMeanSquaredError

对于下面提供的链接,我认为我没有预测值: http://heuristically.wordpress.com/2013/07/12/calculate-rmse-and-mae-in-r-and-sas/

6 个答案:

答案 0 :(得分:14)

以下功能将为您提供RMSE:

RMSE = function(m, o){
  sqrt(mean((m - o)^2))
}

m用于模型(拟合)值,o用于观察(真实)值。

答案 1 :(得分:4)

为了您的帮助,只需编写以下功能:

#Fit a model
fit <- lm(Fertility ~ . , data = swiss)

# Function for Root Mean Squared Error
RMSE <- function(error) { sqrt(mean(error^2)) }
RMSE(fit$residuals)

# If you want, say, MAE, you can do the following:

# Function for Mean Absolute Error
mae <- function(error) { mean(abs(error)) }
mae(fit$residuals)

我希望它有所帮助。

答案 2 :(得分:4)

如何在R。

中执行RMSE

RMSE :(均方根误差),MSE :(均值平方误差)和RMS :(均方根平方)都是数学技巧,可以感受两个数字列表之间随时间的变化。

RMSE提供一个回答问题的单一数字:“list1到list2中的数字平均有多相似?”。这两个列表必须大小相同。我想“清除任何两个给定元素之间的噪音,清除所收集数据的大小,并获得一个数字随时间变化的感觉”。

RMSE的Intuition和ELI5:

想象一下,你正在学习在飞镖盘上投掷飞镖。每天练习一小时。你想知道你是变得更好还是变得更糟。因此,每天你进行10次投掷并测量靶心与飞镖击中的距离。

您列出了这些数字。使用第1天距离与包含全零的列表之间的均方根误差。在第2天和第n天也这样做。你会得到的是一个数字,希望随着时间的推移而减少。当你的RMSE数为零时,你每次都会击中靶心。如果数量上升,你的情况会越来越糟。

计算R中的均方根误差的示例:

cat("Inputs are:\n") 
d = c(0.000, 0.166, 0.333) 
p = c(0.000, 0.254, 0.998) 
cat("d is: ", toString(d), "\n") 
cat("p is: ", toString(p), "\n") 

rmse = function(predictions, targets){ 
  cat("===RMSE readout of intermediate steps:===\n") 
  cat("the errors: (predictions - targets) is: ", 
      toString(predictions - targets), '\n') 
  cat("the squares: (predictions - targets) ** 2 is: ", 
      toString((predictions - targets) ** 2), '\n') 
  cat("the means: (mean((predictions - targets) ** 2)) is: ", 
      toString(mean((predictions - targets) ** 2)), '\n') 
  cat("the square root: (sqrt(mean((predictions - targets) ** 2))) is: ", 
      toString(sqrt(mean((predictions - targets) ** 2))), '\n') 
  return(sqrt(mean((predictions - targets) ** 2))) 
} 
cat("final answer rmse: ", rmse(d, p), "\n") 

打印哪些:

Inputs are:
d is:  0, 0.166, 0.333 
p is:  0, 0.254, 0.998 
===RMSE Explanation of steps:===
the errors: (predictions - targets) is:  0, -0.088, -0.665 
the squares: (predictions - targets) ** 2 is:  0, 0.007744, 0.442225 
the means: (mean((predictions - targets) ** 2)) is:  0.149989666666667 
the square root: (sqrt(mean((predictions - targets) ** 2))) is:  0.387284994115014 
final answer rmse:  0.387285 

数学符号:

enter image description here

RMSE不是最准确的线拟合策略,总最小二乘法是:

均方根误差测量点与线之间的垂直距离,因此如果您的数据形状像香蕉,靠近底部平坦并且靠近顶部陡峭,那么RMSE将向高点报告更远的距离,但是实际距离相等时,距离点很短。这会引起偏斜,使得线更倾向于接近高于低的点。

如果这是一个问题,总体最小二乘法修复了这个问题:https://mubaris.com/2017-09-28/linear-regression-from-scratch

可以破坏此RMSE功能的问题:

如果任一输入列表中都有空值或无穷大,则输出rmse值将没有意义。在任一列表中有三种处理空值/缺失值/无穷大的策略:忽略该组件,将其归零或为所有时间步长添加最佳猜测或均匀随机噪声。每种补救措施都有其优缺点,具体取决于数据的含义。通常忽略任何具有缺失值的组件是优选的,但是这会使RMSE偏向零,这使得您认为性能已经提高了。如果存在大量缺失值,则可以优选在最佳猜测上添加随机噪声。

为了保证RMSE输出的相对正确性,必须从输入中消除所有空值/无穷大。

RMSE对不属于

的异常值数据点具有零容忍度

均方根误差平方依赖于所有正确的数据,并且所有数据都被计为相等。这意味着在左场出局的一个迷路点将完全破坏整个计算。要处理异常数据点并在某个阈值后忽略它们的巨大影响,请参阅构建解除异常值阈值的稳健估计量。

答案 3 :(得分:0)

您可以编写自己的函数,也可以使用包含RMSE函数的hydroGOF软件包。 http://www.rforge.net/doc/packages/hydroGOF/rmse.html

关于你的y_pred你首先需要一个产生它们的模型,否则你为什么要计算RMSE?

答案 4 :(得分:0)

您还可以在R中使用具有方法的库(mltools)

rmse(preds = NULL,实数= NULL,权重= 1,na.rm = FALSE)

参考:http://search.r-project.org/library/mltools/html/rmse.html

答案 5 :(得分:0)

您还可以对线性模型使用summary():

mod = lm(dependent ~ independent, data)然后:

mod.error = summary(mod)
mod.error$sigma