如何从lm结果中获得RMSE?

24

我知道$sigma均方根误差(RMSE)的概念之间有一点小差异。那么,我想知道在R中从lm函数中获取RMSE的最简单方法是什么?

res<-lm(randomData$price ~randomData$carat+
                     randomData$cut+randomData$color+
                     randomData$clarity+randomData$depth+
                     randomData$table+randomData$x+
                     randomData$y+randomData$z)

length(coefficients(res))

这个模型包含24个系数,我无法手动建立模型了。那么,我如何基于从lm得出的系数来评估RMSE?


13
强烈推荐使用lm(price ~ carat + color + ..., data=randomData):它更易读,并可与下游方法(如predict())配合使用。 - Ben Bolker
5个回答

37

残差平方和:

RSS <- c(crossprod(res$residuals))

均方误差:

MSE <- RSS / length(res$residuals)

均方根误差:

RMSE <- sqrt(MSE)

Pearson 估计的残差方差(由 summary.lm 返回):

sig2 <- RSS / res$df.residual

统计上讲,MSE是残差方差的最大似然估计量,但会有偏差(向下)。Pearson公式给出了残差方差无偏的限制最大似然估计量。


备注

  • 对于给定的两个向量xyc(crossprod(x, y))等价于sum(x * y)更快c(crossprod(x))同样比sum(x ^ 2)更快。
  • sum(x) / length(x)也比mean(x)更快

第一行的代码无法运行。有3个 ')' 但只有2个 '('。我尝试过去掉最后一个 ')' 运行,但是没有成功。它会出现以下错误:"unused argument (crossprod(fit2$residuals))"。 - André Costa
2
@AndréCosta,我看到你还有另一个问题。你必须在R会话中定义了自己的c函数(这是个坏主意),掩盖了向量连接的base::c。以下是我如何重现你的错误:c <- function () NULL,然后c(crossprod(1:10)) - Zheyuan Li
我的C函数没问题。也许是R的某个版本有所更改。对我来说,可行的方法是crossprod(1:10)[1]。(顺便说一句,不是我点赞的,哈哈哈) - André Costa
1
@AndréCosta 还有其他选择,比如 drop(crossprd(1:10))。啊,对不起。也许那个人也在这里投了另一个答案的票 :) - Zheyuan Li
您还可以计算MSE=mean(res$residuals^2)。 - Kenan

32

使用来自base的函数,在一行中获取RMSE,我会使用:

sqrt(mean(res$residuals^2))

6
我认为其他答案可能不正确。回归的MSE是SSE除以(n - k - 1),其中n是数据点数量,k是模型参数数量。
简单地计算残差平方的平均值(如其他答案所建议的)相当于除以n而不是(n - k - 1)。
我会通过sqrt(sum(res$residuals^2) / res$df)来计算RMSE。
分母中的量res$df给出了自由度,它与(n - k - 1)相同。请参考此链接: https://www3.nd.edu/~rwilliam/stats2/l02.pdf

1
如果你仔细查找,你会发现很多其他来源都将RMSE定义为它听起来的样子,即均方根误差。平方误差,取平均值,再开方。例如,维基百科页面并没有提到自由度或模型参数的任何内容。 - Gregor Thomas
1
维基百科在这里介绍了它:https://en.wikipedia.org/wiki/Mean_squared_error#Regression。MSE的自由度定义也在我的统计学教材Hayter的“工程师和科学家的概率与统计学”中。 - Arthur

0

只需做

sigma(res) 

你懂了吗


sigma() 返回高斯模型的“误差估计标准偏差(残差标准偏差)”,而不是均方根误差(help(sigma))。 - Richard Careaga

0
请查看 Metrics 包中的 rmse() 函数。

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