2013-10-08 9 views
5

के भीतर मैं bnlearnpackage सशर्त संभावनाओं की गणना करने के उपयोग करने का प्रयास कर रहा हूँ, और जब "cpquery" समारोह एक पाश के भीतर प्रयोग किया जाता है मैं एक समस्या में चल रहा हूँ। मैंने पैकेज के साथ शामिल डेटा का उपयोग करके नीचे दिखाया गया एक उदाहरण बनाया है। लूप में cpquery फ़ंक्शन का उपयोग करते समय, लूप में निर्मित एक चर (उदाहरण में "evi") फ़ंक्शन द्वारा पहचाना नहीं जाता है। मुझे त्रुटि मिलती है:फंक्शन "cpquery" bnlearn का उपयोग करते हुए एक लूप

Error in parse(text = evi) : object 'evi' not found 

लेखक "ईवी" के निर्माण चरण लेखक द्वारा प्रदान किए गए उदाहरणों पर आधारित हैं।

कोई भी सहायता जो आप प्रदान कर सकते हैं वह बहुत अच्छा होगा। मैं एक तरीका खोजने के लिए बेताब हूं कि मैं बड़ी संख्या में अवलोकनों के लिए cpquery फ़ंक्शन लागू कर सकता हूं।

library(bnlearn) 
data(learning.test) 
fitted = bn.fit(hc(learning.test), learning.test) 

bn.function <- function(network, evidence_data) { 
    a <- NULL 
    b <- nrow(evidence_data) 
    for (i in 1:b) { 
    evi <- paste("(", names(evidence_data), "=='", 
       sapply(evidence_data[i,], as.character), "')", 
       sep = "", collapse = " & ") 
    a[i] <- cpquery(network, (C=='c'), eval(parse(text=evi))) 
    } 
    return(a) 
} 

test <- bn.function(fitted, learning.test) 

अग्रिम धन्यवाद!

+1

मैं bnlearn पैकेज के लेखक के संपर्क में रहा हूं, और ऐसा लगता है कि मुझे प्राप्त होने वाली त्रुटि cpquery फ़ंक्शन के साथ स्कोपिंग समस्या के कारण है। यह स्पष्ट है जब मैं cpquery फ़ंक्शन को एक फॉर-लूप में ठीक से काम करने में सक्षम हूं जो उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन के _outside_ का निर्माण किया गया है, लेकिन त्रुटि है जब एक ही फॉर-लूप का उपयोग उपयोगकर्ता द्वारा परिभाषित _inside_ समारोह। –

उत्तर

0

scoping समस्या से बचने के लिए, आपको eval करने के लिए कॉल को स्थगित और यह अंदरcpquery समारोह कर सकते हैं। यदि आप सीधे evi (वर्ण चर) को cpquery पर पास करते हैं और फिर इसे परिभाषा के अंदर पार्स करते हैं, तो वातावरण की श्रृंखला और cpquery स्थानांतरित हो जाएगी evi तक पहुंच होगी।

आप समारोह के अपने स्वयं के संस्करण कांटा और इसकी शुरुआत में निम्न पंक्ति को सम्मिलित करने के m.cpquery <- edit(cpqurey) उपयोग कर सकते हैं:

evidence = parse(text = evidence) 

और फिर अपना नया समारोह को बचाने के।

> m.cpquery 
function (fitted, event, evidence, cluster = NULL, method = "ls", 
    ..., debug = FALSE) 
{ 
    evidence = parse(text = evidence) 
    check.fit(fitted) 
    check.logical(debug) 
... 

अब आप पहले की तरह अपने खुद के समारोह में m.cpquery उपयोग कर सकते हैं, सिवाय इसके कि हम यह करने के लिए सादा चरित्र चर पारित करेंगे: तो m.cpquery के शीर्षक की तरह दिखाई देगा

a[i] <- m.cpquery(network, (C=='c'), evi) 

ध्यान दें कि m.cpquery की पहली पंक्ति में, हमने केवल सबूत वर्ण चर का विश्लेषण किया और उस पर eval पर कॉल नहीं किया। cpqueryconditional.probability.query (here देखें) का फ्रंट-एंड है और हम conditional.probability.query के बाद के कॉल पर eval पर भरोसा कर रहे हैं।

मुझे कहना चाहिए कि यह एक बदसूरत कामकाज है। और यह केवल तभी काम करता है यदि आप तर्क नमूना (method='ls') का उपयोग कर रहे हैं। लेकिन यदि आप वजन की संभावना का उपयोग करना चाहते हैं, तो check.mutilated.evidence फ़ंक्शन एक त्रुटि उठाएगा। मैंने जांच नहीं की है कि अभिव्यक्ति को इंजेक्शन देने से पहले इंजेक्शन देने से पहले नरक की अगली त्रुटियों का एक तबाही हो जाएगा।

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