Thêm một dòng hồi quy trên ggplot


120

Tôi đang cố gắng thêm một đường hồi quy trên ggplot. Lần đầu tiên tôi đã thử với abline nhưng tôi đã không quản lý để làm cho nó hoạt động. Sau đó, tôi đã thử điều này ...

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)

Nhưng nó cũng không hoạt động.

Câu trả lời:


170

Nói chung, để cung cấp công thức của riêng bạn, bạn nên sử dụng các đối số xvà đối số yđó sẽ tương ứng với các giá trị bạn đã cung cấp ggplot()- trong trường hợp xnày sẽ được hiểu là x.plotynhư y.plot. Thông tin thêm về các phương pháp và công thức làm mịn bạn có thể tìm thấy trong trang trợ giúp của chức năng stat_smooth()vì nó là chỉ số mặc định được sử dụng geom_smooth().

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

Nếu bạn đang sử dụng các giá trị x và y giống nhau mà bạn đã cung cấp trong ggplot()cuộc gọi và cần vẽ đường hồi quy tuyến tính thì bạn không cần sử dụng công thức bên trong geom_smooth(), chỉ cần cung cấp method="lm".

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

46

Như tôi vừa tìm hiểu, trong trường hợp bạn có một mô hình được trang bị trên nhiều hồi quy tuyến tính , giải pháp được đề cập ở trên sẽ không hoạt động.

Bạn phải tạo dòng theo cách thủ công dưới dạng khung dữ liệu chứa các giá trị được dự đoán cho khung dữ liệu ban đầu của bạn (trong trường hợp của bạn data).

Nó sẽ trông như thế này:

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

Nhiều 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 đơn


1
Một điều cần chú ý là quy ước là lm (y ~ x). Tôi đã hơi xoay người trong giây phút đọc nó vì biến mà bạn đang 'dự đoán' nằm trên trục x. Câu trả lời tuyệt vời mặc dù.
colorlace

14

Giải pháp rõ ràng bằng cách sử dụng geom_abline:

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

Trong trường hợp data.lmlà một lmđối tượng, và data.lm$coefficientstrông giống như sau:

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

Trong thực tế, giống hệt nhau đang sử dụng stat_functionđể vẽ đường hồi quy dưới dạng một hàm của x, sử dụng predict:

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

Điều này kém hiệu quả hơn một chút vì n=101các điểm mặc định được tính toán, nhưng linh hoạt hơn nhiều vì nó sẽ vẽ một đường cong dự đoán cho bất kỳ mô hình nào hỗ trợ predict, chẳng hạn như phi tuyến tính npregtừ gói np.

Lưu ý: Nếu bạn sử dụng scale_x_continuoushoặc scale_y_continuousmột số giá trị có thể bị cắt và do đó geom_smoothcó thể không hoạt động chính xác. Sử dụng coord_cartesianđể thu phóng thay thế .


2
Và vì vậy bạn không bao giờ lo lắng về việc sắp xếp thứ tự các công thức của mình hoặc chỉ cần thêm một +0cái tên mà bạn có thể sử dụng. data.lm$coefficients[['(Intercept)']]data.lm$coefficients[['DepDelay']].
Ufos

(Hầu như) luôn luôn (Intercept)sẽ được liệt kê đầu tiên. Tên làm cho mã rõ ràng hơn.
qwr

Tôi nghĩ đây là câu trả lời tốt nhất - nó là câu trả lời linh hoạt nhất.
arraynjdavis

4

Tôi tìm thấy chức năng này trên một 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)))
    }`

một khi bạn tải chức năng, bạn có thể đơn giản

ggplotRegression(fit)

bạn cũng có thể đi cho ggplotregression( y ~ x + z + Q, data)

Hi vọng điêu nay co ich.


2

Nếu bạn muốn phù hợp với các loại mô hình khác, chẳng hạn như đường cong liều lượng đáp ứng bằng cách sử dụng mô hình logistic, bạn cũng sẽ cần tạo thêm điểm dữ liệu với chức năng dự đoán nếu bạn muốn có đường hồi quy mượt mà hơn:

phù hợp: sự phù hợp của bạn với đường cong hồi quy logistic

#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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.