Как написать формулу линейной модели со 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. И так далее.
Лутц Пречелт

3
И если вам нужны только некоторые взаимодействия второго порядка, что-то вроде этого y ~ . + .:x1даст вам взаимодействия каждой переменной (кроме x1) с x1. И так далее; Вы поняли идею.
Лутц Пречелт

21

Отличные ответы!

Я бы добавил, что по умолчанию вызов formulaa data.frameсоздает аддитивную формулу для регрессии первого столбца на другие.

Так что в случае ответа @ danas.zuokas вы можете даже сделать

lm(df)

который интерпретируется правильно.


Тем не менее, этот ответ не работает, если вы хотите смешать в терминах взаимодействия. Ваш делает (+1).
gui11aume

6
Я постоянно поражаюсь, насколько перегружены большинство Rоператоров :)
Макро

19

YnXn×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.