Gostaria de saber como adicionar a equação da 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.
r
ggplot2
linear-regression
r-faq
MYaseen208
fonte
fonte
latticeExtra::lmlineq()
.Respostas:
Aqui está uma solução
EDITAR. Eu descobri a fonte de onde eu escolhi esse código. Aqui está o link para a postagem original nos grupos do Google ggplot2
fonte
annotate
estava correto na minha máquina.aes(
e o correspondente)
.aes
é para mapear variáveis do quadro de dados para variáveis visuais - isso não é necessário aqui, pois há apenas uma instância, para que você possa colocar tudo nageom_text
chamada principal . Vou editar isso na resposta.Eu incluí uma estatística
stat_poly_eq()
no meu pacoteggpmisc
que permite esta resposta:Essa estatística funciona com qualquer polinômio sem termos ausentes e, esperançosamente, possui flexibilidade suficiente para ser geralmente útil. As etiquetas R ^ 2 ou R ^ 2 ajustadas podem ser usadas com qualquer fórmula de modelo equipada com lm (). Sendo uma estatística ggplot, ela se comporta conforme o esperado, tanto em grupos quanto em facetas.
O pacote 'ggpmisc' está disponível no CRAN.
A versão 0.2.6 foi aceita no CRAN.
Ele aborda os comentários de @shabbychef e @ MYaseen208.
@ MYaseen208 mostra como adicionar um chapéu .
@shabbychef Agora é possível combinar as variáveis na equação com as utilizadas para os rótulos dos eixos. Para substituir x por dizer z e y por h , usaria:
Sendo essas expressões R analisadas normais, as letras gregas também podem agora ser usadas nos lhs e rhs da equação.
[08-03-2017] @elarry Edite para abordar com mais precisão a pergunta original, mostrando como adicionar uma vírgula entre os rótulos de equação e R2.
[2019-10-20] @ helen.h A seguir, exemplos de uso de
stat_poly_eq()
com agrupamento.[2020-01-21] @Herman Pode ser um pouco contra-intuitivo à primeira vista, mas para obter uma única equação ao usar o agrupamento, é necessário seguir a gramática dos gráficos. Restrinja o mapeamento que cria o agrupamento para camadas individuais (mostradas abaixo) ou mantenha o mapeamento padrão e substitua-o por um valor constante na camada em que você não deseja o agrupamento (por exemplo
colour = "black"
).Continuando do exemplo anterior.
[2020-01-22] Para completar, um exemplo com facetas, demonstrando que também nesse caso as expectativas da gramática dos gráficos são cumpridas.
fonte
x
ey
na fórmula se referem aos dadosx
ey
nas camadas do gráfico, e não necessariamente aos que estão no escopo no momentomy.formula
. Assim, a fórmula deve sempre usar variáveis x e y?x
e sey
referem às variáveis que estão mapeadas para essa estética. Essa é a expectativa também para geom_smooth () e como a gramática dos gráficos funciona. Poderia ter sido mais claro usar nomes diferentes dentro do quadro de dados, mas apenas os mantive como na pergunta original.ggpmisc
. Obrigado pela sugestão!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
faz o trabalho.stat_poly_eq()
. Você também pode usar ostat_fit_glance()
pacote 'ggpmisc', que retorna R2 como um valor numérico. Veja exemplos na página de ajuda e substituastat(r.squared)
porsqrt(stat(r.squared))
.Alterei algumas linhas da fonte
stat_smooth
e das funções relacionadas para criar uma nova função que adiciona a equação de ajuste e o valor de R ao quadrado. Isso também funcionará em gráficos de faceta!Eu usei o código na resposta de @ Ramnath para formatar a equação. A
stat_smooth_func
função não é muito robusta, mas não deve ser difícil brincar com ela.https://gist.github.com/kdauria/524eade46135f6348140 . Tente atualizar
ggplot2
se você receber um erro.fonte
stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE)
, em combinação com EvaluateSmooths de stackoverflow.com/questions/19735149/…source
o arquivo inteiro em seu script.xpos
eypos
argumentos da função no Gist. Então, se você quiser que todas as equações se sobreponham, basta definirxpos
eypos
. Caso contrário,xpos
eypos
são calculados a partir dos dados. Se você deseja algo mais sofisticado, não deve ser muito difícil adicionar alguma lógica dentro da função. Por exemplo, talvez você possa escrever uma função para determinar qual parte do gráfico tem mais espaço vazio e colocar a função lá.Modifiquei o post de Ramnath para: a) tornar mais genérico para que ele aceite um modelo linear como parâmetro, em vez do quadro de dados eb) exiba os negativos de maneira mais apropriada.
O uso mudaria para:
fonte
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
edit: isso também resolve qualquer problema que você possa ter com as letras que aparecem na sua legenda."cannot coerce class "lm" to a data.frame"
. Esta alternativa funciona:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
ep <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
ligasse com a solução de Ramnath. Você provavelmente já tentou este depois de tentar que um, mas esqueceu-se de garantir que você redefiniulm_eqn
realmente amo a solução @Ramnath. Para permitir o uso para personalizar a fórmula de regressão (em vez de fixos como yex como nomes de variáveis literais) e também adicionar o valor p na impressão (como @Jerry T comentou), aqui está o mod:
Infelizmente, isso não funciona com facet_wrap ou facet_grid.
fonte
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
antes do geom_point ()? Uma pergunta semi-relacionada - se nos referirmos a hp e wt noaes()
for ggplot, podemos pegá- los para usar na chamada paralm_eqn
, então precisamos codificar apenas em um lugar? Eu sei que poderíamos configurarxvar = "hp"
antes da chamada ggplot () e usar xvar nos dois locais para substituir o hp , mas isso parece que deve ser desnecessário.Usando ggpubr :
fonte
label.y
?label.y = max(df$y) * 0.8
Aqui está o código mais simples para todos
Nota: Mostrando Rho de Pearson e não R ^ 2.
fonte
Inspirado no estilo de equação fornecido nesta resposta , uma abordagem mais genérica (mais de um preditor + saída de látex como opção) pode ser:
O
model
argumento espera umlm
objeto, olatex
argumento é um booleano para solicitar um caractere simples ou uma equação em formato de látex, e o...
argumento passa seus valores para o parâmetroformat
função.Também adicionei uma opção para produzi-lo como látex, para que você possa usar esta função em um rmarkdown como este:
Agora usando:
Este código produz:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
E se pedirmos uma equação do látex, arredondar os parâmetros para 3 dígitos:
Isso produz:
fonte
Tenho uma dúvida, como colocar uma estatística significativa de t.test para bheta na equação, usando
ggpmisc::stat_poly_eq()
?ex:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
fonte