Adicionando a Equação da Linha de Regressão e R2 no gráfico

Gostaria de saber como adicionar a equação de linha de regressão e R ^ 2 no ggplot . Meu código é

 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 

Qualquer ajuda será muito apreciada.

Aqui está uma solução

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

EDITAR. Eu descobri a fonte de onde eu peguei esse código. Aqui está o link para o post original nos grupos do google ggplot2

Saída

Eu mudei algumas linhas da fonte de stat_smooth e funções relacionadas para fazer uma nova function que adiciona a equação de ajuste e o valor de R ao quadrado. Isso também funcionará em charts facetados!

 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) 

insira a descrição da imagem aqui

Eu usei o código na resposta do @ Ramnath para formatar a equação. A function stat_smooth_func não é muito robusta, mas não deve ser difícil brincar com ela.

https://gist.github.com/kdauria/524eade46135f6348140 . Tente atualizar o ggplot2 se você receber um erro.

Eu modifiquei a postagem de Ramnath para a) tornar mais genérica, por isso aceita um modelo linear como um parâmetro em vez do quadro de dados e b) exibe os negativos de maneira mais apropriada.

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

O uso mudaria para:

 p1 = p + geom_text(aes(x = 25, y = 300, label = lm_eqn(lm(y ~ x, df))), parse = TRUE) 

Eu incluí uma estatística stat_poly_eq() no meu pacote ggpmisc que permite esta resposta:

 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 

insira a descrição da imagem aqui

Essa estatística funciona com qualquer polinômio sem termos ausentes e, espera-se, tem flexibilidade suficiente para ser geralmente útil. As etiquetas R ^ 2 ou R ^ 2 ajustadas podem ser usadas com qualquer fórmula de modelo ajustada com lm ​​(). Sendo uma estatística ggplot, ela se comporta como esperado, tanto em grupos quanto em facetas.

O pacote 'ggpmisc' está disponível no CRAN.

A versão 0.2.6 acabou de ser aceita no CRAN.

Ele aborda os comentários de @shabbychef e @ MYaseen208.

@ MYaseen208 mostra como adicionar um chapéu .

 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 

insira a descrição da imagem aqui

@shabbychef Agora é possível combinar as variables ​​na equação com aquelas usadas para os labels dos eixos. Para replace o x com sayz e y por h , usaria:

 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 

insira a descrição da imagem aqui

Sendo essas expressões normais, as letras gregas agora também podem ser usadas tanto no lhs como no rhs da equação.

[2017-03-08] @elarry Edit para abordar com mais precisão a pergunta original, mostrando como adicionar uma vírgula entre os labels de equação e 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 

insira a descrição da imagem aqui

realmente amo a solução @Ramnath. Para permitir o uso para personalizar a fórmula de regressão (em vez de fixas como y e x como nomes de variables ​​literais), e incluímos o valor p na impressão também (como @Jerry T comentou), aqui está o mod:

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

insira a descrição da imagem aqui Infelizmente, isso não funciona com facet_wrap ou facet_grid.