Zastanawiam się, jak dodać równanie linii regresji i R ^ 2 na ggplot
. Mój kod to:
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
Jakakolwiek pomoc będzie doceniona.
r
ggplot2
linear-regression
r-faq
MYaseen208
źródło
źródło
latticeExtra::lmlineq()
.Odpowiedzi:
Oto jedno rozwiązanie
EDYTOWAĆ. Zrozumiałem źródło, z którego wybrałem ten kod. Oto link do oryginalnego postu w grupach google ggplot2
źródło
annotate
był poprawny na moim komputerze.aes(
i odpowiedni)
.aes
służy do mapowania zmiennych ramki danych na zmienne wizualne - tutaj nie jest to potrzebne, ponieważ jest tylko jedna instancja, więc możesz umieścić to wszystko w głównymgeom_text
wywołaniu. Zmienię to w odpowiedzi.stat_poly_eq()
W swoim pakiecie umieściłem statystyki ,ggpmisc
które pozwalają na tę odpowiedź:Ta statystyka działa z dowolnym wielomianem bez brakujących terminów i, mam nadzieję, ma wystarczającą elastyczność, aby być ogólnie użytecznym. Etykiety R ^ 2 lub dostosowane R ^ 2 mogą być używane z dowolną formułą modelu wyposażoną w lm (). Będąc statystyką ggplot, zachowuje się zgodnie z oczekiwaniami zarówno w przypadku grup, jak i aspektów.
Pakiet „ggpmisc” jest dostępny za pośrednictwem CRAN.
Wersja 0.2.6 została właśnie zaakceptowana do CRAN.
Adresuje komentarze @shabbychef i @ MYaseen208.
@ MYaseen208 pokazuje, jak dodać kapelusz .
@shabbychef Teraz można dopasować zmienne w równaniu do zmiennych używanych dla etykiet osi. Zastąpić X powiedzmy z Z i Y, z h można by wykorzystać:
Będąc tymi normalnymi wyrażeniami R, pisma greckie mogą być teraz używane zarówno w lewej, jak i prawej stronie równania.
[2017-03-08] @elarry Edytuj, aby dokładniej odpowiedzieć na oryginalne pytanie, pokazując, jak dodać przecinek między etykietami równania i R2.
[2019-10-20] @ helen.h Podam poniżej przykłady użycia
stat_poly_eq()
z grupowaniem.[2020-01-21] @Herman Na pierwszy rzut oka może to być nieco sprzeczne z intuicją, ale aby uzyskać jedno równanie podczas korzystania z grupowania, należy postępować zgodnie z gramatyką grafiki. Ogranicz mapowanie, które tworzy grupowanie do poszczególnych warstw (pokazane poniżej), lub zachowaj domyślne mapowanie i zastąp je stałą wartością w warstwie, w której nie chcesz grupowania (np
colour = "black"
.).Kontynuując z poprzedniego przykładu.
[2020-01-22] Dla kompletności przykład z aspektami, pokazujący, że również w tym przypadku oczekiwania gramatyki grafiki są spełnione.
źródło
x
iy
we wzorze odnoszą się dox
iy
danych w warstwach wykresu, a niekoniecznie do tych, które w tym czasiemy.formula
są konstruowane. Zatem formuła powinna zawsze używać zmiennych xiy?x
iy
odnoszą się do dowolnych zmiennych są mapowane do tych estetyki. Jest to oczekiwanie również dla geom_smooth () i tego, jak działa gramatyka grafiki. Używanie różnych nazw w ramce danych mogło być łatwiejsze, ale zachowałem je tak, jak w pierwotnym pytaniu.ggpmisc
. Dzieki za sugestie!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
działa.stat_poly_eq()
. Możesz użyćstat_fit_glance()
również z pakietu „ggpmisc”, który zwraca R2 jako wartość liczbową. Zobacz przykłady na stronie pomocy i zamieństat(r.squared)
nasqrt(stat(r.squared))
.Zmieniłem kilka wierszy źródła
stat_smooth
i powiązanych funkcji, aby utworzyć nową funkcję, która dodaje równanie dopasowania i wartość R do kwadratu. Działa to również na wykresach aspektów!Użyłem kodu w odpowiedzi @ Ramnatha, aby sformatować równanie. Ta
stat_smooth_func
funkcja nie jest bardzo niezawodna, ale nie powinno być trudno się nią bawić.https://gist.github.com/kdauria/524eade46135f6348140 . Spróbuj zaktualizować,
ggplot2
jeśli pojawi się błąd.źródło
stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE)
W połączeniu z EvaluateSmooths z stackoverflow.com/questions/19735149/…source
cały plik w skrypcie.xpos
iypos
argumenty funkcji w Gist. Więc jeśli chcesz, aby wszystkie równania zachodziły na siebie, po prostu ustawxpos
iypos
. W przeciwnym raziexpos
iypos
są obliczane na podstawie danych. Jeśli chcesz czegoś bardziej wymyślnego, dodanie logiki wewnątrz funkcji nie powinno być zbyt trudne. Na przykład, być może mógłbyś napisać funkcję określającą, która część wykresu ma najwięcej pustej przestrzeni i umieścić tam funkcję.Zmodyfikowałem post Ramnatha na a) uczynić bardziej ogólnym, więc akceptuje model liniowy jako parametr, a nie ramkę danych, i b) wyświetla odpowiednio negatywy.
Użycie zmieni się na:
źródło
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
edytuj: rozwiązuje to również wszelkie problemy z literami pojawiającymi się w legendzie."cannot coerce class "lm" to a data.frame"
. Ta alternatywa działa:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
ip <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
z rozwiązaniem Ramnatha. Prawdopodobnie próbowałeś tego po wypróbowaniu, ale zapomniałeś upewnić się, że przedefiniowałeślm_eqn
naprawdę kocham rozwiązanie @Ramnath. Aby umożliwić użycie w celu dostosowania formuły regresji (zamiast ustalonej jako y i x jako dosłowne nazwy zmiennych) i dodania wartości p również do wydruku (jak skomentował @Jerry T), oto mod:
Niestety nie działa to z facet_wrap ani facet_grid.
źródło
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
przed geom_point ()? Semi-pokrewne pytanie - jeśli odwołujemy się do KM i wag waes()
dla ggplot, możemy chwycić je używać w wywołaniulm_eqn
, tak to mamy tylko do kodu w jednym miejscu? Wiem, że moglibyśmy skonfigurowaćxvar = "hp"
przed wywołaniem ggplot () i użyć xvara w obu lokalizacjach, aby zastąpić hp , ale wydaje się, że to powinno być niepotrzebne.Za pomocą ggpubr :
źródło
label.y
?label.y = max(df$y) * 0.8
Oto najprostszy kod dla każdego
Uwaga: Pokazuje Rho Pearsona, a nie R ^ 2.
źródło
Zainspirowany stylem równania podanym w tej odpowiedzi , bardziej ogólne podejście (więcej niż jeden predyktor + wyjście lateksu jako opcja) może być:
model
Argumentem oczekujelm
cel,latex
argument jest logiczna, aby poprosić o charakterze prostego równania lub lateksu sformatowany, a...
argumentem przekazać swoje wartości doformat
funkcji.Dodałem również opcję wyświetlania go jako lateksu, abyś mógł użyć tej funkcji w rmarkdown jak poniżej:
Teraz go używam:
Ten kod daje:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
A jeśli poprosimy o równanie lateksowe, zaokrąglając parametry do 3 cyfr:
Daje to:
źródło
Mam wątpliwości, jak umieścić znamienne statystyki t.test dla bhety w równaniu, używając
ggpmisc::stat_poly_eq()
?dawny:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
źródło