Saya ingin tahu bagaimana cara menambahkan persamaan garis regresi dan R ^ 2 pada ggplot
. Kode saya adalah:
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
Bantuan apa pun akan sangat dihargai.
r
ggplot2
linear-regression
r-faq
MYaseen208
sumber
sumber
latticeExtra::lmlineq()
.Jawaban:
Inilah salah satu solusinya
EDIT. Saya menemukan sumber dari mana saya mengambil kode ini. Berikut ini tautan ke pos asli di grup google ggplot2
sumber
annotate
sudah benar di mesin saya.aes(
dan yang sesuai)
.aes
adalah untuk memetakan variabel kerangka data ke variabel visual - itu tidak diperlukan di sini, karena hanya ada satu contoh, sehingga Anda dapat menempatkan semuanya dalamgeom_text
panggilan utama . Saya akan mengedit ini untuk jawabannya.Saya menyertakan statistik
stat_poly_eq()
dalam paket sayaggpmisc
yang memungkinkan jawaban ini:Statistik ini berfungsi dengan semua polinomial tanpa istilah yang hilang, dan mudah-mudahan memiliki fleksibilitas yang cukup untuk berguna secara umum. Label R ^ 2 atau R ^ 2 yang disesuaikan dapat digunakan dengan formula model apa pun yang dilengkapi dengan lm (). Menjadi statistik ggplot berperilaku seperti yang diharapkan baik dengan kelompok dan segi.
Paket 'ggpmisc' tersedia melalui CRAN.
Versi 0.2.6 baru saja diterima oleh CRAN.
Ini alamat komentar oleh @shabbychef dan @ MYaseen208.
@ MYaseen208 ini menunjukkan cara menambahkan topi .
@shabbychef Sekarang dimungkinkan untuk mencocokkan variabel dalam persamaan dengan yang digunakan untuk label sumbu. Untuk mengganti x dengan mengatakan z dan y dengan h satu akan menggunakan:
Menjadi ekspresi parsed R normal ini huruf yunani sekarang juga dapat digunakan baik dalam lhs dan rhs dari persamaan.
[2017-03-08] @elarry Edit untuk lebih tepatnya menjawab pertanyaan awal, menunjukkan cara menambahkan koma antara persamaan- dan R2-label.
[2019-10-20] @ helen.h Saya berikan contoh penggunaan
stat_poly_eq()
pengelompokan di bawah ini.[2020-01-21] @Herman Mungkin agak kontra-intuitif pada pandangan pertama, tetapi untuk mendapatkan persamaan tunggal saat menggunakan pengelompokan, seseorang harus mengikuti tata bahasa grafik. Batasi pemetaan yang membuat pengelompokan ke lapisan individual (diperlihatkan di bawah) atau pertahankan pemetaan default dan timpa dengan nilai konstan di layer di mana Anda tidak ingin pengelompokan (misalnya
colour = "black"
).Melanjutkan dari contoh sebelumnya.
[2020-01-22] Demi kelengkapan contoh dengan segi, menunjukkan bahwa juga dalam hal ini harapan tata bahasa grafis terpenuhi.
sumber
x
dany
dalam rumus mengacu padax
dany
data dalam lapisan plot, dan belum tentu untuk orang-orang di lingkup pada saatmy.formula
dibangun. Jadi formula harus selalu menggunakan variabel x dan y?x
dany
merujuk pada variabel apa pun yang dipetakan ke estetika ini. Itulah harapan juga untuk geom_smooth () dan bagaimana tata bahasa grafis bekerja. Itu bisa lebih jelas untuk menggunakan nama yang berbeda dalam bingkai data tetapi saya hanya menyimpannya seperti pada pertanyaan awal.ggpmisc
. Terima kasih untuk sarannya!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
melakukan pekerjaan.stat_poly_eq()
. Anda dapat menggunakanstat_fit_glance()
, juga dari paket 'ggpmisc', yang mengembalikan R2 sebagai nilai numerik. Lihat contoh di halaman bantuan, dan gantistat(r.squared)
dengansqrt(stat(r.squared))
.Saya mengubah beberapa baris sumber
stat_smooth
dan fungsi terkait untuk membuat fungsi baru yang menambahkan persamaan fit dan nilai kuadrat R. Ini juga akan bekerja pada plot facet!Saya menggunakan kode dalam jawaban @ Ramnath untuk memformat persamaan. The
stat_smooth_func
Fungsi ini tidak sangat kuat, tetapi seharusnya tidak sulit untuk bermain-main dengan hal itu.https://gist.github.com/kdauria/524eade46135f6348140 . Coba perbarui
ggplot2
jika Anda mendapatkan kesalahan.sumber
stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE)
, dalam kombinasi dengan EvaluateSmooths dari stackoverflow.com/questions/19735149/…source
seluruh file dalam skrip Anda.xpos
danypos
argumen fungsi di Intisari. Jadi jika Anda ingin semua persamaan tumpang tindih, tetapkan sajaxpos
danypos
. Kalau tidak,xpos
danypos
dihitung dari data. Jika Anda menginginkan sesuatu yang lebih menarik, seharusnya tidak terlalu sulit untuk menambahkan beberapa logika di dalam fungsi. Sebagai contoh, mungkin Anda bisa menulis fungsi untuk menentukan bagian mana dari grafik yang memiliki ruang paling kosong dan meletakkan fungsi di sana.Saya telah memodifikasi posting Ramnath ke a) membuat lebih umum sehingga menerima model linier sebagai parameter daripada bingkai data dan b) menampilkan negatif lebih tepat.
Penggunaan akan berubah menjadi:
sumber
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
sunting: ini juga menyelesaikan masalah yang mungkin Anda miliki dengan surat-surat yang muncul dalam legenda Anda."cannot coerce class "lm" to a data.frame"
. Alternatif ini berfungsi:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
danp <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
dengan solusi Ramnath. Anda mungkin mencoba yang ini setelah mencoba yang itu tetapi lupa untuk memastikan bahwa Anda telah mendefinisikan ulanglm_eqn
benar-benar menyukai solusi @Ramnath. Untuk mengizinkan penggunaan untuk mengkustomisasi rumus regresi (alih-alih tetap sebagai y dan x sebagai nama variabel literal), dan menambahkan nilai p ke dalam cetakan juga (seperti yang dikomentari @Jerry T), berikut adalah mod:
Sayangnya, ini tidak berfungsi dengan facet_wrap atau facet_grid.
sumber
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
sebelum geom_point ()? Pertanyaan semi-terkait - jika kita merujuk ke hp dan wt diaes()
for ggplot, dapatkah kita mengambilnya untuk digunakan dalam panggilan kelm_eqn
, jadi kita hanya perlu kode di satu tempat? Saya tahu kita bisa mengaturxvar = "hp"
sebelum panggilan ggplot (), dan menggunakan xvar di kedua lokasi untuk mengganti hp , tetapi ini terasa tidak perlu.Menggunakan ggpubr :
sumber
label.y
?label.y = max(df$y) * 0.8
Inilah kode yang paling sederhana untuk semua orang
Catatan: Menampilkan Pearson's Rho dan bukan R ^ 2.
sumber
Terinspirasi oleh gaya persamaan yang disediakan dalam jawaban ini , pendekatan yang lebih umum (lebih dari satu prediktor + keluaran lateks sebagai opsi) dapat berupa:
The
model
Argumen mengharapkanlm
objek,latex
argumen adalah boolean untuk meminta karakter sederhana atau persamaan lateks-formated, dan...
argumen lulus nilai kepadaformat
fungsi.Saya juga menambahkan opsi untuk menampilkannya sebagai lateks sehingga Anda dapat menggunakan fungsi ini dalam rmarkdown seperti ini:
Sekarang menggunakannya:
Kode ini menghasilkan:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
Dan jika kita meminta persamaan lateks, membulatkan parameter menjadi 3 digit:
Ini menghasilkan:
sumber
Saya ragu, bagaimana menggunakan statistik t.test yang signifikan untuk bheta dalam persamaan, menggunakan
ggpmisc::stat_poly_eq()
?ex:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
sumber