2017-12-20 143 views
5

के साथ पूर्वानुमानित मूल्य पर प्रतिगमन रेखा बढ़ाएं क्या ठोस प्रतिगमन रेखा के अंत से एक अनुमानित मूल्य तक बिंदीदार रेखा का विस्तार करने का कोई आसान तरीका है?ggplot: विभिन्न लिनटाइप

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

यह आउटपुट मैं देख रहा हूँ आशा व्यक्त होता नहीं देता:

नीचे मेरी इस पर बुनियादी प्रयास है। मैं इतने पर कुछ अन्य उत्तर में देखा है और simple.The सबसे अच्छा मैं के साथ आ गया है कुछ भी नहीं देखा है:

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

यह आउटपुट जो सही है देता है, लेकिन मैं एक अतिरिक्त शामिल करने के लिए पड़ा है कॉलम निर्दिष्ट करता है कि मैं डेटा पॉइंट दिखाना चाहता हूं या नहीं।

enter image description here

वहाँ एक आसान तरीका भविष्यवाणी करने के लिए ggplot बताने के लिए है: मैं नहीं करते हैं, मैं इन दो भूखंडों की दूसरी, जो फिट प्रतिगमन लाइन के अंत में एक अतिरिक्त अंक के साथ खत्म रैखिक मॉडल से एक बिंदु और एक धराशायी रेखा खींचने के लिए?

+0

आपकी विधि मेरे लिए सीधा लगता है। – Gregor

+0

भविष्य में भविष्यवाणियों को पहले से करना बहुत अजीब लगता है और फिर यह निर्दिष्ट करना होगा कि कौन सी पंक्तियों को अंक के रूप में दिखाया जाएगा और जो लाइनों के रूप में दिखाए जाएंगे। यह ठीक है जब ऐसा करने के लिए भविष्यवाणी/समय की एक छोटी संख्या होती है, लेकिन अगर मैं इसे बार-बार करना चाहता हूं तो मैन्युअल रूप से करना कठिन होगा। – AodhanOL

+0

मेरा मतलब है, 'ggplot' एक * प्लॉटिंग * पैकेज है, मॉडलिंग पैकेज नहीं। यह आपके द्वारा दिए गए डेटा की साजिश में सही है। 'geom_smooth' सरल उपयोग मामलों के लिए एक अच्छी सुविधा है, लेकिन जब आप गैर-मानक मॉडल/भविष्यवाणियां चाहते हैं, तो आपको आश्चर्यचकित नहीं होना चाहिए कि आपको उस डेटा को स्पष्ट रूप से देने की आवश्यकता है जिसे आप साजिश करना चाहते हैं। – Gregor

उत्तर

5

आप केवल अपने वास्तविक डेटा का उपयोग करके अंक प्लॉट कर सकते हैं और लाइनों को जोड़ने के लिए भविष्यवाणी डेटा फ्रेम बना सकते हैं। ध्यान दें कि max(x) दो बार प्रकट होता है ताकि यह Obs लाइन और Pred लाइन दोनों का अंत बिंदु हो। हम shape सौंदर्यशास्त्र का भी उपयोग करते हैं ताकि हम पॉइंट मार्कर को हटा सकें जो अन्यथा 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

अर्द्ध बदसूरत: आप scale_x_continuous(limits = का उपयोग भविष्यवाणी के लिए इस्तेमाल किया x मानों की श्रेणी निर्धारित करने के लिए कर सकते हैं। fullrange = TRUE के साथ पहले अनुमानित रेखा को प्लॉट करें, फिर शीर्ष पर 'मनाई गई' रेखा जोड़ें। ध्यान दें कि ओवरप्लॉटिंग पूरी तरह से प्रस्तुत नहीं की जाती है, और आप मनाई गई रेखा के आकार को थोड़ा बढ़ा सकते हैं।

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


हालांकि, मैं ग्रेगर के साथ सहमत करने के लिए जाते: "ggplot एक साजिश पैकेज, नहीं एक मॉडलिंग पैकेज है।"