Bir ggplot'a regresyon çizgisi ekleme


121

Bir ggplot'a bir regresyon çizgisi eklemek için çok çalışıyorum. Önce abline ile denedim ama çalışmasını sağlayamadım. Sonra bunu denedim ...

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)

Ama o da çalışmıyor.

Yanıtlar:


171

Genel olarak, kendi formülünüzü sağlamak için bağımsız değişkenler kullanmanız gerekir xve ybu, sağladığınız değerlere karşılık gelir ggplot()- bu durumda xolarak x.plotve yolarak yorumlanacaktır y.plot. Yumuşatma yöntemleri ve formülü hakkında daha fazla bilgiyi, işlevin yardım sayfasında bulabileceğiniz stat_smooth()varsayılan istatistik geom_smooth().

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

ggplot()Çağrıda sağladığınız aynı x ve y değerlerini kullanıyorsanız ve doğrusal regresyon çizgisini çizmeniz gerekiyorsa, içindeki formülü kullanmanıza gerek yoktur geom_smooth(), sadece method="lm".

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

47

Az önce anladığım gibi, çoklu doğrusal regresyona uyan bir modeliniz olması durumunda , yukarıda bahsedilen çözüm işe yaramayacaktır.

Orijinal veri çerçeveniz için tahmin edilen değerleri içeren bir veri çerçevesi olarak satırınızı manuel olarak oluşturmanız gerekir (sizin durumunuzda data ).

Şöyle görünecek:

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

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

Tek LR


1
Dikkat edilmesi gereken bir şey de kongre lm (y ~ x). 'Tahmin ettiğiniz' değişken x ekseninde olduğu için bunu ikinci kez okumak için biraz döndüm. Yine de harika cevap.
colorlace

14

Kullanan bariz çözüm geom_abline:

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

data.lmBir lmnesne nerede ve data.lm$coefficientsşuna benzer:

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

Pratikte aynı olan stat_function, regresyon doğrusunu x'in bir fonksiyonu olarak çizmek için kullanmaktır, bunu kullanarak predict:

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

Varsayılan olarak n=101noktalar hesaplandığı için bu biraz daha az verimlidir , ancak predictdoğrusal olmayanlar gibi destekleyen herhangi bir model için bir tahmin eğrisi çizeceği için çok daha esnektir.npreg np paketinden .

Not: Kullanırsanız scale_x_continuousveya scale_y_continuousbazı değerler kesilebilir ve bu nedenle geom_smoothdoğru çalışmayabilir. Kullanım coord_cartesianyerine yakınlaştırmak için .


2
Ve böylece formüllerinizin sıralanması konusunda asla endişelenmezsiniz veya sadece +0isimler ekleyebilirsiniz. data.lm$coefficients[['(Intercept)']]ve data.lm$coefficients[['DepDelay']].
Ufos

(Neredeyse) her zaman (Intercept)ilk sırada yer alacaktır. İsimler kodu daha açık hale getiriyor.
qwr

Bence bu en iyi cevap - en çok yönlü olanı.
arranjdavis

4

Bu işlevi bir blogda buldum

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

işlevi yükledikten sonra basitçe

ggplotRegression(fit)

ayrıca gidebilirsin ggplotregression( y ~ x + z + Q, data)

Bu yardımcı olur umarım.


2

Lojistik modelleri kullanan bir doz-yanıt eğrisi gibi diğer model türlerini uydurmak istiyorsanız, daha yumuşak bir regresyon çizgisine sahip olmak istiyorsanız, fonksiyon tahminiyle daha fazla veri noktası oluşturmanız gerekir:

uyum: lojistik regresyon eğrisine uyumunuz

#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)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.