2013-05-16 5 views
6

आर में, सूत्र वस्तु प्रतीकात्मक है और यह पार्स करना मुश्किल लगता है। हालांकि, मैं आरबाहरी उपयोग के लिए प्रतीकात्मक सूत्र की व्याख्या करने के लिए आर का उपयोग

(1)

f दे के बाहर उपयोग के लिए लेबल की एक स्पष्ट सेट में इस तरह के एक सूत्र पार्स करने के लिए की जरूरत है model formulae जिसमें एक प्रतिक्रिया निर्दिष्ट नहीं है का प्रतिनिधित्व करता है, उदा ~V1 + V2 + V3, एक बात मैंने कोशिश की थी:

t <- terms(f) 
attr(t, "term.labels") 

बहरहाल, यह वास्तव में क्या स्पष्ट है अगर f में चर के कुछ स्पष्ट कर रहे हैं नहीं मिलता है। उदाहरण के लिए, V1 दो श्रेणियों के साथ एक स्पष्ट चर हो, यानी एक बूलियन, और V2 दोहराएं।

इसलिए, ~V1:V2 द्वारा निर्दिष्ट मॉडल में 2 पैरामीटर होना चाहिए: "अवरोध" और "xyes: z"। इस बीच, ~V1:V2 - 1 द्वारा निर्दिष्ट मॉडल में "xno: z" और "xyes: z" पैरामीटर होना चाहिए। हालांकि, terms() फ़ंक्शन को बताने के तरीके के बिना, कौन से चर स्पष्ट हैं (और कितने श्रेणियों) में इनको समझने में सक्षम होने का कोई तरीका नहीं है। इसके बजाए, इसके पास V1:V2 है जो इसके "terms.labels" में है जिसका संदर्भ इस संदर्भ में कुछ भी नहीं है कि V1 स्पष्ट है।

(2)

दूसरी ओर, model.matrix का उपयोग कर वास्तव में मैं क्या चाहते हैं पाने के लिए एक आसान तरीका है। समस्या यह है कि इसे data तर्क की आवश्यकता है, जो मेरे लिए बुरा है क्योंकि मैं केवल आर के बाहर उपयोग के लिए प्रतीकात्मक सूत्र की स्पष्ट व्याख्या चाहता हूं। यह प्राप्त करने की यह विधि बहुत समय बर्बाद करेगी (तुलनात्मक रूप से) क्योंकि आर को पढ़ना है बाहरी स्रोत से डेटा जब इसे वास्तव में सूत्र के लिए जानना आवश्यक होता है तो कौन सा चर स्पष्ट (और कितनी श्रेणियां) हैं और कौन से चर युगल हैं।

क्या वास्तविक डेटा के बजाए डेटा के प्रकार निर्दिष्ट करने के साथ 'model.matrix' का उपयोग करने का कोई तरीका है? यदि नहीं, तो व्यवहार्य समाधान क्या है?

उत्तर

4

ठीक है, यह केवल डेटा रखने के संदर्भ में है कि यह निर्धारित किया जा सकता है कि दिया गया चर एक कारक या संख्यात्मक है या नहीं। तो आप डेटा तर्क के बिना ऐसा नहीं कर सकते हैं। लेकिन आपको केवल संरचना की आवश्यकता है, डेटा नहीं, इसलिए आप सभी सही प्रकार के कॉलम के साथ 0-पंक्ति डेटा फ्रेम का उपयोग कर सकते हैं। दो data.frames पर

f <- ~ V1:V2 
V1numeric <- data.frame(V1=numeric(0), V2=numeric(0)) 
V1factor <- data.frame(V1=factor(c(), levels=c("no","yes")), V2=numeric(0)) 

देख रहे हैं: के साथ उपयोग model.matrix

> V1numeric 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1numeric) 
'data.frame': 0 obs. of 2 variables: 
$ V1: num 
$ V2: num 
> V1factor 
[1] V1 V2 
<0 rows> (or 0-length row.names) 
> str(V1factor) 
'data.frame': 0 obs. of 2 variables: 
$ V1: Factor w/ 2 levels "no","yes": 
$ V2: num 

इन

> model.matrix(f, data=V1numeric) 
    (Intercept) V1:V2 
attr(,"assign") 
[1] 0 1 
> model.matrix(f, data=V1factor) 
    (Intercept) V1no:V2 V1yes:V2 
attr(,"assign") 
[1] 0 1 1 
attr(,"contrasts") 
attr(,"contrasts")$V1 
[1] "contr.treatment" 

आप एक असली डेटा सेट है, तो यह 0-पंक्ति पाने के लिए आसान है उस डेटा से डेटा.फ्रेम जो कॉलम जानकारी को बरकरार रखता है। बस FALSE के साथ इसे सब्सक्राइब करें। यदि आपके पास सही गुणों वाला कोई है तो आपको डेटा से फ्रेम बनाने की आवश्यकता नहीं है।

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> str(mtcars[FALSE,]) 
'data.frame': 0 obs. of 11 variables: 
$ mpg : num 
$ cyl : num 
$ disp: num 
$ hp : num 
$ drat: num 
$ wt : num 
$ qsec: num 
$ vs : num 
$ am : num 
$ gear: num 
$ carb: num 
+0

त्वरित उत्तर के लिए धन्यवाद। मेरे पास एक वास्तविक डेटा सेट है, लेकिन यह बड़ा और बाहर आर है इसलिए इसे पढ़ने से दक्षता कम हो जाती है। आपके पास पहले भाग में क्या अच्छा लगता है, लेकिन एक बात जो मुझे समझ में नहीं आती है वह है कि 'model.matrix (f, data = V1Factor)' 3 प्रासंगिक मानकों का उत्पादन करता है, जब इसमें 'V1no: V2' नहीं होना चाहिए एक अवरोध है। –

+0

आर इंटरैक्शन मौजूद होने पर निचले ऑर्डर पैरामीटर को हटाने के लिए अनिच्छुक होने के लिए जाना जाता है, शायद यही कारण है: http://stackoverflow.com/q/11335923/289572 – Henrik

+0

@ जोनक्लॉस मुझे लगता है कि इसमें तीन पैरामीटर होना चाहिए: अवरोध, 'वी 2' की ढलान' वी 1' नहीं है, और 'वी 2' की ढलान' जब वी 1' हां है (जिस तरह से इसे यहां पैरामीटर किया गया है)। आप 'पैरामीटर' के साथ 3 पैरामीटर भी प्राप्त कर सकते हैं, 'वी 2' की ढलान, जब' वी 1' नहीं है, और 'वी 2' की ढलान में परिवर्तन' वी 1' से हां तक ​​बदलता है। हालांकि आप इसे parametrize, 3 पैरामीटर हैं। –

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