কিভাবে একটি সংক্ষিপ্তভাবে একটি ডাটা ফ্রেম থেকে অনেক ভেরিয়েবল সহ একটি সূত্র লিখতে?


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সূত্র থেকেই রয়েছেন।


ডেটা ফ্রেম 'ডি' এর 4 টি কলাম রয়েছে (y, x1, x2, এবং x3)। সুতরাং সূত্রটি যদি "y ~।" হয় তবে ডান হাতের অর্থ বাম পাশের তালিকাগুলি বাদে "সমস্ত কলামগুলি" অর্থ কি?
stackoverflowuser2010

1
@ stackoverflowuser2010 হ্যাঁ, .প্রযুক্তিগতভাবে data সূত্রটিতে ইতিমধ্যে নয় এমন সমস্ত ভেরিয়েবলের অর্থ ।
গ্যাভিন সিম্পসন

1
@ তত্ত্ববিদদের যদি আপনি বোঝাতে চান যে dataতালিকা থেকে সূত্রের পরিবর্তনশীলগুলি সেই তালিকা থেকে সন্ধান করা হয় তবে হ্যাঁ। একটি ডেটা ফ্রেম, তালিকা বা পরিবেশ dataযুক্তিটির জন্য গ্রহণযোগ্য বিকল্প acceptable যদি আপনি যা বলতে চাইছেন তা না হয় তবে আপনাকে আরও কিছুটা প্রসারিত করতে হবে।
গ্যাভিন সিম্পসন

@Gavin। এটাই আমি বোঝাতে চাইছি। ধন্যবাদ। তালিকাভুক্ত ভেরিয়েবল বনাম প্রকৃত পরিবর্তনশীল নাম (যেমন, 'x3') হিসাবে ডেটা [[x]] ব্যবহার করে আমি কীভাবে এই পদ্ধতিটি ব্যবহার করব? উদাহরণস্বরূপ, আমি কীভাবে নীচের কাজগুলি করব ?: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)। সুতরাং আপনার ডেটা এটির আগে থেকেই কোনও তালিকা না থাকলে এমন কারণ হওয়ার খুব বেশি কারণ নেই but সূত্রের উপাদানগুলির একই দৈর্ঘ্য হওয়া প্রয়োজনীয়তা আপনার তালিকায় যা আছে তাতে কিছুটা বিধিনিষেধ আরোপ করে। আরও জটিল বস্তুগুলির সম্ভবত আপনার প্রয়োজনীয় উপাদানগুলি বের করার জন্য কোডের প্রয়োজন; যদি 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.forula অংশটি একটি সরিষা
জিনুয়া ওয়াং

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  

এছাড়াও, আর সম্পর্কে আমার তথ্য উল্লেখ করে যে এই নিয়োগের <-প্রস্তাব দেওয়া হয়েছে =


ধন্যবাদ! হ্যাঁ, আমি জানি সবাই সর্বদা <- টি ব্যবহার করতে বলে, তবে কেন এবং = টাইপ করা সহজ =) কেউ কখনও বলেনি।
grautur

2
@ গ্রেটুর একটি কারণ হ'ল কাজের মতো জিনিস 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)

নোট করুন যে ডেটা.ফ্রেমে নির্ভরশীল পরিবর্তনশীল যুক্ত করা 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() মডেল নির্বাচনের জন্য ফাংশনগুলি পরীক্ষা করতে পারেন । ডকুমেন্টেশনে যেমন বলা হয়েছে:

সম্পূর্ণ অনুসন্ধান, অগ্রণী বা পশ্চাদপদ পদক্ষেপ বা অনুক্রমিক প্রতিস্থাপন দ্বারা মডেল নির্বাচন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.