[r] 그래프에 회귀선 방정식 및 R ^ 2 추가

에 회귀선 방정식과 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

도움을 주시면 감사하겠습니다.



답변

여기에 하나의 해결책이 있습니다.

# GET EQUATION AND R-SQUARED AS STRING
# SOURCE: https://groups.google.com/forum/#!topic/ggplot2/1TgH-kG5XMA

lm_eqn <- function(df){
    m <- lm(y ~ x, df);
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
         list(a = format(unname(coef(m)[1]), digits = 2),
              b = format(unname(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 그룹의 원래 게시물에 대한 링크입니다.

산출


답변

이 답변을 허용 하는 통계 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

여기에 이미지 설명을 입력하십시오

이 통계는 누락 된 항이없는 다항식과 함께 작동하며 일반적으로 유용 할만큼 충분한 유연성을 갖기를 바랍니다. 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

여기에 이미지 설명을 입력하십시오

@shabbychef 이제 방정식의 변수를 축 레이블에 사용 된 변수와 일치시킬 수 있습니다. 바꾸기하려면 X 말의와 ZYH 사람이 사용하는 것을 :

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

여기에 이미지 설명을 입력하십시오

이러한 정규 R 구문 분석 된 표현식이므로 이제 그리스 문자를 방정식의 lhs와 rhs 모두에 사용할 수 있습니다.

[2017-03-08] @elarry 수식과 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

여기에 이미지 설명을 입력하십시오

[2019-10-20] @ helen.h 아래 stat_poly_eq()는 그룹화와 함께 사용하는 예입니다 .

library(ggpmisc)
df <- data.frame(x = c(1:100))
df$y <- 20 * c(0, 1) + 3 * df$x + rnorm(100, sd = 40)
df$group <- factor(rep(c("A", "B"), 50))
my.formula <- y ~ x
p <- ggplot(data = df, aes(x = x, y = y, colour = group)) +
  geom_smooth(method = "lm", se=FALSE, formula = my.formula) +
  stat_poly_eq(formula = my.formula,
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
               parse = TRUE) +
  geom_point()
p

p <- ggplot(data = df, aes(x = x, y = y, linetype = group)) +
  geom_smooth(method = "lm", se=FALSE, formula = my.formula) +
  stat_poly_eq(formula = my.formula,
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
               parse = TRUE) +
  geom_point()
p

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

[2020-01-21] @Herman 첫눈에 반 직관적 일 수 있지만 그룹화를 사용할 때 단일 방정식을 얻으려면 그래픽 문법을 따라야합니다. 그룹화를 생성하는 매핑을 개별 레이어로 제한하거나 (아래 그림 참조) 기본 매핑을 유지하고 그룹화를 원하지 않는 레이어의 상수 값으로 덮어 씁니다 (예 :colour = "black" .

이전 예제에서 계속.

p <- ggplot(data = df, aes(x = x, y = y)) +
  geom_smooth(method = "lm", se=FALSE, formula = my.formula) +
  stat_poly_eq(formula = my.formula,
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
               parse = TRUE) +
  geom_point(aes(colour = group))
p

여기에 이미지 설명을 입력하십시오

[2020-01-22] 완전성을 위해 패싯을 사용한 예를 들어,이 경우에도 그래픽 문법의 기대가 충족됨을 보여줍니다.

library(ggpmisc)
df <- data.frame(x = c(1:100))
df$y <- 20 * c(0, 1) + 3 * df$x + rnorm(100, sd = 40)
df$group <- factor(rep(c("A", "B"), 50))
my.formula <- y ~ x

p <- ggplot(data = df, aes(x = x, y = y)) +
  geom_smooth(method = "lm", se=FALSE, formula = my.formula) +
  stat_poly_eq(formula = my.formula,
               aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
               parse = TRUE) +
  geom_point() +
  facet_wrap(~group)
p

여기에 이미지 설명을 입력하십시오


답변

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)

여기에 이미지 설명을 입력하십시오

@Ramnath의 답변에있는 코드를 사용하여 방정식을 형식화했습니다. 이 stat_smooth_func기능은 그다지 강력하지는 않지만 놀아서는 안됩니다.

https://gist.github.com/kdauria/524eade46135f6348140 . ggplot2오류가 발생하면 업데이트를 시도하십시오 .


답변

Ramnath의 게시물을 a) 더 일반화하여 데이터 프레임이 아닌 선형 모델을 매개 변수로 허용하고 b) 음수를보다 적절하게 표시하도록 수정했습니다.

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)


답변

@Ramnath 솔루션을 정말 좋아합니다. 리터럴 변수 이름으로 y 및 x로 고정되는 대신 회귀 수식을 사용자 정의하고 인쇄물에 p- 값을 추가하기 위해 @Jerry T가 주석을 추가하는 데 사용하려면 다음과 같은 모드가 있습니다.

lm_eqn <- function(df, y, x){
    formula = as.formula(sprintf('%s ~ %s', y, x))
    m <- lm(formula, data=df);
    # formating the values into a summary string to print out
    # ~ give some space, but equal size and comma need to be quoted
    eq <- substitute(italic(target) == a + b %.% italic(input)*","~~italic(r)^2~"="~r2*","~~p~"="~italic(pvalue),
         list(target = y,
              input = x,
              a = format(as.vector(coef(m)[1]), digits = 2),
              b = format(as.vector(coef(m)[2]), digits = 2),
             r2 = format(summary(m)$r.squared, digits = 3),
             # getting the pvalue is painful
             pvalue = format(summary(m)$coefficients[2,'Pr(>|t|)'], digits=1)
            )
          )
    as.character(as.expression(eq));
}

geom_point() +
  ggrepel::geom_text_repel(label=rownames(mtcars)) +
  geom_text(x=3,y=300,label=lm_eqn(mtcars, 'hp','wt'),color='red',parse=T) +
  geom_smooth(method='lm')

여기에 이미지 설명을 입력하십시오
불행히도, 이것은 facet_wrap 또는 facet_grid에서 작동하지 않습니다.


답변

ggpubr 사용 :

library(ggpubr)

# reproducible data
set.seed(1)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)

# By default showing Pearson R
ggscatter(df, x = "x", y = "y", add = "reg.line") +
  stat_cor(label.y = 300) +
  stat_regline_equation(label.y = 280)

여기에 이미지 설명을 입력하십시오

# Use R2 instead of R
ggscatter(df, x = "x", y = "y", add = "reg.line") +
  stat_cor(label.y = 300,
           aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~"))) +
  stat_regline_equation(label.y = 280)

## compare R2 with accepted answer
# m <- lm(y ~ x, df)
# round(summary(m)$r.squared, 2)
# [1] 0.85

여기에 이미지 설명을 입력하십시오


답변

모든 사람을위한 가장 간단한 코드는 다음과 같습니다.

참고 : R ^ 2가 아닌 Pearson의 Rho를 표시 합니다.

library(ggplot2)
library(ggpubr)

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()+
        stat_cor(label.y = 35)+ #this means at 35th unit in the y axis, the r squared and p value will be shown
        stat_regline_equation(label.y = 30) #this means at 30th unit regresion line equation will be shown

p

내 데이터 세트가있는 그러한 예