การเพิ่มเส้นการถดถอยบน ggplot


121

ฉันพยายามอย่างมากที่จะเพิ่มเส้นการถดถอยใน ggplot ฉันลองใช้ abline ครั้งแรก แต่ฉันไม่สามารถทำให้มันใช้งานได้ จากนั้นฉันก็ลองสิ่งนี้ ...

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)

แต่มันก็ใช้ไม่ได้เช่นกัน

คำตอบ:


171

โดยทั่วไปจะให้สูตรของคุณเองคุณควรใช้ข้อโต้แย้งxและyที่จะสอดคล้องกับค่าคุณให้ไว้ในggplot()- ในกรณีนี้xจะถูกตีความว่าเป็นx.plotและเป็นy y.plotข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปรับให้เรียบและสูตรคุณจะพบในหน้าความช่วยเหลือของฟังก์ชั่นที่มันเป็นสถิติเริ่มต้นที่ใช้โดยstat_smooth()geom_smooth()

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

หากคุณใช้ค่า x และ y เดียวกับที่คุณระบุในการggplot()โทรและต้องการพล็อตเส้นการถดถอยเชิงเส้นคุณไม่จำเป็นต้องใช้สูตรภายในgeom_smooth()เพียงแค่ใส่method="lm".

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

47

อย่างที่ฉันเพิ่งคิดไปในกรณีที่คุณมีโมเดลที่พอดีกับการถดถอยเชิงเส้นหลาย ๆวิธีการแก้ปัญหาที่กล่าวถึงข้างต้นจะไม่ทำงาน

คุณต้องสร้างบรรทัดของคุณด้วยตนเองเป็น dataframe ที่มีค่าที่คาดการณ์ไว้สำหรับ dataframe เดิมของคุณ (ในกรณีของคุณdata)

จะมีลักษณะดังนี้:

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

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 เดียว


1
สิ่งหนึ่งที่ต้องระวังคือการประชุมคือ lm (y ~ x) ฉันหันไปอ่านครั้งที่สองเล็กน้อยเนื่องจากตัวแปรที่คุณ 'คาดการณ์' อยู่บนแกน x คำตอบที่ดีแม้ว่า
colorlace

14

วิธีแก้ปัญหาที่ชัดเจนโดยใช้geom_abline:

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

ในกรณีที่data.lmเป็นlmวัตถุและdata.lm$coefficientsมีลักษณะบางอย่างเช่นนี้

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

เหมือนกันในทางปฏิบัติคือการใช้stat_functionเพื่อพล็อตเส้นการถดถอยเป็นฟังก์ชันของ x โดยใช้predict:

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

สิ่งนี้มีประสิทธิภาพน้อยกว่าเล็กน้อยเนื่องจากโดยค่าเริ่มต้นn=101จะคำนวณจุด แต่มีความยืดหยุ่นมากกว่ามากเนื่องจากจะพล็อตเส้นโค้งการคาดการณ์สำหรับโมเดลใด ๆ ที่รองรับpredictเช่น non-linear npregจาก package np

หมายเหตุ: หากคุณใช้scale_x_continuousหรือscale_y_continuousค่าบางค่าอาจถูกตัดออกและgeom_smoothอาจทำงานไม่ถูกต้อง ใช้coord_cartesianเพื่อซูมแทน


2
ดังนั้นคุณจึงไม่ต้องกังวลกับการสั่งซื้อสูตรของคุณหรือเพียงแค่เพิ่มชื่อที่+0คุณสามารถใช้ data.lm$coefficients[['(Intercept)']]และdata.lm$coefficients[['DepDelay']].
ยูเอฟโอ

(เกือบ) (Intercept)จะปรากฏเป็นอันดับแรกเสมอ ชื่อทำให้รหัสชัดเจนขึ้น
qwr

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด - มันหลากหลายที่สุด
sortjdavis

4

ฉันพบฟังก์ชันนี้ในบล็อก

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

เมื่อคุณโหลดฟังก์ชันคุณสามารถทำได้

ggplotRegression(fit)

คุณยังสามารถไปได้ ggplotregression( y ~ x + z + Q, data)

หวังว่านี่จะช่วยได้


2

หากคุณต้องการปรับให้พอดีกับโมเดลประเภทอื่นเช่นเส้นโค้งการตอบสนองต่อปริมาณรังสีโดยใช้โมเดลโลจิสติกคุณจะต้องสร้างจุดข้อมูลเพิ่มเติมด้วยฟังก์ชันทำนายว่าคุณต้องการให้เส้นถดถอยที่ราบรื่นขึ้นหรือไม่:

พอดี: ความพอดีของเส้นโค้งการถดถอยโลจิสติกส์

#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)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.