2012-04-16 17 views
5

मुझे आज मेरे आर कोड में एक अजीब व्यवहार का एहसास हुआ। मैंने एक पैकेज {boot.StepAIC} की कोशिश की जिसमें एआईसी के साथ चरणबद्ध प्रतिगमन के परिणामों के लिए बूटस्ट्रैप फ़ंक्शन शामिल है। हालांकि मुझे नहीं लगता कि सांख्यिकीय पृष्ठभूमि यहां समस्या है (मुझे उम्मीद है)।
मैं आर के शीर्ष स्तर पर फ़ंक्शन का उपयोग कर सकता हूं। यह मेरा उदाहरण कोड है।फ़ंक्शन काम करता है (boot.stepAIC) लेकिन किसी अन्य फ़ंक्शन - पर्यावरण समस्या के अंदर कोई त्रुटि फेंकता है?

require(MASS) 
require(boot.StepAIC) 

n<-100 
x<-rnorm(n); y<-rnorm(n,sd=2); z<-rnorm(n,sd=3); res<-x+y+z+rnorm(n,sd=0.1) 
dat.test<-as.data.frame(cbind(x,y,z,res)) 
form.1<-as.formula(res~x+y+z) 
boot.stepAIC(lm(form.1, dat.test),dat.test) # should be OK - works at me 

हालांकि, मैं इसे अपने स्वयं के कार्य में लपेटना चाहता था। मैं उस समारोह में डेटा और सूत्र पास करता हूं। लेकिन मैं() boot.stepAIC भीतर कोई त्रुटि मिलती है कह रही:

मॉडल फिट strsplit में 100 बूटस्ट्रैप नमूने त्रुटि में विफल रहा है (nam.vars, ":"): गैर चरित्र तर्क

# custom function 
fun.boot.lm.stepAIC<-function(dat,form) { 
    if(!inherits(form, "formula")) stop("No formula given") 
    fit.lm<-lm(formula=form,data=dat) 
    return(boot.stepAIC(object=fit.lm,data=dat)) 
} 
fun.boot.lm.stepAIC(dat=dat.test,form=form.1) 
# results in an error 

तो गलती कहां है? मुझे लगता है कि स्थानीय और वैश्विक पर्यावरण के साथ इसका कुछ संबंध होना चाहिए, है ना?

+0

मैं उपयोग नहीं किया है 'boot.stepAIC' से पहले, लेकिन संदेह है कि यह भी कैसे सूत्र समारोह में पारित किया जा रहा है (जो पर्यावरण के मुद्दों से भी संबंधित है) के साथ क्या करना पड़ सकता है। कुछ विचारों के लिए http://stackoverflow.com/q/6877534, http://stackoverflow.com/q/7666807 देखें। विशेष रूप से, 'do.call' के माध्यम से 'lm' या' boot.stepAIC' को कॉल करने में सहायता मिल सकती है, तब तर्कों का मूल्यांकन करने से पहले मूल्यांकन किया जाता है। आप टिप्पणियों में' as.name' सुझाव की भी जांच कर सकते हैं। ये मुद्दे मुश्किल हैं - शुभकामनाएँ! – Aaron

+0

http://stackoverflow.com/q/8998884/210673 भी एक ही समस्या दिखता है। – Aaron

+0

हां। मैंने पहले से ही इसे पढ़ा है। मुझे लगता है कि मुद्दे जुड़े हुए हैं। – Sebastian

उत्तर

4

do.call का उपयोग anova test fails on lme fits created with pasted formula में उत्तर प्रदान करता है।

किसी फ़ंक्शन के भीतर चलाने पर form तक पहुंच नहीं है; जिसे इस तरह के वैश्विक पर्यावरण में बनाया जा सकता है; हम देखते हैं कि lm फॉर्मूला के रूप में form.1 का उपयोग कर रहा है, और इसे हटाने से विफल हो जाता है।

> form.1<-as.formula(res~x+y+z) 
> mm <- lm(form.1, dat.test) 
> mm$call 
lm(formula = form.1, data = dat.test) 
> rm(form.1) 
> boot.stepAIC(mm,dat.test) 
# same error as OP 

do.call का उपयोग करना काम करता है। यहां मैं as.name का भी उपयोग करता हूं; अन्यथा mm ऑब्जेक्ट केवल इसके नाम के बजाय पूरे डेटासेट के आसपास है।

> form.1<-as.formula(res~x+y+z) 
> mm <- do.call("lm", list(form.1, data=as.name("dat.test"))) 
> mm$call 
lm(formula = res ~ x + y + z, data = dat.test) 
> rm(form.1) 
> boot.stepAIC(mm,dat.test) 

मूल समस्या को यह लागू करने के लिए मैं यह कर चाहते हैं:

fun.boot.lm.stepAIC<-function(dat,form) { 
    if(!inherits(form, "formula")) stop("No formula given") 
    mm <- do.call("lm", list(form, data=as.name(dat))) 
    do.call("boot.stepAIC", list(mm,data=as.name(dat))) 
}  
form.1<-as.formula(res~x+y+z) 
fun.boot.lm.stepAIC(dat="dat.test",form=form1) 

यह भी काम करता है लेकिन पूरे डेटा सेट अंतिम आउटपुट वस्तु में शामिल हो जाता है, और सांत्वना देने अंतिम आउटपुट , भी।

fun.boot.lm.stepAIC<-function(dat,form) { 
    if(!inherits(form, "formula")) stop("No formula given") 
    mm <- do.call("lm", list(form, data=dat)) 
    boot.stepAIC(mm,data=dat) 
}  
form.1<-as.formula(res~x+y+z) 
fun.boot.lm.stepAIC(dat=dat.test,form=form.1) 
+0

धन्यवाद। व्यापक स्पष्टीकरण के कारण, मैं बिंदु देखता हूं। मैंने दो संबंधित पदों को भी पढ़ा। ईमानदारी से, मुझे अभी भी इन मुद्दों के साथ कुछ सिरदर्द है। उस व्यवहार के लिए "उपयोग केस" क्या है? मैं उस कार्य को दो ऑब्जेक्ट पास करता हूं ताकि इसे कॉलिंग फ़ंक्शन के संदर्भ में निष्पादित किया जाना चाहिए। मुझे वैश्विक वातावरण पर रीडायरेक्ट करने के लिए आर या boot.stepAIC में कोई बिंदु नहीं है (पता नहीं है कि "दोष" कौन है)।मुद्दा यह है कि मैं कैसे निश्चित हो सकता हूं कि एक फंक्शन ऑब्जेक्ट की तलाश में है। मेरी समझ अब तक है, हमेशा कार्य के बजाय do.call() का उपयोग करें। उस पर कोई रणनीति? – Sebastian

+0

वैसे मैंने इसके साथ थोड़ा सा खेला और मैं अभी भी संदर्भ को समझने की कोशिश करता हूं। आपके अंतिम उदाहरण में आप मूल रूप से वैश्विक (या अभिभावक) चर का नाम पारित करते हैं और वैश्विक चर dat.test फ़ंक्शन से बाहर निकलते हैं। क्या यह संदर्भ द्वारा एक कॉल है? क्या यह हो सकता है कि मॉडलिंग फ़ंक्शन कभी-कभी संदर्भ रणनीति द्वारा कॉल का उपयोग करते हैं, भले ही मैं इसे पूरी तरह से मूल्य से कॉल करता हूं? – Sebastian

+0

1) 'boot.stepAIC' 'अपडेट' का उपयोग करता है, जो रैखिक मॉडल के कॉल को दोबारा दोहराता है; अगर कॉल में फ़ंक्शन ऑब्जेक्ट का नाम था (जैसे 'फॉर्म') तो उस ऑब्जेक्ट को सुलभ होना चाहिए। 2) प्रत्येक समारोह में एक पर्यावरण होता है (जिसे वह आमतौर पर बनाया गया था), और माता-पिता वातावरण की एक श्रृंखला है, जो वस्तुओं को ढूंढने में लगती है। हालांकि, किसी अन्य फ़ंक्शन के भीतर फ़ंक्शन चलाने से यह पैरेंट श्रृंखला नहीं बदली जाती है! श्रृंखला के अंत में वैश्विक पर्यावरण है, इसलिए जब वैश्विक वातावरण में 'form' है, तो यह इसे पा सकता है। लेकिन जब 'फॉर्म' कॉलिंग फ़ंक्शन के वातावरण में होता है, तो यह नहीं हो सकता है। – Aaron

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

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