2017-12-20 103 views
5

Có cách đơn giản nào để mở rộng đường chấm chấm từ cuối đường hồi quy rắn đến giá trị được dự đoán không?ggplot: Mở rộng đường hồi qui đến giá trị được dự đoán với các dòng khác nhau

Dưới đây là nỗ lực cơ bản của tôi lúc đó:

x = rnorm(10) 
y = 5 + x + rnorm(10,0,0.4) 

my_lm <- lm(y~x) 
summary(my_lm) 

my_intercept <- my_lm$coef[1] 
my_slope <- my_lm$coef[2] 
my_pred = predict(my_lm,data.frame(x = (max(x)+1))) 

ggdf <- data.frame(x = c(x,max(x)+1), y = c(y,my_pred), obs_Or_Pred = c(rep("Obs",10),"Pred")) 

ggplot(ggdf, aes(x = x, y = y, group = obs_Or_Pred)) + 
    geom_point(size = 3, aes(colour = obs_Or_Pred)) + 
    geom_abline(intercept = my_intercept, slope = my_slope, aes(linetype = obs_Or_Pred)) 

này không cung cấp cho đầu ra tôi hy vọng có thể nhìn thấy. Tôi đã xem xét một số câu trả lời khác trên SO và chưa thấy bất kỳ điều gì đơn giản. Tốt nhất tôi đã đưa ra là:

ggdf2 <- data.frame(x = c(x,max(x),max(x)+12), y = c(y,my_intercept+max(x)*my_slope,my_pred), obs_Or_Pred = c(rep("Obs",8),"Pred","Pred"), show_Data_Point = c(rep(TRUE,8),FALSE,TRUE)) 

ggplot(ggdf2, aes(x = x, y = y, group = obs_Or_Pred)) + 
    geom_point(data = ggdf2[ggdf2[,"show_Data_Point"],] ,size = 3, aes(colour = obs_Or_Pred)) + 
    geom_smooth(method = "lm", se=F, aes(colour = obs_Or_Pred, linetype=obs_Or_Pred)) 

Điều này cho kết quả đúng, nhưng tôi phải bao gồm thêm cột xác định có hay không tôi muốn hiển thị các điểm dữ liệu. Nếu tôi không, tôi kết thúc với phần thứ hai của hai lô này, trong đó có một điểm thêm vào cuối của đường hồi quy được trang bị:

enter image description here

Có một cách đơn giản hơn để kể ggplot để dự đoán một điểm duy nhất từ ​​mô hình tuyến tính và vẽ một đường đứt nét với nó?

+0

Phương pháp của bạn có vẻ đơn giản đối với tôi. – Gregor

+0

Nó cảm thấy khó xử khi phải thực hiện các dự đoán trước và sau đó phải xác định các hàng nào sẽ được hiển thị dưới dạng các điểm và đó là các dòng. Nó là tốt khi có một số lượng nhỏ các dự đoán/lần để làm điều đó, nhưng nếu tôi muốn làm điều đó nhiều lần nó sẽ là tẻ nhạt để làm bằng tay. – AodhanOL

+0

Ý tôi là, 'ggplot' là một gói * vẽ *, không phải là gói mô hình hóa. Đó là hoàn hảo tại âm mưu các dữ liệu bạn cung cấp cho nó. 'geom_smooth' là một tiện ích tốt cho các trường hợp sử dụng đơn giản, nhưng khi bạn muốn các mô hình/dự đoán không chuẩn, bạn không nên ngạc nhiên rằng bạn cần cung cấp cho nó dữ liệu bạn muốn vẽ một cách rõ ràng. – Gregor

Trả lời

5

Bạn có thể vẽ các điểm bằng cách sử dụng chỉ dữ liệu thực tế của bạn và tạo khung dữ liệu dự đoán để thêm các dòng. Lưu ý rằng max(x) xuất hiện hai lần sao cho nó có thể là điểm cuối của cả đường dây Obs và đường dây Pred. Chúng tôi cũng sử dụng một thẩm mỹ shape để chúng tôi có thể xóa điểm đánh dấu nếu không sẽ xuất hiện trong khóa chú giải cho Pred.

# Build prediction data frame 
pred_x = c(min(x),rep(max(x),2),max(x)+1) 
pred_lines = data.frame(x=pred_x, 
         y=predict(my_lm, data.frame(x=pred_x)), 
         obs_Or_Pred=rep(c("Obs","Pred"), each=2)) 

ggplot(pred_lines, aes(x, y, colour=obs_Or_Pred, shape=obs_Or_Pred, linetype=obs_Or_Pred)) + 
    geom_point(data=data.frame(x,y, obs_Or_Pred="Obs"), size=3) + 
    geom_line(size=1) + 
    scale_shape_manual(values=c(16,NA)) + 
    theme_bw() 

enter image description here

1

Semi-xấu xí: Bạn có thể sử dụng scale_x_continuous(limits = để thiết lập một loạt các giá trị x được sử dụng để dự đoán. Vẽ đường dự đoán trước tiên với fullrange = TRUE, sau đó thêm dòng 'quan sát' lên trên cùng. Lưu ý rằng overplotting không được hiển thị hoàn hảo và bạn có thể muốn tăng kích thước của đường quan sát một chút.

ggplot(d, aes(x, y)) + 
    geom_point(aes(color = "obs")) + 
    geom_smooth(aes(color = "pred", linetype = "pred"), se = FALSE, method = "lm", 
                 fullrange = TRUE) + 
    geom_smooth(aes(color = "obs", linetype = "obs"), size = 1.05, se = FALSE, method = "lm") + 
    scale_linetype_discrete(name = "obs_or_pred") + 
    scale_color_discrete(name = "obs_or_pred") + 
    scale_x_continuous(limits = c(NA, max(x) + 1)) 

enter image description here


Tuy nhiên, tôi có xu hướng đồng ý với Gregor: "ggplot là một gói phần mềm âm mưu, không phải là một gói mô hình".

Các vấn đề liên quan