चर की गतिशील संख्या के साथ सूत्र


83

मान लीजिए, कुछ डेटा है। foo_data_frame और कुछ अन्य स्तंभों द्वारा लक्ष्य स्तंभ Y के प्रतिगमन को खोजना चाहता है । उस उद्देश्य के लिए सामान्य रूप से कुछ सूत्र और मॉडल का उपयोग किया जाता है। उदाहरण के लिए:

linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)

यदि फॉर्मूला कोडित है तो यह अच्छी तरह से काम करता है। यदि यह निर्भर चर की निरंतर संख्या (जैसे, 2) के साथ कई मॉडलों को जड़ देने के लिए वांछित है, तो इसे इस तरह से व्यवहार किया जा सकता है:

for (i in seq_len(factor_number)) {
  for (j in seq(i + 1, factor_number)) {
    linear_model <- lm(Y ~ F1 + F2, list(Y=foo_data_frame$Y,
                                         F1=foo_data_frame[[i]],
                                         F2=foo_data_frame[[j]]))
    # linear_model further analyzing...
  }
}

मेरा प्रश्न यह है कि जब कार्यक्रम चल रहा हो तो चर की संख्या को गतिशील रूप से कैसे प्रभावित किया जाए?

for (number_of_factors in seq_len(5)) {
   # Then root over subsets with #number_of_factors cardinality.
   for (factors_subset in all_subsets_with_fixed_cardinality) {
     # Here I want to fit model with factors from factors_subset.
     linear_model <- lm(Does R provide smth to write here?)
   }
}

2
धन्यवाद! आपके मध्य उदाहरण ने मुझे एहसास दिलाया कि मुझे आपके प्रश्न के समाधान की आवश्यकता नहीं है और मैं बहुत कुछ सरल कर सकता हूं!
मार्क एडम्सन

जवाबों:


105

देखें ?as.formula, उदा:

factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2

जहां factorsएक चरित्र वेक्टर है जिसमें उन कारकों के नाम हैं जिन्हें आप मॉडल में उपयोग करना चाहते हैं। यह आप एक lmमॉडल में पेस्ट कर सकते हैं , उदाहरण के लिए:

set.seed(0)
y <- rnorm(100)
factor1 <- rep(1:2, each=50)
factor2 <- rep(3:4, 50)
lm(as.formula(paste("y~", paste(factors, collapse="+"))))

# Call:
# lm(formula = as.formula(paste("y~", paste(factors, collapse = "+"))))

# Coefficients:
# (Intercept)      factor1      factor2  
#    0.542471    -0.002525    -0.147433

66

एक बार भूल समारोह है reformulate। से ?reformulate:

reformulate एक चरित्र वेक्टर से एक सूत्र बनाता है।


एक सरल उदाहरण:

listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')

इस सूत्र से उपज होगी:

y ~ factor1 + factor2


यद्यपि स्पष्ट रूप से प्रलेखित नहीं है, आप बातचीत की शर्तें भी जोड़ सकते हैं:

listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors), 
    response = 'y')

निकलेगा:

y ~ factor1 + factor2 + (factor3 + factor4)^2


3
@JorisMeys और यह बहुत अच्छा है क्योंकि यह बातचीत की शर्तों को जोड़ने की अनुमति देता है! मैं वर्षों से इसी तरह के समाधान की तलाश कर रहा हूं ..
Landroni

क्या होगा यदि x चर में रिक्त स्थान हों? "कारक 1", "कारक 2" आदि कहें।
स्वयंसिद्ध

11

एक अन्य विकल्प सूत्र में एक मैट्रिक्स का उपयोग करना हो सकता है:

Y = rnorm(10)
foo = matrix(rnorm(100),10,10)
factors=c(1,5,8)

lm(Y ~ foo[,factors])

3
+1, लेकिन इस तथ्य से अवगत रहें कि यह परस्पर प्रभाव का उपयोग करने की अनुमति नहीं देता है। उसके लिए एक मॉडल मैट्रिक्स के रूप में अच्छी तरह से निर्माण कर सकते हैं (देखें ?model.matrix)
जोरिस Meys

4

आप वास्तव में एक सूत्र की जरूरत नहीं है। यह काम:

lm(data_frame[c("Y", "factor1", "factor2")])

जैसा कि यह है:

v <- c("Y", "factor1", "factor2")
do.call("lm", list(bquote(data_frame[.(v)])))

+1 बहुत सही है, लेकिन फिर से, आपको इंटरैक्शन प्रभाव के साथ मैट्रिक्स का निर्माण करने के लिए model.matrix का उपयोग करना होगा।
जोरिस Meys

0

मैं आमतौर पर अपनी प्रतिक्रिया कॉलम का नाम बदलकर इसे हल करता हूं। यह गतिशील रूप से करना आसान है, और संभवतः क्लीनर।

model_response <- "response_field_name"
setnames(model_data_train, c(model_response), "response") #if using data.table
model_gbm <- gbm(response ~ ., data=model_data_train, ...)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.