Добавление уравнения линии регрессии и R2 на графике

172

Интересно, как добавить уравнение линии регрессии и R ^ 2 на ggplot. Мой код

library(ggplot2)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
p <- ggplot(data = df, aes(x = x, y = y)) +
            geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
            geom_point()
p

Любая помощь будет высоко оценена.

  • 0
    Для решетчатой графики см. latticeExtra::lmlineq() .
Теги:
ggplot2
ggpmisc

4 ответа

185
Лучший ответ

Вот одно решение

# GET EQUATION AND R-SQUARED AS STRING
# SOURCE: http://goo.gl/K4yh

lm_eqn <- function(df){
    m <- lm(y ~ x, df);
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, 
         list(a = format(coef(m)[1], digits = 2), 
              b = format(coef(m)[2], digits = 2), 
             r2 = format(summary(m)$r.squared, digits = 3)))
    as.character(as.expression(eq));                 
}

p1 <- p + geom_text(x = 25, y = 300, label = lm_eqn(df), parse = TRUE)

ИЗМЕНИТЬ. Я понял источник, откуда я выбрал этот код. Вот ссылка в исходное сообщение в группах ggplot2 google

Изображение 4344

  • 1
    Комментарий @ JonasRaedle о том, как лучше получать тексты с annotate был верным на моей машине.
  • 2
    Это не похоже на опубликованный вывод на моем компьютере, где метка перезаписывается столько раз, сколько вызывается данных, в результате чего получается толстый и размытый текст метки. Передача меток в data.frame сначала работает (см. Мое предложение в комментарии ниже.
Показать ещё 5 комментариев
75

Я изменил несколько строк источника stat_smooth и связанных функций, чтобы создать новую функцию, которая добавляет уравнение соответствия и квадратичное значение R. Это также будет работать на графических сюжетах!

library(devtools)
source_gist("524eade46135f6348140")
df = data.frame(x = c(1:100))
df$y = 2 + 5 * df$x + rnorm(100, sd = 40)
df$class = rep(1:2,50)
ggplot(data = df, aes(x = x, y = y, label=y)) +
  stat_smooth_func(geom="text",method="lm",hjust=0,parse=TRUE) +
  geom_smooth(method="lm",se=FALSE) +
  geom_point() + facet_wrap(~class)

Изображение 4345

Я использовал код в ответ @Ramnath для форматирования уравнения. Функция stat_smooth_func не очень надежна, но с ней не должно быть трудно играть.

https://gist.github.com/kdauria/524eade46135f6348140. Попробуйте обновить ggplot2, если вы получите сообщение об ошибке.

  • 2
    Большое спасибо. Этот работает не только для граней, но даже для групп. Я считаю это очень полезным для stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE) регрессий, например, stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE) в сочетании с EvaluateSmooths из stackoverflow.com/questions/19735149/…
  • 0
    Я получаю 'Ошибка в eval (expr, envir, enclos): не могу найти функцию "eval", когда я пытаюсь найти функцию
Показать ещё 14 комментариев
65

Я изменил сообщение Ramnath на a) сделать более общий, поэтому он принимает линейную модель как параметр, а не кадр данных, и б) более негативно отображает негативы.

lm_eqn = function(m) {

  l <- list(a = format(coef(m)[1], digits = 2),
      b = format(abs(coef(m)[2]), digits = 2),
      r2 = format(summary(m)$r.squared, digits = 3));

  if (coef(m)[2] >= 0)  {
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,l)
  } else {
    eq <- substitute(italic(y) == a - b %.% italic(x)*","~~italic(r)^2~"="~r2,l)    
  }

  as.character(as.expression(eq));                 
}

Использование изменилось бы на:

p1 = p + geom_text(aes(x = 25, y = 300, label = lm_eqn(lm(y ~ x, df))), parse = TRUE)
  • 17
    Это выглядит великолепно! Но я строю geom_points на нескольких фасетах, где df отличается в зависимости от переменной фасета. Как я могу это сделать?
  • 23
    Решение Джейдена работает довольно хорошо, но шрифт выглядит очень некрасиво. Я бы порекомендовал изменить использование на это: p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE) edit: это также решает любые проблемы, которые могут возникнуть при отображении букв в легенде.
Показать ещё 3 комментария
62

Я включил статистику stat_poly_eq() в моем пакете ggpmisc который позволяет этот ответ:

library(ggplot2)
library(ggpmisc)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
my.formula <- y ~ x
p <- ggplot(data = df, aes(x = x, y = y)) +
   geom_smooth(method = "lm", se=FALSE, color="black", formula = my.formula) +
   stat_poly_eq(formula = my.formula, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE) +         
   geom_point()
p

Изображение 4346

Эта статистика работает с любым полиномом без отсутствующих терминов и, мы надеемся, обладает достаточной гибкостью, чтобы быть в целом полезной. R ^ 2 или скорректированные метки R ^ 2 могут использоваться с любой модельной формулой, снабженной lm(). Будучи статистикой ggplot, она ведет себя как ожидалось как с группами, так и с фасетками.

Пакет 'ggpmisc' доступен через CRAN.

Версия 0.2.6 была просто принята в CRAN.

Он обращается к комментариям @shabbychef и @MYaseen208.

@MYaseen208 показывает, как добавить шляпу.

library(ggplot2)
library(ggpmisc)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
my.formula <- y ~ x
p <- ggplot(data = df, aes(x = x, y = y)) +
   geom_smooth(method = "lm", se=FALSE, color="black", formula = my.formula) +
   stat_poly_eq(formula = my.formula,
                eq.with.lhs = "italic(hat(y))~'='~",
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE) +         
   geom_point()
p

Изображение 4347

@shabbychef Теперь можно сопоставить переменные в уравнении с теми, которые используются для меток оси. Чтобы заменить x с помощью z и y на h, вы должны использовать:

p <- ggplot(data = df, aes(x = x, y = y)) +
   geom_smooth(method = "lm", se=FALSE, color="black", formula = my.formula) +
   stat_poly_eq(formula = my.formula,
                eq.with.lhs = "italic(h)~'='~",
                eq.x.rhs = "~italic(z)",
                aes(label = ..eq.label..), 
                parse = TRUE) + 
   labs(x = expression(italic(z)), y = expression(italic(h))) +          
   geom_point()
p

Изображение 4348

Будучи этими нормальными R-выражениями, греческие буквы теперь могут также использоваться как в lhs, так и в rhs уравнения.

[2017-03-08] @elarry Изменить, чтобы более точно задать исходный вопрос, показывая, как добавить запятую между equation- и R2-метками.

p <- ggplot(data = df, aes(x = x, y = y)) +
  geom_smooth(method = "lm", se=FALSE, color="black", formula = my.formula) +
  stat_poly_eq(formula = my.formula,
               eq.with.lhs = "italic(hat(y))~'='~",
               aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~")), 
               parse = TRUE) +         
  geom_point()
p

Изображение 4349

  • 0
    Следует отметить, что x и y в формуле относятся к данным x и y в слоях графика, а не обязательно к my.formula в момент my.formula . Таким образом, формула всегда должна использовать переменные x и y?
  • 0
    Совершенно верно, что x и y относятся к любым переменным, отображаемым в эту эстетику. Это ожидание также для geom_smooth () и того, как работает грамматика графики. Было бы яснее использовать разные имена внутри фрейма данных, но я просто сохранил их, как в первоначальном вопросе.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню