Menambahkan garis regresi pada ggplot

121

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)

Tapi itu juga tidak berhasil.

Remi.b
sumber

Jawaban:

171

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().

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm', formula= y~x)

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".

ggplot(data,aes(x.plot, y.plot)) +
  stat_summary(fun.data= mean_cl_normal) + 
  geom_smooth(method='lm')
Didzis Elferts
sumber
47

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))

Beberapa LR

# 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)

LR tunggal

StefanK
sumber
1
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.
colorlace
14

Solusi yang jelas menggunakan geom_abline:

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

Di mana data.lmsebuah lmobjek, dan data.lm$coefficientsterlihat seperti ini:

data.lm$coefficients
(Intercept)    DepDelay 
  -2.006045    1.025109 

Identik dalam praktiknya digunakan stat_functionuntuk memplot garis regresi sebagai fungsi dari x, dengan menggunakan predict:

stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

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 .

qwr
sumber
2
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.
arranjdavis
4

Saya menemukan fungsi ini di blog

 ggplotRegression <- function (fit) {

    `require(ggplot2)

    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
      geom_point() +
      stat_smooth(method = "lm", col = "red") +
      labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                         "Intercept =",signif(fit$coef[[1]],5 ),
                         " Slope =",signif(fit$coef[[2]], 5),
                         " P =",signif(summary(fit)$coef[2,4], 5)))
    }`

setelah Anda memuat fungsi, Anda dapat dengan mudah

ggplotRegression(fit)

Anda juga bisa pergi ggplotregression( y ~ x + z + Q, data)

Semoga ini membantu.

YellowEagle
sumber
2

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)))
pengguna3436882
sumber