डेटा फ्रेम से कई चर के साथ एक सूत्र को सफलतापूर्वक कैसे लिखें?


127

मान लीजिए कि मेरे पास एक प्रतिक्रिया चर और तीन सहसंयोजक (एक खिलौना उदाहरण के रूप में) वाला डेटा है:

y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))

मैं डेटा के लिए एक रेखीय प्रतिगमन फिट करना चाहता हूँ:

fit = lm(y ~ d$x1 + d$x2 + d$y2)

क्या सूत्र लिखने का कोई तरीका है, ताकि मुझे प्रत्येक व्यक्ति कोवरिएट लिखना न पड़े? उदाहरण के लिए, कुछ ऐसा

fit = lm(y ~ d)

(मैं चाहता हूं कि डेटा फ़्रेम में प्रत्येक चर एक कोवरिएट हो।) मैं पूछ रहा हूं क्योंकि मेरे डेटा फ्रेम में वास्तव में 50 चर हैं, इसलिए मैं बाहर लिखने से बचना चाहता हूं x1 + x2 + x3 + etc



जवाबों:


202

एक विशेष पहचानकर्ता है जो सभी चर का अर्थ करने के लिए एक सूत्र में उपयोग कर सकता है, यह .पहचानकर्ता है।

y <- c(1,4,6)
d <- data.frame(y = y, x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
mod <- lm(y ~ ., data = d)

आप सभी चर का उपयोग करने के लिए इस तरह की चीजें भी कर सकते हैं, लेकिन एक (इस मामले में x3 को बाहर रखा गया है):

mod <- lm(y ~ . - x3, data = d)

तकनीकी रूप से, .इसका मतलब है कि सभी चर पहले से ही सूत्र में उल्लिखित नहीं हैं । उदाहरण के लिए

lm(y ~ x1 * x2 + ., data = d)

जहां .केवल संदर्भ हैं x3के रूप में x1और x2सूत्र में पहले से ही कर रहे हैं।


डेटा फ़्रेम 'd' में 4 कॉलम (y, X1, x2 और x3) हैं। तो अगर सूत्र "y ~" है, तो क्या दाहिने हाथ की तरफ का अर्थ "सभी कॉलम" है, जो बाएं हाथ की तरफ सूचीबद्ध हैं?
stackoverflowuser2010

1
@ stackoverflowuser2010 हाँ, .तकनीकी रूप से data पहले से ही सूत्र में सभी चर का मतलब है
गैविन सिम्पसन

1
@forestecologist अगर आपका मतलब dataसूची से किस चर में है उस सूची से देखा जाता है, तो हाँ। एक डेटा फ्रेम, सूची या पर्यावरण dataतर्क के लिए स्वीकार्य विकल्प हैं । यदि आपका मतलब यह नहीं है, तो आपको थोड़ा और विस्तार करने की आवश्यकता होगी।
गैविन सिम्पसन

@Gavin। वही तो मेरा मतलब था। धन्यवाद। मैं डेटा का उपयोग करके इस विधि के बारे में कैसे जाऊंगा [[x]] एक सूचीबद्ध चर बनाम वास्तविक चर नाम (जैसे, 'x3') के रूप में? उदाहरण के लिए, मैं निम्नलिखित कार्य कैसे lm(d[[1]] ~ d[[3]] + ., data = d)
करूँगा

यह namesसूची से हटकर काम करता है ; आप कहते हैं ll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10)), तो निम्नलिखित काम करता है lm(y ~ x + ., data = ll):। जब तक यह पहले से ही एक सूची नहीं है, तो इस तरह से आपके डेटा होने का बहुत कारण नहीं है, लेकिन यह काम करता है। आवश्यकता है कि सूत्र के तत्व समान लंबाई के होते हैं जो आपके पास एक सूची में कुछ प्रतिबंध लगाते हैं। अधिक जटिल वस्तुओं को संभवतः आपके इच्छित तत्वों को निकालने के लिए कोड की आवश्यकता होती है; यदि d[[1]]एक डेटा फ्रेम / मैट्रिक्स होता है, तो आपको उस काम को करने के लिए कोड की आवश्यकता होती है
गेविन सिम्पसन

66

एक स्ट्रिंग से अपने सूत्र बनाने के लिए थोड़ा अलग दृष्टिकोण है। में formulaमदद पृष्ठ आप निम्न उदाहरण मिल जाएगा:

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")
fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))

फिर यदि आप उत्पन्न सूत्र को देखते हैं, तो आपको मिलेगा:

R> fmla
y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25

1
फ़ाइल से इन मानों को पढ़ने के लिए यह बहुत अच्छा काम करता है। धन्यवाद!
बेन सिधोम

ध्यान दें कि as.formula हिस्सा एक मस्तक है
जिंहुआ वांग

7

हां, yडेटाफ़्रेम में पहले कॉलम के रूप में प्रतिक्रिया जोड़ें और lm()उस पर कॉल करें :

d2<-data.frame(y,d)
> d2
  y x1 x2 x3
1 1  4  3  4
2 4 -1  9 -4
3 6  3  8 -2
> lm(d2)

Call:
lm(formula = d2)

Coefficients:
(Intercept)           x1           x2           x3  
    -5.6316       0.7895       1.1579           NA  

इसके अलावा, आर के बारे में मेरी जानकारी बताती है कि इसके साथ असाइनमेंट <-की सिफारिश की गई है =


धन्यवाद! हाँ, मुझे पता है कि हर कोई हमेशा <- का उपयोग करने के लिए कहता है, लेकिन कोई भी कभी नहीं कहता है कि क्यों और = टाइप करना आसान है)।
कब्र

2
@gratur एक कारण यह है कि काम जैसी चीजें foo(bar <- 1:10)(और barबनाई जाती हैं) लेकिन foo(bar = 1:10)या तो विफल होंगी क्योंकि barकोई तर्क नहीं है fooऔर barया तो नहीं बनाएगा ।
गैविन सिम्पसन

2
का गुणांक क्यों है x3 NA?
ज़ियायुंग

6

जुबा की विधि का एक विस्तार का उपयोग करना है reformulate, एक फ़ंक्शन जो स्पष्ट रूप से इस तरह के कार्य के लिए डिज़ाइन किया गया है।

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")

reformulate(xnam, "y")
y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25

ओपी में उदाहरण के लिए, यहां सबसे आसान समाधान होगा

# add y variable to data.frame d
d <- cbind(y, d)
reformulate(names(d)[-1], names(d[1]))
y ~ x1 + x2 + x3

या

mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d)

ध्यान दें कि निर्भर चर को data.frame में जोड़ना d <- cbind(y, d)न केवल इसलिए पसंद किया जाता है क्योंकि यह उपयोग करने की अनुमति देता है reformulate, बल्कि इसलिए भी है क्योंकि यह भविष्य में lmऑब्जेक्ट के उपयोग जैसे कार्यों के लिए अनुमति देता है predict


2

मैं इस समाधान का निर्माण reformulateकरता हूं, यह ध्यान नहीं रखता है कि चर नामों में सफेद स्थान हैं।

add_backticks = function(x) {
    paste0("`", x, "`")
}

x_lm_formula = function(x) {
    paste(add_backticks(x), collapse = " + ")
}

build_lm_formula = function(x, y){
    if (length(y)>1){
        stop("y needs to be just one variable")
    }
    as.formula(        
        paste0("`",y,"`", " ~ ", x_lm_formula(x))
    )
}

# Example
df <- data.frame(
    y = c(1,4,6), 
    x1 = c(4,-1,3), 
    x2 = c(3,9,8), 
    x3 = c(4,-4,-2)
    )

# Model Specification
columns = colnames(df)
y_cols = columns[1]
x_cols = columns[2:length(columns)]
formula = build_lm_formula(x_cols, y_cols)
formula
# output
# "`y` ~ `x1` + `x2` + `x3`"

# Run Model
lm(formula = formula, data = df)
# output
Call:
    lm(formula = formula, data = df)

Coefficients:
    (Intercept)           x1           x2           x3  
        -5.6316       0.7895       1.1579           NA  

`` `


0

आप पैकेज की जांच कर सकते हैं leapsऔर विशेष रूप से regsubsets() मॉडल चयन के लिए फ़ंक्शन कार्य कर सकते हैं । जैसा कि प्रलेखन में कहा गया है:

संपूर्ण खोज, आगे या पीछे की ओर स्टेप वाइज, या क्रमिक प्रतिस्थापन द्वारा मॉडल का चयन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.