2010-03-11 13 views
7

से जानकारी निकालें मैं एक आर फ़ंक्शन लिखना चाहता हूं जो एक सूत्र को अपना पहला तर्क, एलएम() या glm() और दोस्तों के समान स्वीकार करता है।सशर्त फॉर्मूला

<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info> 
<target> .=. +1 | -1 | 0 | <float> 
<feature> .=. <integer> | "qid" 
<value> .=. <float> 
<info> .=. <string> 
उदाहरण के लिए

, निम्न डेटा फ्रेम: इस मामले में, यह एक समारोह है कि एक डेटा फ्रेम लेता है और SVMLight प्रारूप है, जो इस सामान्य रूप है में एक फ़ाइल बाहर लिखते है

result qid  f1  f2  f3  f4 f5  f6  f7  f8 
1  -1 1 0.0000 0.1253 0.0000 0.1017 0.00 0.0000 0.0000 0.9999 
2  -1 1 0.0098 0.0000 0.0000 0.0000 0.00 0.0316 0.0000 0.3661 
3  1 1 0.0000 0.0000 0.1941 0.0000 0.00 0.0000 0.0509 0.0000 
4  -1 2 0.0000 0.2863 0.0948 0.0000 0.34 0.0000 0.7428 0.0608 
5  1 2 0.0000 0.0000 0.0000 0.4347 0.00 0.0000 0.9539 0.0000 
6  1 2 0.0000 0.7282 0.9087 0.0000 0.00 0.0000 0.0000 0.0355 

होगा

-1 qid:1 2:0.1253 4:0.1017 8:0.9999 
-1 qid:1 1:0.0098 6:0.0316 8:0.3661 
1 qid:1 3:0.1941 7:0.0509 
-1 qid:2 2:0.2863 3:0.0948 5:0.3400 7:0.7428 8:0.0608 
1 qid:2 4:0.4347 7:0.9539 
1 qid:2 2:0.7282 3:0.9087 8:0.0355 

समारोह मैं लिखने के लिए कुछ इस तरह कहा जा सकता है करना चाहते हैं:: इस प्रकार के रूप में प्रतिनिधित्व किया जा

write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt") 

या यहां तक ​​कि

write.svmlight(result ~ . | qid, data=mydata, file="out.txt") 

लेकिन मैं समझ नहीं model.matrix() और/या model.frame() उपयोग करने के लिए कैसे पता है कि कॉलम यह लिखने के लिए चाहिए था। क्या ये सही चीजें देखने जा रही हैं?

किसी भी मदद की बहुत सराहना की!

उत्तर

4

आंशिक उत्तर। तुम एक सूत्र वस्तु सबस्क्रिप्ट सूत्र का एक पार्स पेड़ पाने के लिए कर सकते हैं:

> f<-a~b+c|d 
> f[[1]] 
`~` 
> f[[2]] 
a 
> f[[3]] 
b + c | d 
> f[[3]][[1]] 
`|` 
> f[[3]][[2]] 
b + c 
> f[[3]][[3]] 
d 

अब आप सभी की जरूरत इस पेड़ चलने के लिए कोड है।

अपडेट: यहां पेड़ पर चलने वाले फ़ंक्शन का एक उदाहरण दिया गया है।

walker<-function(formu){ 
    if (!is(formu,"formula")) 
    stop("Want formula") 
    lhs <- formu[[2]] 
    formu <- formu[[3]] 

    if (formu[[1]]!='|') 
    stop("Want conditional part") 

    condi <- formu[[3]] 

    flattener <- function(f) {if (length(f)<3) return(f); 
          c(Recall(f[[2]]),Recall(f[[3]]))} 
    vars <- flattener(formu[[2]]) 

    list(lhs=lhs,condi=condi,vars=vars) 
} 

walker(y~a+b|c) 

इसके अलावा terms.formula और terms.object के लिए दस्तावेज़ को देखो। कुछ कार्यों के लिए कोड को देखते हुए जो सशर्त सूत्र लेते हैं, उदाहरण के लिए। lmerlme4 पैकेज में फ़ंक्शन।

+0

हे - हाँ, पेड़ चलना वास्तव में "मुझे बस चाहिए" है। =) मैंने lmer() पर एक नज़र डाली है, लेकिन मुझे स्रोत पैकेज को पकड़ना होगा क्योंकि इसकी 'lmerFrames()' विधि, जो पार्सिंग करने लगती है, छिपी हुई है। या इस तरह एस 4 विधियों के लिए कोड देखने का कोई तरीका है? –

+0

ठीक है, अब 'lmerFrames() 'आदि के स्रोत को देख रहे हैं। कितना भाग्यशाली मुझे लगता है कि मैं हमेशा मानता हूं कि फॉर्मूला में हेरफेर करने के लिए कुछ मामूली तरीका था। –

+1

आप :::, उदाहरण के द्वारा नामस्थानों में गैर-निर्यात किए गए कार्यों को देख सकते हैं। lme4 ::: lmerFrames। पेड़ पर चलने के लिए एक फ़ंक्शन शामिल करने के लिए मेरा उत्तर अपडेट किया गया, इस समय बहुत अधिक इनपुट जांच नहीं करता है। –

0

मैं

formu.names <- all.vars(formu) 
Y.name <- formu.names[1] 
X.name <- formu.names[2] 
block.name <- formu.names[3] 

इस्तेमाल किया कोड मैं एक फ्राइडमैन परीक्षण के लिए एक पोस्ट-हॉक करने के बारे में लिखते हैं:

http://www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/

लेकिन यह केवल के लिए काम करेंगे: Y`X | ब्लॉक

मुझे आशा है कि दूसरों को बेहतर जवाब मिलेगा।

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