2015-10-12 9 views
5

में geom_stat/geom_smooth का उपयोग करते समय आत्मविश्वास अंतराल के ऊपर और नीचे अंक प्राप्त करें मेरे पास एक स्कैटर प्लॉट है, मैं जानना चाहता हूं कि आत्मविश्वास अंतराल रेखाओं के ऊपर और नीचे जीन कैसे प्राप्त कर सकते हैं?ggplot2

enter image description here


संपादित करें: प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:

library(ggplot2) 
#dummy data 
df <- mtcars[,c("mpg","cyl")] 

#plot 
ggplot(df,aes(mpg,cyl)) + 
    geom_point() + 
    geom_smooth() 

enter image description here

+7

आप अपने कोड और डेटा को शामिल करके शुरू कर सकते हैं। – nrussell

+0

'पहचान (एक्स, वाई ...)' लेकिन आपके डेटा का एक हिस्सा आवश्यक है – Mateusz1981

+0

ध्यान दें कि आत्मविश्वास अंतराल रेखा डेटा के माध्य के लिए एक आत्मविश्वास अंतराल है, न कि डेटा के लिए। और क्योंकि आपके पास इतना डेटा है, मैं उम्मीद करता हूं कि अधिकांश मूल्य अंतराल के बाहर होंगे। – bramtayl

उत्तर

7

मैं github रेपो में अच्छा अनुभव मिलेगा पड़ा, लेकिन मैं अंत में यह मिल गया। ऐसा करने के लिए आपको यह जानने की जरूरत है कि stat_smooth कैसे काम करता है। इस विशिष्ट मामले में loess समारोह समरेखण करने के लिए कहा जाता है (अलग समरेखण कार्यों के रूप में नीचे एक ही प्रक्रिया का उपयोग कर निर्माण किया जा सकता है):

तो, यह अवसर पर loess का उपयोग कर हम करना होगा:

#data 
df <- mtcars[,c("mpg","cyl"), with=FALSE] 
#run loess model 
cars.lo <- loess(cyl ~ mpg, df) 

फिर में भविष्यवाणियों को आंतरिक रूप से कैसे बनाया गया है, यह देखने के लिए मुझे this पढ़ना पड़ा। के रूप में हमारे मामले के लिए इस प्रकार है जाहिरा तौर पर हेडली predictdf समारोह (जो नाम स्थान को निर्यात नहीं है) का उपयोग करता है:

:

predictdf.loess <- function(model, xseq, se, level) { 
    pred <- stats::predict(model, newdata = data.frame(x = xseq), se = se) 

    if (se) { 
    y = pred$fit 
    ci <- pred$se.fit * stats::qt(level/2 + .5, pred$df) 
    ymin = y - ci 
    ymax = y + ci 
    data.frame(x = xseq, y, ymin, ymax, se = pred$se.fit) 
    } else { 
    data.frame(x = xseq, y = as.vector(pred)) 
    } 
} 

ऊपर मैं का उपयोग कर भविष्यवाणियों की अपने ही data.frame बनाने में सक्षम था पढ़ने के बाद

#get the predictions i.e. the fit and se.fit vectors 
pred <- predict(cars.lo, se=TRUE) 
#create a data.frame from those 
df2 <- data.frame(mpg=df$mpg, fit=pred$fit, se.fit=pred$se.fit * qt(0.95/2 + .5, pred$df)) 

predictdf.loess पर देखकर हम देख सकते हैं कि आत्मविश्वास अंतराल की ऊपरी सीमा pred$fit + pred$se.fit * qt(0.95/2 + .5, pred$df) और निचली सीमा pred$fit - pred$se.fit * qt(0.95/2 + .5, pred$df) के रूप में बनाई गई है।

उन का उपयोग करते हुए हम पर या नीचे उन सीमाओं अंक के लिए एक झंडा बना सकते हैं:

#make the flag 
outerpoints <- +(df$cyl > df2$fit + df2$se.fit | df$cyl < df2$fit - df2$se.fit) 
#add flag to original data frame 
df$outer <- outerpoints 

df$outer स्तंभ शायद क्या ओ पी की तलाश में है है (यह 1 का मान लेता है अगर यह बाहर है सीमाएं या 0 अन्यथा) लेकिन सिर्फ इसके लिए मैं इसे नीचे साजिश कर रहा हूं।

उपरोक्त + फ़ंक्शन पर ध्यान दें केवल तार्किक ध्वज को संख्यात्मक रूप में परिवर्तित करने के लिए उपयोग किया जाता है।

अब हम इस रूप में साजिश यदि:

ggplot(df,aes(mpg,cyl)) + 
    geom_point(aes(colour=factor(outer))) + 
    geom_smooth() 

हम वास्तव में अंदर और विश्वास अंतराल के बाहर अंक देख सकते हैं।

आउटपुट:

enter image description here

पी.एस.जो कोई ऊपरी और निचले सीमाओं में रुचि रखता है के लिए, वे इस तरह बनाए जाते हैं (अटकलें: हालांकि छायांकित क्षेत्रों शायद geom_ribbon साथ बनाया जाता है - या कुछ इसी तरह - जो उन्हें अधिक गोल और सुंदर बना देता है):

#upper boundary 
ggplot(df,aes(mpg,cyl)) + 
    geom_point(aes(colour=factor(outer))) + 
    geom_smooth() + 
    geom_line(data=df2, aes(mpg , fit + se.fit , group=1), colour='red') 

#lower boundary 
ggplot(df,aes(mpg,cyl)) + 
    geom_point(aes(colour=factor(outer))) + 
    geom_smooth() + 
    geom_line(data=df2, aes(mpg , fit - se.fit , group=1), colour='red') 
+1

अच्छा, तुलनात्मक उत्तर पोस्ट करने वाला था ;-) – Jaap

+0

धन्यवाद @ जैप :)। इसके बारे में क्षमा करें, मुझे पता है कि यह अनुभव से कैसे है :)। अगर आपको लगता है कि यह अतिरिक्त जानकारी जोड़ता है तो इसे पोस्ट करें। – LyzandeR

+1

कोई ज़रूरत नहीं है, मेरे पास आपके उत्तर में सुधार करने के लिए कुछ भी नहीं है :-) (कुछ छोटे संपादन के अलावा) – Jaap

8

यह समाधान लेता है कड़ी मेहनत ggplot2 का लाभ आप के लिए करता है:

library(sp) 

# we have to build the plot first so ggplot can do the calculations 
ggplot(df,aes(mpg,cyl)) + 
    geom_point() + 
    geom_smooth() -> gg 

# do the calculations 
gb <- ggplot_build(gg) 

# get the CI data 
p <- gb$data[[2]] 

# make a polygon out of it 
poly <- data.frame(
    x=c(p$x[1], p$x, p$x[length(p$x)], rev(p$x)), 
    y=c(p$ymax[1], p$ymin, p$ymax[length(p$x)], rev(p$ymax)) 
) 

# test for original values in said polygon and add that to orig data 
# so we can color by it 
df$in_ci <- point.in.polygon(df$mpg, df$cyl, poly$x, poly$y) 

# re-do the plot with the new data 
ggplot(df,aes(mpg,cyl)) + 
    geom_point(aes(color=factor(in_ci))) + 
    geom_smooth() 

enter image description here

यह (है कि अंतिम बिंदु एक 2 मूल्य मिल रहा है यानी) में सुधार करने का एक सा की जरूरत है, लेकिन मैं समय पर सीमित कर रहा हूँ। नोट कि point.in.polygon वापसी मान हैं:

  • 0: बिंदु सख्ती से पोल
  • 1 लिए बाहरी है: बिंदु
  • 2 पोल करने के लिए सख्ती से आंतरिक है: बिंदु पोल
  • की बढ़त के रिश्तेदार इंटीरियर पर स्थित है
  • 3: बिंदु पोल
तो

के एक शीर्ष है यह सिर्फ +०१२३४८०३९०७ करने के लिए कोड को बदलने के लिए आसान होना चाहिए/FALSE चाहे मूल्य 0 है या नहीं।

6

ggplot_build @ hrbrmstr के अच्छा समाधान की तरह का उपयोग करना, आप वास्तव में बस geom_smooth को निर्दिष्ट जहां त्रुटियों सीमा गणना की जानी चाहिए करने के लिए एक्स मूल्यों का एक अनुक्रम पास करके ऐसा करते हैं, और यह आपके अंक के एक्स-मूल्यों के बराबर कर सकते हैं। फिर, आप देखते हैं कि वाई-मान सीमा के भीतर हैं या नहीं।

library(ggplot2) 

## dummy data 
df <- mtcars[,c("mpg","cyl")] 

ggplot(df, aes(mpg, cyl)) + 
    geom_smooth(params=list(xseq=df$mpg)) -> gg 

## Find the points within bounds 
bounds <- ggplot_build(gg)[[1]][[1]] 
df$inside <- with(df, bounds$ymin < cyl & bounds$ymax > cyl) 

## Add the points 
gg + geom_point(data=df, aes(color=inside)) + theme_bw() 

enter image description here