Me pregunto cómo agregar la ecuación de línea de regresión y R ^ 2 en el ggplot
. Mi código es:
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
Cualquier ayuda será muy apreciada.
r
ggplot2
linear-regression
r-faq
MYaseen208
fuente
fuente
latticeExtra::lmlineq()
.Respuestas:
Aquí hay una solución
EDITAR. Descubrí la fuente de donde elegí este código. Aquí está el enlace a la publicación original en los grupos de ggplot2 google
fuente
annotate
era correcto en mi máquina.aes(
y el correspondiente)
.aes
es para asignar variables de marco de datos a variables visuales; eso no es necesario aquí, ya que solo hay una instancia, por lo que puede ponerlo todo en lageom_text
llamada principal . Editaré esto en la respuesta.Incluí una estadística
stat_poly_eq()
en mi paqueteggpmisc
que permite esta respuesta:Esta estadística funciona con cualquier polinomio sin términos faltantes, y con suerte tiene suficiente flexibilidad para ser generalmente útil. Las etiquetas R ^ 2 o R ^ 2 ajustadas se pueden usar con cualquier fórmula modelo equipada con lm (). Al ser una estadística ggplot, se comporta como se esperaba tanto con grupos como con facetas.
El paquete 'ggpmisc' está disponible a través de CRAN.
La versión 0.2.6 acaba de ser aceptada en CRAN.
Aborda los comentarios de @shabbychef y @ MYaseen208.
@ MYaseen208 esto muestra cómo agregar un sombrero .
@shabbychef Ahora es posible hacer coincidir las variables de la ecuación con las utilizadas para las etiquetas de eje. Para reemplazar la x con digamos z e y con h, se usaría:
Al ser estas expresiones analizadas en R normales, las letras griegas ahora también se pueden usar tanto en lhs como en rhs de la ecuación.
[2017-03-08] @elarry Edit para abordar con mayor precisión la pregunta original, que muestra cómo agregar una coma entre las etiquetas de ecuación y R2.
[2019-10-20] @ helen.h A continuación, doy ejemplos de uso de
stat_poly_eq()
agrupación.[2020-01-21] @Herman Puede ser un poco contraintuitivo a primera vista, pero para obtener una ecuación única cuando se usa la agrupación, uno debe seguir la gramática de los gráficos. Restrinja la asignación que crea la agrupación a capas individuales (que se muestra a continuación) o mantenga la asignación predeterminada y anúlela con un valor constante en la capa donde no desea la agrupación (por ejemplo
colour = "black"
).Continuando del ejemplo anterior.
[2020-01-22] En aras de la exhaustividad, un ejemplo con facetas, que demuestra que también en este caso se cumplen las expectativas de la gramática de los gráficos.
fuente
x
yy
en la fórmula se refieren a los datosx
yy
en las capas de la trama, y no necesariamente a aquellos en el alcance en el momento en quemy.formula
se construye. Entonces, ¿la fórmula siempre debe usar las variables x e y?x
y sey
refieren a las variables que se asignan a esta estética. Esa es la expectativa también para geom_smooth () y cómo funciona la gramática de los gráficos. Podría haber sido más claro usar diferentes nombres dentro del marco de datos, pero los mantuve como en la pregunta original.ggpmisc
. ¡Gracias por la sugerencia!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
hace el trabajo.stat_poly_eq()
. Puede usarstat_fit_glance()
, también del paquete 'ggpmisc', que devuelve R2 como un valor numérico. Vea ejemplos en la página de ayuda y reemplácelosstat(r.squared)
porsqrt(stat(r.squared))
.Cambié algunas líneas de la fuente de
stat_smooth
funciones relacionadas para crear una nueva función que agregue la ecuación de ajuste y el valor R al cuadrado. ¡Esto también funcionará en gráficos de facetas!Usé el código en la respuesta de @ Ramnath para formatear la ecuación. La
stat_smooth_func
función no es muy robusta, pero no debería ser difícil jugar con ella.https://gist.github.com/kdauria/524eade46135f6348140 . Intente actualizar
ggplot2
si obtiene un error.fuente
stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE)
, en combinación con EvaluateSmooths de stackoverflow.com/questions/19735149/…source
el archivo completo en su secuencia de comandos.xpos
yypos
argumentos de la función en el Gist. Entonces, si desea que todas las ecuaciones se superpongan, simplemente configurexpos
yypos
. De lo contrario,xpos
yypos
se calculan a partir de los datos. Si quieres algo más elegante, no debería ser demasiado difícil agregar algo de lógica dentro de la función. Por ejemplo, tal vez podría escribir una función para determinar qué parte del gráfico tiene el espacio más vacío y colocar la función allí.Modifiqué la publicación de Ramnath para a) hacer más genérico para que acepte un modelo lineal como parámetro en lugar del marco de datos yb) muestra los negativos de manera más adecuada.
El uso cambiaría a:
fuente
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
editar: esto también resuelve cualquier problema que pueda tener con las letras que aparecen en su leyenda."cannot coerce class "lm" to a data.frame"
. Esta alternativa funciona:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
yp <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
con la solución de Ramnath. Probablemente probaste este después de probarlo, pero olvidaste asegurarte de haber redefinidolm_eqn
Realmente amo la solución @Ramnath. Para permitir el uso de personalizar la fórmula de regresión (en lugar de fijarla como y y x como nombres de variables literales) y agregar el valor p también en la impresión (como comentó @Jerry T), aquí está el mod:
Desafortunadamente, esto no funciona con facet_wrap o facet_grid.
fuente
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
antes de geom_point ()? Una cuestión relacionada con la semi - si nos referimos a HP y peso en elaes()
de ggplot, entonces podemos agarrar a utilizar en la llamada alm_eqn
, por lo que entonces sólo tiene que codificar en un solo lugar? Sé que podríamos configurarxvar = "hp"
antes de la llamada a ggplot (), y usar xvar en ambas ubicaciones para reemplazar hp , pero parece que esto debería ser innecesario.Usando ggpubr :
fuente
label.y
?label.y = max(df$y) * 0.8
Aquí está el código más simple para todos
Nota: Mostrar Rho de Pearson y no R ^ 2.
fuente
Inspirado por el estilo de ecuación proporcionado en esta respuesta , un enfoque más genérico (más de un predictor + salida de látex como opción) puede ser:
El
model
argumento espera unlm
objeto, ellatex
argumento es un booleano para pedir un carácter simple o una ecuación con formato de látex, y el...
argumento pasa sus valores aformat
función.También agregué una opción para generarlo como latex para que pueda usar esta función en un rmarkdown como este:
Ahora usándolo:
Este código produce:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
Y si pedimos una ecuación de látex, redondeando los parámetros a 3 dígitos:
Esto produce:
fuente
Tengo una duda, ¿cómo poner en una ecuación estadísticas significativas de t.test para bheta, usando
ggpmisc::stat_poly_eq()
?ex:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
fuente