Je me demande comment ajouter l'équation de la ligne de régression et R ^ 2 sur le ggplot
. Mon code est:
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
Toute aide sera grandement appréciée.
r
ggplot2
linear-regression
r-faq
MYaseen208
la source
la source
latticeExtra::lmlineq()
.Réponses:
Voici une solution
ÉDITER. J'ai trouvé la source d'où j'ai choisi ce code. Voici le lien vers le message d'origine dans les groupes Google ggplot2
la source
annotate
était correct sur ma machine.aes(
et le correspondant)
.aes
sert à mapper des variables de trame de données à des variables visuelles - ce n'est pas nécessaire ici, car il n'y a qu'une seule instance, vous pouvez donc tout mettre dans l'geom_text
appel principal . Je vais modifier cela dans la réponse.J'ai inclus une statistique
stat_poly_eq()
dans mon packageggpmisc
qui permet cette réponse:Cette statistique fonctionne avec tout polynôme sans termes manquants et, espérons-le, a suffisamment de flexibilité pour être généralement utile. Les étiquettes R ^ 2 ou R ^ 2 ajustées peuvent être utilisées avec n'importe quelle formule de modèle équipée de lm (). Étant une statistique ggplot, elle se comporte comme prévu à la fois avec les groupes et les facettes.
Le package 'ggpmisc' est disponible via CRAN.
La version 0.2.6 vient d'être acceptée au CRAN.
Il répond aux commentaires de @shabbychef et @ MYaseen208.
@ MYaseen208 cela montre comment ajouter un chapeau .
@shabbychef Il est maintenant possible de faire correspondre les variables de l'équation à celles utilisées pour les étiquettes d'axe. Pour remplacer le x par disons z et y par h, on utiliserait:
Étant ces expressions R normales, les lettres grecques peuvent désormais être utilisées à la fois dans les lhs et les rhs de l'équation.
[08/03/2017] @elarry Edit pour répondre plus précisément à la question d'origine, montrant comment ajouter une virgule entre l'équation et les étiquettes R2.
[2019-10-20] @ helen.h Je donne ci-dessous des exemples d'utilisation de
stat_poly_eq()
avec groupement.[2020-01-21] @Herman Cela peut être un peu contre-intuitif à première vue, mais pour obtenir une seule équation lors de l'utilisation du regroupement, il faut suivre la grammaire des graphiques. Limitez le mappage qui crée le regroupement à des calques individuels (illustré ci-dessous) ou conservez le mappage par défaut et remplacez-le par une valeur constante dans le calque où vous ne souhaitez pas le regroupement (par exemple
colour = "black"
).Suite de l'exemple précédent.
[2020-01-22] Par souci d'exhaustivité un exemple à facettes, démontrant que dans ce cas également les attentes de la grammaire des graphismes sont remplies.
la source
x
ety
dans la formule se réfèrent aux donnéesx
ety
dans les couches de l'intrigue, et pas nécessairement à celles de la portée au moment de lamy.formula
construction. Ainsi, la formule devrait toujours utiliser des variables x et y?x
et sey
réfèrent aux variables qui sont mappées à ces esthétiques. C'est l'attente également pour geom_smooth () et comment fonctionne la grammaire des graphiques. Il aurait pu être plus clair d'utiliser des noms différents dans le bloc de données, mais je les ai simplement conservés comme dans la question d'origine.ggpmisc
. Merci pour la suggestion!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
faisait l'affaire.stat_poly_eq()
. Vous pouvez utiliserstat_fit_glance()
, également à partir du package 'ggpmisc', qui retourne R2 comme valeur numérique. Consultez les exemples dans la page d'aide et remplacez-lesstat(r.squared)
parsqrt(stat(r.squared))
.J'ai changé quelques lignes de la source des
stat_smooth
fonctions associées pour créer une nouvelle fonction qui ajoute l'équation d'ajustement et la valeur R au carré. Cela fonctionnera également sur les tracés à facettes!J'ai utilisé le code dans la réponse de @ Ramnath pour formater l'équation. La
stat_smooth_func
fonction n'est pas très robuste, mais il ne devrait pas être difficile de jouer avec.https://gist.github.com/kdauria/524eade46135f6348140 . Essayez de mettre à jour
ggplot2
si vous obtenez une erreur.la source
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 combinaison avec EvaluateSmooths de stackoverflow.com/questions/19735149/…source
le fichier entier dans votre script.xpos
et desypos
arguments de la fonction dans le Gist. Donc, si vous voulez que toutes les équations se chevauchent, définissez simplementxpos
etypos
. Sinon,xpos
etypos
sont calculés à partir des données. Si vous voulez quelque chose de plus sophistiqué, il ne devrait pas être trop difficile d'ajouter de la logique à l'intérieur de la fonction. Par exemple, vous pourriez peut-être écrire une fonction pour déterminer quelle partie du graphique a l'espace le plus vide et y placer la fonction.J'ai modifié le post de Ramnath pour a) rendre plus générique afin qu'il accepte un modèle linéaire comme paramètre plutôt que le bloc de données et b) affiche les négatifs de manière plus appropriée.
L'utilisation changerait en:
la source
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
edit: cela résout également tous les problèmes que vous pourriez avoir avec les lettres apparaissant dans votre légende."cannot coerce class "lm" to a data.frame"
. Cette alternative fonctionne:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
etp <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
appeliez avec la solution de Ramnath. Vous avez probablement essayé celui-ci après avoir essayé celui-ci, mais vous avez oublié de vous assurer que vous aviez redéfinilm_eqn
J'adore vraiment la solution @Ramnath. Pour autoriser l'utilisation pour personnaliser la formule de régression (au lieu de la fixer comme y et x comme noms de variables littérales), et ajouter la valeur p dans l'impression également (comme l'a commenté @Jerry T), voici le mod:
Malheureusement, cela ne fonctionne pas avec facet_wrap ou facet_grid.
la source
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
avant le geom_point ()? Une question semi-liée - si nous nous référons à hp et wt dans leaes()
for ggplot, pouvons-nous alors les saisir pour les utiliser dans l'appel àlm_eqn
, donc nous n'avons qu'à coder en un seul endroit? Je sais que nous pourrions configurerxvar = "hp"
avant l'appel à ggplot () et utiliser xvar dans les deux emplacements pour remplacer hp , mais cela semble être inutile.Utilisation de ggpubr :
la source
label.y
?label.y = max(df$y) * 0.8
Voici le code le plus simple pour tout le monde
Remarque: montrant Rho de Pearson et non R ^ 2.
la source
Inspirée par le style d'équation fourni dans cette réponse , une approche plus générique (plus d'un prédicteur + sortie latex en option) peut être:
L'
model
argument attend unlm
objet, l'latex
argument est un booléen pour demander un caractère simple ou une équation au format latex, et l'...
argument transmet ses valeurs à laformat
fonction.J'ai également ajouté une option pour le produire sous forme de latex afin que vous puissiez utiliser cette fonction dans un rmarkdown comme celui-ci:
Maintenant, je l'utilise:
Ce code donne:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
Et si nous demandons une équation en latex, en arrondissant les paramètres à 3 chiffres:
Cela donne:
la source
J'ai un doute, comment mettre une statistique significative de t.test pour bheta dans l'équation, en utilisant
ggpmisc::stat_poly_eq()
?ex:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
la source