2016-01-04 9 views
6

मैं सेगमेंट किए गए पैकेज के साथ काम कर रहा हूं और किसी फ़ंक्शन के भीतर davies.test() पर कॉल करते समय समस्या का सामना करना पड़ा है।पर्यावरण को संलग्न करने से डेटा तक पहुंचने का कार्य

library(segmented) 

data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
fit = lm(y ~ x, data = data) 
fit.seg = segmented(fit, seg.Z = ~ x) 
davies.test(fit.seg, seg.Z = ~ x, alternative = "greater") 

कि पूरी तरह से काम करता है और पता चलता है कि खंडित प्रतिगमन दो सांख्यिकीय अलग ढलानों है:

निम्नलिखित स्थिति पर विचार करें।

अब अगर मैं इस तरह एक समारोह में यह सब पैकेज:

testit <- function() { 
    data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
    fit = lm(y ~ x, data) 
    fit.seg = segmented(fit, seg.Z = ~ x) 
    davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value 
} 
testit() 

तो यह ठीक काम करता है ...

लेकिन अगर मैं वैश्विक वातावरण से fit हटाना तो यह विफल रहता है।

> rm(fit) 
> testit() 
Error in eval(expr, envir, enclos) : object 'fit' not found 
समस्या

तरीका है कि davies.test डेटा fit में समझाया का उपयोग करने की कोशिश कर रहा है के साथ हो रहा है: यह enclosing दायरे में fit देखने के लिए (जो इस मामले में testit समारोह है) नहीं लगता है , लेकिन सीधे वैश्विक दायरे में छोड़ देता है।

मुझे यकीन है कि समस्या आर के स्कॉइंग नियमों के साथ कुछ सूक्ष्मता से संबंधित है। अगर मुझे एक त्वरित फिक्स मिल सकता है जो मुझे इस एज केस के साथ पैकेज लेखक को परेशान करने से रोक देगा, तो यह बहुत अच्छा होगा।

धन्यवाद, एंड्रयू।

उत्तर

4

नीचे ## चिह्नित लाइन डालने का प्रयास करें। अभी भी एक अंतर है कि यह उस चेतावनी द्वारा दिखाया गया है जो तब दिखाई देता है जब संशोधित testit चलाया जाता है लेकिन आउटपुट पाल्व एक जैसा है, इसलिए यह आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है। यह निश्चित रूप से, पैकेज में एक बग है और वास्तव में पैकेज के रखरखाव से पूछना होगा कि अगर वे इसे ठीक करेंगे।

library(segmented) 
testit <- function() { 
    data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
    fit = lm(y ~ x, data) 
    fit.seg = segmented(fit, seg.Z = ~ x) 
    environment(davies.test) <- environment() ## 
    davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value 
} 
testit() 

दे रही है:

[1] 0.01858149 
Warning message: 
In summary.lm(object) : essentially perfect fit: summary may be unreliable 
+0

धन्यवाद। यह चेतावनी सिर्फ उस तरीके के कारण है जिस पर परीक्षण डेटा बनाया गया है। कोई संबंधित मुद्दा नहीं है। – DataWookie

3

इसे वैश्विक चर बनाने की आवश्यकता नहीं है। समस्या वास्तव में segmented में है, davies.test नहीं। यह fit नहीं ढूंढ रहा है।

आप किसी भी वातावरण में fit पता लगाने के लिए, बुला समारोह के पर्यावरण सहित dynGet उपयोग कर सकते हैं:

testit <- function() { 
    data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
    fit = lm(y ~ x, data) 
    fit.seg = segmented(dynGet("fit"), seg.Z = ~ x) 
    davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value 
} 
testit() 

कि के रूप में आप चाहते हैं काम करना चाहिए।

यदि आपके पास विभिन्न वातावरण में fit नामक एकाधिक चर हैं, तो get (?get देखें) का उपयोग करें ताकि आप यह निर्दिष्ट कर सकें कि आप किस वातावरण से इसे प्राप्त करना चाहते हैं। dynGet "हर जगह देखो; पहले लौटें" आलसी संस्करण है।

+1

समस्या 'davis.test' के अंदर मूल्यांकन है। 'ट्रेसबैक आउटपुट देखें। – Roland

+0

शानदार! वह चाल है। धन्यवाद। – DataWookie

+1

कॉलिंग फ़ंक्शन का विशिष्ट वातावरण इस प्रकार से पहुंचा जा सकता है: 'सेगमेंट (प्राप्त करें ("फिट", sys.frame (1)), seg.Z = ~ x) ' जो संभावित नामस्थान को कहीं और' dynGet() '। –

1

मैं segmented के लेखक से संपर्क किया और वह तुरंत प्रतिक्रिया व्यक्त की।एक अन्य समाधान वह मूल मुद्दे का प्रस्ताव

testit <- function() { 
    data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
    fit = lm(y ~ x, data) 
    fit.seg = segmented(fit, seg.Z = ~ x) 
    fit.seg$call$obj<-fit 
    davies.test(fit.seg, seg.Z = ~ x, alternative = "greater")$p.value 
} 

होगा हालांकि, उन्होंने यह भी कहा कि lm वस्तु वास्तव में इस प्रकार davies.test() को सीधे पारित किया जाना चाहिए:

testit <- function() { 
    data = data.frame(x = 1:21, y = c(10:1, 0:10)) 
    fit = lm(y ~ x, data) 
    davies.test(fit, seg.Z = ~ x, alternative = "greater")$p.value 
} 

स्पष्टीकरण के लिए हालांकि, यह होना चाहिए ध्यान दें कि कोड के इन दो बिट्स अलग-अलग चीजें करते हैं: दूसरा टुकड़ा वास्तव में मेरे मूल उद्देश्य को पूरा करता है (फिट में सांख्यिकीय रूप से महत्वपूर्ण ब्रेक की जांच करता है), जबकि पहला खंड यह देखने के लिए जांच करता है कि दूसरा br है eak।

संबंधित मुद्दे