3

我有两个数据集,我使用 R 的lm命令对其进行绘图。下面的第一个图没有以红线为中心。但是右边的第二张图以直线为中心。

数据1 数据2

我的问题是:

  1. 衡量数据以线为中心的程度如何?
  2. 如何从数据结构中提取它?

我用来绘制该数据的代码很简单:

 data <-read.table("myfile.txt")
 dat1x <- data$x1
 dat1y <- data$y1


 # plot left figure
 dat1_lm <- lm(dat1x ~ dat1y)
 plot(dat1x ~ dat1y)
 abline(coef(dat1_lm),col="red")
 dat1_lm.r2  <- summary(dat1_lm)$adj.r.squared;

 # repeat the the same for right figure
 dat2x <- data$x2
 dat2y <- data$y2
 dat2_lm <- lm(dat2x ~ dat2y)
 plot(dat2x ~ dat2y)
 abline(coef(dat2_lm),col="red")
 dat2_lm.r2  <- summary(dat2_lm)$adj.r.squared;

使用 RMSE 分数更新绘图:

F1g1 在此处输入图像描述

根据以预测线为中心的数据,我正在寻找一个显示右图优于左图的分数。

4

2 回答 2

5

R 平方给出了线的拟合优度,即由线性模型解释的数据集中变化的百分比。另一种解释 R 平方的方法是模型的性能比均值模型好多少。p 值给出了拟合的显着性,即线性模型的系数显着不同于零。

要提取这些值:

dat = data.frame(a = runif(100), b = runif(100))
lm_obj = lm(a~b, dat)
rsq = summary(lm_obj)[["r.squared"]]
p_value = summary(lm_obj)[["coefficients"]]["b","Pr(>|t|)"]

或者,您可以计算观测值与线性模型结果之间的 RMSE:

rmse = sqrt(mean((dat$a - predict(lm_obj))^2))

请注意,这是a线性模型的 RMSE。如果你想要 和 的aRMSE b

rmse = sqrt(mean((dat$a - dat$b)^2))
于 2013-01-29T10:29:01.907 回答
1

您可能正在寻找的是MAPE(平均绝对百分比误差)。它相对于其他精度度量(MSE、MPE、RMSE、MAE 等)的优势在于 MAPE 不依赖于电平,它测量的是绝对误差,并且具有明确的含义。您可以使用包forecast来获取其中一些措施:

library(forecast)
data <- data.frame(y = rnorm(100), x = rnorm(100))
model <- lm(y ~ x, data)
accuracy(model)
#           ME         RMSE          MAE          MPE         MAPE 
# 5.455773e-18 1.019446e+00 7.957585e-01 1.198441e+02 1.205495e+02 
accuracy(model)["MAPE"]
#     MAPE 
# 120.5495 

或者

mape <- function(f, x) mean(abs(1 - f / x) * 100)
mape(fitted(model), data$y)
# [1] 120.5495

另一方面,看起来MPE(平均百分比误差)更适合显示数据以预测线为中心的程度,例如让预测为p <- rep(2, 20)和数据,y <- rep(c(3,1), 10)然后是。MPE = 0MAPE = 100%

所以你应该决定你真正想要展示什么,MAPE 作为准确度的衡量标准更好,但对你来说,第二个例子 MPE 可能是更好的选择。

更新:如果它确实以您要检查的内容为中心,您应该查看没有任何平方、绝对值等的对误差求和的度量。也就是说,您可能还想查看 ME(平均误差),其中比 MPE 简单一点,但有不同的解释。这是一个与您的第一个示例有些相似的示例:

在此处输入图像描述

mpe <- function(f, x) mean((1 - f / x) * 100)
mape <- function(f, x) mean(abs(1 - f / x) * 100)
me <- function(f, x) mean(x - f)

set.seed(20130130)
y1 <- rnorm(1000, mean = 10, sd = 1.5) * (1:1000) / 300
y2 <- rnorm(1000, mean = 10, sd = 1.7) * (1:1000) / 250
pr <- (1:1000) / 30

data <- data.frame(y = c(y1, y2),
                   x = 1:1000,
                   prediction = rep(pr, 2),
                   id = rep(1:2, each = 1000))

results <- data.frame(MAPE = c(mape(pr, y1), mape(pr, y2)),
                      MPE = c(mpe(pr, y1), mpe(pr, y2)),
                      ME = c(me(pr, y1), me(pr, y2)),
                      id = 1:2)
results <- round(results, 2)

ggplot(data, aes(x, y)) + geom_line() + theme_bw() +
  facet_wrap(~ id) + geom_line(aes(y = prediction), colour = "red") +
  theme(strip.background = element_blank()) + labs(y = NULL, x = NULL) +
  geom_text(data = results, x = 150, y = 50, aes(label = paste("MAPE:", MAPE))) +
  geom_text(data = results, x = 150, y = 45, aes(label = paste("MPE:", MPE))) + 
  geom_text(data = results, x = 150, y = 40, aes(label = paste("ME:", ME)))
于 2013-01-29T13:49:05.200 回答