Saya berusaha keras untuk menambahkan garis regresi pada ggplot. Saya pertama kali mencoba dengan abline tetapi tidak berhasil. Kemudian saya mencoba ini ...
data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal)+
geom_smooth(method='lm',formula=data$y.plot~data$x.plot)
Secara umum, untuk memberikan rumus Anda sendiri, Anda harus menggunakan argumen xdan yitu akan sesuai dengan nilai yang Anda berikan ggplot()- dalam hal ini xakan diartikan sebagai x.plotdan ysebagai y.plot. Informasi lebih lanjut tentang metode dan rumus smoothing dapat Anda temukan di halaman bantuan fungsi stat_smooth()karena ini adalah stat default yang digunakan oleh geom_smooth().
Jika Anda menggunakan nilai x dan y yang sama dengan yang Anda berikan dalam ggplot()panggilan dan perlu memplot garis regresi linier maka Anda tidak perlu menggunakan rumus di dalamnya geom_smooth(), cukup berikan method="lm".
Seperti yang baru saja saya bayangkan, jika Anda memiliki model yang dipasang pada regresi linier berganda , solusi yang disebutkan di atas tidak akan berfungsi.
Anda harus membuat garis Anda secara manual sebagai kerangka data yang berisi nilai prediksi untuk kerangka data asli Anda (dalam kasus Anda data).
Ini akan terlihat seperti ini:
# read dataset
df = mtcars
# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)# save predictions of the model in the new data frame # together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp))+
geom_point(color='blue')+
geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))
# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp))+
geom_point(color='blue')+
geom_smooth(method ="lm", se =FALSE)
Satu hal yang harus diperhatikan adalah konvensi lm (y ~ x). Saya sedikit berbalik untuk membaca kedua ini karena variabel yang Anda 'prediksi' ada pada sumbu x. Jawaban yang bagus.
Ini sedikit kurang efisien karena secara default n=101poin dihitung, tetapi jauh lebih fleksibel karena akan memplot kurva prediksi untuk model apa pun yang mendukung predict, seperti non-linear npregdari paket np.
Catatan: Jika Anda menggunakan scale_x_continuousatau scale_y_continuousbeberapa nilai mungkin terputus dan dengan demikian geom_smoothmungkin tidak berfungsi dengan benar. Gunakan coord_cartesianuntuk memperbesar .
Jadi Anda tidak pernah khawatir tentang urutan rumus Anda atau hanya menambahkan +0Anda dapat menggunakan nama. data.lm$coefficients[['(Intercept)']]dan data.lm$coefficients[['DepDelay']].
Ufos
(Hampir) selalu (Intercept)akan didaftarkan lebih dulu. Nama memang membuat kode lebih jelas.
qwr
Saya pikir ini adalah jawaban terbaik - ini yang paling serbaguna.
Jika Anda ingin menyesuaikan jenis model lain, seperti kurva dosis-respons menggunakan model logistik, Anda juga perlu membuat lebih banyak titik data dengan fungsi prediksi jika Anda ingin memiliki garis regresi yang lebih mulus:
fit: kecocokan Anda dengan kurva regresi logistik
#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out =100))#Create a new data frame for ggplot using predict and your range of new #doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)
ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
Solusi yang jelas menggunakan
geom_abline
:Di mana
data.lm
sebuahlm
objek, dandata.lm$coefficients
terlihat seperti ini:Identik dalam praktiknya digunakan
stat_function
untuk memplot garis regresi sebagai fungsi dari x, dengan menggunakanpredict
:Ini sedikit kurang efisien karena secara default
n=101
poin dihitung, tetapi jauh lebih fleksibel karena akan memplot kurva prediksi untuk model apa pun yang mendukungpredict
, seperti non-linearnpreg
dari paket np.Catatan: Jika Anda menggunakan
scale_x_continuous
atauscale_y_continuous
beberapa nilai mungkin terputus dan dengan demikiangeom_smooth
mungkin tidak berfungsi dengan benar. Gunakancoord_cartesian
untuk memperbesar .sumber
+0
Anda dapat menggunakan nama.data.lm$coefficients[['(Intercept)']]
dandata.lm$coefficients[['DepDelay']]
.(Intercept)
akan didaftarkan lebih dulu. Nama memang membuat kode lebih jelas.Saya menemukan fungsi ini di blog
setelah Anda memuat fungsi, Anda dapat dengan mudah
Anda juga bisa pergi
ggplotregression( y ~ x + z + Q, data)
Semoga ini membantu.
sumber
Jika Anda ingin menyesuaikan jenis model lain, seperti kurva dosis-respons menggunakan model logistik, Anda juga perlu membuat lebih banyak titik data dengan fungsi prediksi jika Anda ingin memiliki garis regresi yang lebih mulus:
fit: kecocokan Anda dengan kurva regresi logistik
sumber