Як написати формулу лінійної моделі зі 100 змінними в R


22

Чи є в R простий спосіб створити лінійну регресію над моделлю зі 100 параметрами в R? Скажімо, у нас є вектор Y з 10 значеннями та фрейм X з 10 стовпцями та 100 рядками. У математичних позначеннях я писав би Y = X[[1]] + X[[2]] + ... + X[[100]]. Як написати щось подібне в синтаксисі R?


1
є 100 чи 1000? Також, як правило, стовпці будуть змінними, а рядки - спостереженнями (здається, що тут перевернено)
Макрос

100 додаткових 0 було друком
Крістіан

2
Дійсно? Ви впевнені, що хочете це зробити? Мене б турбувало надмірне співвідношення та співвідношення між лінійними комбінаціями прогнозів. Мало того, що зі 100 прогнозовами, але лише з 10 спостереженнями, у вас і лінійна регресія взагалі не спрацює. p>n
Аарон - Відновіть Моніку

Відповіді:


29

Спробуйте це

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)

4
І якщо ви хочете, скажімо, всіх взаємодій другого порядку, можете написати y ~ . + .^2. І так далі.
Lutz Prechelt

3
І якщо ви хочете лише деяких взаємодій другого порядку, щось подібне y ~ . + .:x1допоможе отримати взаємодію кожної змінної (крім x1) x1. І так далі; ви отримуєте ідею.
Lutz Prechelt

21

Чудові відповіді!

Я додам, що за замовчуванням виклик formulaа data.frameстворює аддитивну формулу для регресу першого стовпця на інші.

Тож у випадку відповіді @ сьогодні.zuokas ви навіть можете зробити

lm(df)

що трактується правильно.


Але ця відповідь не працює, якщо ви хочете змішатись у термінах взаємодії. З вами (+1).
gui11aume

6
Мене постійно дивує, наскільки перевантажена більшість Rоператорів :)
Макрос

19

Якщо кожен рядок є спостереженням, і кожен стовпець є предиктором, так що - довжина вектора, а - матриця ( у цьому випадку ), ви можете зробити це за допомогоюn X n × p p = 100YnXn×pp=100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

Якщо є інші стовпці, які ви не хотіли включати в якості прогнозів, вам доведеться їх видалити, Xперш ніж використовувати цей трюк або використовувати -формулу моделі, щоб виключити їх. Наприклад, якщо ви хотіли виключити 67-й предиктор (який має відповідну назву x67), ви можете написати

lm(Y ~ .-x67,data=Z)

Крім того, якщо ви хочете включити взаємодії тощо., Вам потрібно буде додати їх вручну як (наприклад)

lm(Y ~ .+X[,1]*X[,2],data=Z)

або переконайтеся, що вони введені як стовпці X.


19

Ви також можете використовувати комбінацію функцій formulaта paste.

Дані про налаштування : Давайте уявимо, що у нас є фрейм data.frame, який містить змінні x1передбачувача x100та нашу залежну змінну y, але також існує змінна неприємність asdfasdf. Також змінні предиктора розміщені в такому порядку, що вони не всі суміжні у data.frame.

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

Уявімо також, що у вас є рядок, що містить імена змінних прогнозника. У цьому випадку це можна легко створити за допомогою pasteфункції, але в інших ситуаціях grepабо для отримання цього рядка може бути використаний якийсь інший підхід.

PredictorVariables <- paste("x", 1:100, sep="")

Застосувати підхід . Потім ми можемо побудувати формулу таким чином:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • то collapseаргумент вставка +між предикторами
  • formulaперетворює рядок у об'єкт формули класу, придатний для lmфункції.

Більш загально, я використовую наступну функцію досить регулярно, коли хочу поставити змінні передбачувача як вектор імен змінних.

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

Наприклад,

regression("y", PredictorVariables, Data)

2
+1. Я постійно використовую цю техніку. Іноді, однак, зберігання формули, що зберігається у змінній, викликає проблеми. Дивіться stackoverflow.com/a/7668846/210673 щодо використання do.callоцінювання формули перед викликом lm.
Аарон - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.