[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 말의와 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
이러한 정규 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')
답변
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