Какова мера того, насколько хорошо данные * сосредоточены * на линии прогнозирования в LM

У меня есть два набора данных, с которыми я рисую, используя R lm . Первый нижеприведенный график не ориентирован на красную линию. Но второй график справа центрирован по линии.

Data1 Data2

Мои вопросы:

  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;

Update Plot with RMSE Score:

F1g1 enter image description here

Я ищу оценку, которая показывает, что правильная фигура лучше, чем левая, основываясь на центрировании данных по линии прогноза.

3
nl ja de
Возможно, было бы полезно определить, что вы подразумеваете под «по центру». Каково концептуальное и математическое определение этой идеи? Это просто модель с более низкими остатками?
добавлено автор Bryan Hanson, источник

2 ответы

R-квадрат дает хорошее соответствие линии, т. Е. Процент изменения в наборе данных, который объясняется линейной моделью. Еще один способ объяснить R-квадрат - насколько лучше модель работает, чем средняя модель. Значения p-значения дают значение fit, т. Е. Коэффициент линейной модели, существенно отличающийся от нуля.

Чтобы извлечь эти значения:

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

Обратите внимание, что это RMSE a и линейная модель. Если вы хотите RMSE a и b :

rmse = sqrt(mean((dat$a - dat$b)^2))
5
добавлено
Вместо этого используйте RMSE, см. Мой ответ.
добавлено автор Paul Hiemstra, источник
Сделайте свой пример воспроизводимым ... у нас нет доступа к myfile.txt .
добавлено автор Paul Hiemstra, источник
Кроме того, я думаю, что вы ищете RMSE между dat1x и dat1y . RMSE I, показанный выше, находится между dat1y и линией регрессии, то есть rmse = sqrt (mean ((dat1x - dat1y) ^ 2)) . Обратите внимание, что это не измеряет распространение линейной модели, а распространяется между двумя векторами dat1x и dat1y . Пожалуйста, будьте более подробными и объясните, что вы хотите.
добавлено автор Paul Hiemstra, источник
Благодарю. Но если вы посмотрите на эту цифру R ^ 2 для левого рисунка выше правой фигуры, все же фигура справа показала, что данные более центрированы, чем левые.
добавлено автор neversaint, источник
@PH: Кажется, RMSE не отражает, насколько хорошо представлены данные centered по отношению к линии прогнозирования (см. Мои обновленные цифры). Я неправильно понял вас?
добавлено автор neversaint, источник

То, что вы, возможно, ищете, - MAPE (средняя абсолютная процентная ошибка). Его преимущества перед другими мерами точности (MSE, MPE, RMSE, MAE и т. Д.) Заключаются в том, что MAPE не зависит от уровней, он измеряет ошибки absolute и имеет четкое значение. Вы можете использовать пакет прогноз , чтобы получить некоторые из этих мер:

library(fилиecast)
data <- data.frame(y = rnилиm(100), x = rnилиm(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

On the other hand, it might look that MPE (Mean percentage errили) is better fили showing how well data is centered around the prediction line, e.g. let prediction be p <- rep(2, 20) and data y <- rep(c(3,1), 10), then MPE = 0 but MAPE = 100%.

So you should decide what you really want to show, MAPE is better as a measure of accuracy, but fили you second example MPE might be a better choice.

Update: in case it really is centering what you want to check, you should look at measures that sum errилиs without any squares, absolute values, etc. That is, you also might want to take a look at ME (Mean errили), which is a bit simpler than MPE, but has different interpretation. Here is an example somewhat similar to the first one of yours:

enter image description here

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 <- rnилиm(1000, mean = 10, sd = 1.5) * (1:1000)/300
y2 <- rnилиm(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)))
1
добавлено