2014-09-23 9 views
5

के साथ आर में विकल्प में मैंने डेटा के विभिन्न सेटों पर एनोवा चलाने की कोशिश की और मुझे यह नहीं पता था कि इसे कैसे किया जाए। मैं goolged और इस उपयोगी पाया: http://www.ats.ucla.edu/stat/r/pages/looping_strings.htmएनोवा

hsb2 <- read.csv("http://www.ats.ucla.edu/stat/data/hsb2.csv") 
names(hsb2) 
varlist <- names(hsb2)[8:11] 
models <- lapply(varlist, function(x) { 
lm(substitute(read ~ i, list(i = as.name(x))), data = hsb2) 
}) 

क्या इसके बाद के संस्करण कोड करता है यह एक समारोह एल एम() बनाता है और varlist में प्रत्येक चर करने के लिए इसे लागू करते हैं और यह उनमें से प्रत्येक पर रेखीय प्रतीपगमन करता है की मेरी समझ ।

तो मैं एल एम के बजाय AOV का उपयोग इस तरह से मेरे लिए काम करेगा सोचा:

aov(substitute(read ~ i, list(i = as.name(x))), data = hsb2) 

हालांकि, मैं यह त्रुटि आई:

Error in terms.default(formula, "Error", data = data) : 
no terms component nor attribute 

मैं कहाँ त्रुटि से आता है की पता नहीं है । कृपया सहायता कीजिए!

+3

यह एक वेरिएबल तरीका शामिल करने का एक जटिल तरीका है जो वे सुझाते हैं। मैं शायद बस करूँगा: 'एलएम (as.formula (पेस्ट (" पढ़ें ~ ", एक्स)), डेटा = एचएसबी 2)' – thelatemail

+0

@ रिचर्डस्क्रीन: क्या आपको आश्चर्य है कि यह "शाश्वत सितंबर" का एक उदाहरण है (पोस्टिंग मामूली सुराग के साथ स्नातक की?) –

+1

@ बॉन्डडडस्ट मेरी इच्छा है कि मैं अभी भी एक स्नातक था .. – olala

उत्तर

5

समस्या यह है कि substitute() एक अभिव्यक्ति है, न कि एक सूत्र देता है। मुझे लगता है कि @ thelatemail का सुझाव

lm(as.formula(paste("read ~",x)), data = hsb2) 

एक अच्छा काम है। वैकल्पिक रूप से आप

models <- lapply(varlist, function(x) { 
    aov(eval(substitute(read ~ i, list(i = as.name(x)))), data = hsb2) 
}) 

साथ सूत्र प्राप्त करने के लिए अभिव्यक्ति का मूल्यांकन कर सकता है मैं यह क्या आप बाद में मॉडलों की सूची के साथ क्या करना चाहते हैं पर निर्भर करता है लगता है।

models <- lapply(varlist, function(x) { 
    eval(bquote(aov(read ~ .(as.name(x)), data = hsb2))) 
}) 

कर "स्वच्छ" call परिणाम से प्रत्येक के लिए संपत्ति देता है।

+0

का उपयोग कर सकता है आपको' bquote' और 'substitute' दोनों की आवश्यकता नहीं है - एक चुनें! जैसे 'eval (bquote (aov (पढ़ें ~। (as.name (x)), डेटा = एचएसबी 2))' – hadley

+0

धन्यवाद @ हैडली। पता नहीं क्यों मैं मूर्खतापूर्ण था। मैंने आपकी टिप्पणी के आधार पर अपडेट किया है। – MrFlick

+0

न तो 'विकल्प 'और न ही' bquote' आमतौर पर एक अभिव्यक्ति लौटाता है। आम तौर पर वे एक कॉल वापस करते हैं। –

5

यह करना चाहिए। Varlist वेक्टर आइटम द्वारा आइटम को फ़ंक्शन पर पास किया जा रहा है और कॉलम वितरित किया जाएगा। एलएम फ़ंक्शन केवल दो कॉलम डेटाफ्रेम दिखाई देगा और "पढ़ने" कॉलम प्रत्येक बार निर्भर चर होगा। फैंसी प्रतिस्थापन के लिए कोई ज़रूरत नहीं:

models <- sapply(varlist, function(x) { 
lm(read ~ ., data = hsb2[, c("read", x) ]) 
}, simplify=FALSE) 

> summary(models[[1]]) # The first model. Note the use of "[[" 

Call: 
lm(formula = read ~ ., data = hsb2[, c("read", x)]) 

Residuals: 
    Min  1Q Median  3Q  Max 
-19.8565 -5.8976 -0.8565 5.5801 24.2703 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 18.16215 3.30716 5.492 1.21e-07 *** 
write  0.64553 0.06168 10.465 < 2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 8.248 on 198 degrees of freedom 
Multiple R-squared: 0.3561, Adjusted R-squared: 0.3529 
F-statistic: 109.5 on 1 and 198 DF, p-value: < 2.2e-16 

सभी मॉडलों के लिए ::

lapply(models, summary) 
+0

अच्छा। 'Lapply' के बजाय' sapply (..., सरलीकृत = गलत) का उपयोग करना नाम भी रखेगा और आपको 'मॉडल $ लिखें' – thelatemail

+0

अच्छा मोड की तरह सबसेट करने की अनुमति देगा। संपादित करेंगे। –

+0

'lapply()' के साथ चिपकने के लिए साफ़ करें और फिर परिणामों का नाम दें। स्पष्टीकरण के लिए – hadley

4

अक्रुन ने दूसरी रात मेरा जवाब उधार लिया, अब मैं (आंशिक रूप से) उधार ले रहा हूं।

do.call चर को call आउटपुट में डालता है ताकि यह ठीक से पढ़ सके। सरल प्रतिगमन के लिए यहां एक सामान्य कार्य है।

doModel <- function(col1, col2, data = hsb2, FUNC = "lm") 
{ 
    form <- as.formula(paste(col1, "~", col2)) 
    do.call(FUNC, list(form, substitute(data))) 
}  

lapply(varlist, doModel, col1 = "read") 
# [[1]] 
# 
# Call: 
# lm(formula = read ~ write, data = hsb2) 
# 
# Coefficients: 
# (Intercept)  write 
#  18.1622  0.6455 
# 
# 
# [[2]] 
# 
# Call: 
# lm(formula = read ~ math, data = hsb2) 
# 
# Coefficients: 
# (Intercept)   math 
#  14.0725  0.7248 
# 
# ... 
# ... 
# ... 

नोट: thelatemail उसकी टिप्पणी में उल्लेख के रूप में

sapply(varlist, doModel, col1 = "read", simplify = FALSE) 

सूची के नाम रखेंगे और यह भी list$name subsetting अनुमति देते हैं।

+0

+1 स्वीकृति के लिए :-) – akrun

+0

स्पष्टीकरण के लिए धन्यवाद! – olala

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

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