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

12

我有一个目标变量Wavelength,通过观察V1V12的数值特征。我想计算Vx列之间的RMSE。数据格式如下。

每个"Vx"变量在5分钟的时间间隔内进行测量。我想要计算所有Vx变量观察值之间的RMSE,应该怎么做呢?

我对波长变量有不同的观察值,每个变量Vx都以5分钟为时间间隔进行测量

我发现了以下链接,但我不确定如何得到y_pred: https://www.kaggle.com/wiki/RootMeanSquaredError

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


2
如果您有一个模型,例如 fit1 <- lm(y ~ x1 + x2, data = Data),您可以使用 y_hat <- fitted.values(fit1) 提取拟合值。请尝试在提问时提供数据和代码 - nrussell
这强烈依赖于您在观察中拟合的模型。没有模型就没有均方根误差(RMSE)... - Pop
提供我的数据的截图... - Vicki1227
6个回答

37

以下函数将为您提供RMSE:

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

m 代表模型拟合的值,o 代表观测到的真实值。


谢谢,但是你能指出“m”和“o”代表什么吗? - Vicki1227
2
当然,它们是拟合值和观测值。你传递参数的顺序并不重要,因为你正在计算差的平方。 - Fernando
你能根据我提供的数据图像,进一步说明计算m和o的方程吗? - Vicki1227
不清楚您需要什么。RMSE是一种误差度量,您需要两个向量来计算它。如何获得它们(将模型拟合到数据)是一个不同的历史/问题。 - Fernando
你知道我如何获取数据集中所有变量V1-V12的平均值吗?在这种情况下,我认为它是“m”。 - Vicki1227
显示剩余2条评论

12

为了帮助您,我刚刚编写了这些函数:

#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)

我希望这有所帮助。


1
只有一件事需要注意,如果数据中有“NAs”,则在函数中使用“na.rm=T”。 - Manoj Kumar
这应该是默认功能。 - Ufos

11

如何在R中执行RMSE

请参考我在另一个回答中获得了97个以上的赞同的Python实现RMSE:https://dev59.com/5mQm5IYBdhLWcg3w-S6Y#37861832。以下是R代码的解释。

RMSE(均方根误差)、MSE(均方误差)和RMS(均方根)都是用于比较两个数列之间变化的数学技巧。

RMSE提供了一个单一的数字来回答问题:“list1和list2中的数字平均而言有多相似?”这两个列表必须大小相同。我想要“消除任意两个给定元素之间的噪音,消除收集的数据量,并获得关于时间变化的单一数字感觉”。

对RMSE的直观理解:

想象一下你正在学习投掷飞镖。每天你练习一个小时。你想知道你是变得更好还是变得更差。所以每天你扔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 

数学符号:

RMSE in R explained

RMSE不是最准确的线性拟合策略,总体最小二乘法是更好的选择:

均方根误差测量点和线之间的垂直距离,因此如果您的数据形状像香蕉,底部平坦,顶部陡峭,则RMSE将报告高处点的距离更远,但实际上与低处点相比距离相等。这会导致偏差,使线更喜欢靠近高点而不是低点。

如果这是一个问题,那么总体最小二乘法可以解决这个问题: https://mubaris.com/posts/linear-regression/

可能导致此RMSE函数出错的注意事项:

如果任一输入列表中存在空值或无限大值,则输出RMSE值将没有意义。 处理任一列表中的nulls / missing values / infinities有三种策略:忽略该组件,将其归零或添加最佳猜测或均匀随机噪声到所有时间步长。 针对数据含义,每种补救措施都有其优缺点。 通常情况下,忽略任何带有缺失值的组件是首选的,但这会偏向于将RMSE偏向零,使您认为性能已经提高,而实际上并没有。 如果存在大量缺失值,则添加最佳猜测的随机噪声可能更好。

为了保证RMSE输出的相对正确性,必须从输入中消除所有null / infinities。

RMSE对于不属于数据点的异常值具有零容忍度

均方根误差依赖于所有数据都正确且被视为平等,这意味着一个离群点会完全破坏整个计算。 为了处理异常值并在一定阈值后忽略其巨大影响,请参见内置阈值以去除异常值的鲁棒估计器。


0

在这种情况下,类似 y_pred <- colMeans(your_data) 的东西可以做吗? - plastikdusche
你知道我如何获取数据集V1-V12的所有变量的平均值吗? - Vicki1227
使用colMeans函数 - plastikdusche

0

0

对于您的线性模型,您也可以使用summary():

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接