Как кратко написать формулу со многими переменными из фрейма данных?

Предположим, что у меня есть переменная ответа и данные, содержащие три ковариата (в качестве примера игрушек):

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 . Д.

6 Solutions collect form web for “Как кратко написать формулу со многими переменными из фрейма данных?”

Существует специальный идентификатор, который можно использовать в формуле для обозначения всех переменных, это . идентификатор.

 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) 

Вы также можете делать такие вещи, чтобы использовать все переменные bar one:

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

Технически . означает все переменные, не упомянутые в формуле . Например

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

где . будет только ссылаться на x3 поскольку x1 и x2 уже находятся в формуле.

Несколько иной подход – создать формулу из строки. На странице справки 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 

Да, конечно, просто добавьте ответ y как первый столбец в dataframe и вызовите 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 

Кроме того, моя информация о R указывает, что назначение с < - рекомендуется более = .

Расширение метода Джубы заключается в использовании функции 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 

Для примера в OP, самым простым решением здесь было бы

 # 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 ,

Я создаю это решение, 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 

`` `

Вы можете проверить leaps пакетов и, в частности, функции regsubsets() для выбора модели. Как указано в документации:

Выбор модели путем исчерпывающего поиска, вперед или назад поэтапно или последовательной замены

  • RE: Выравнивание чисел на отдельных барах с помощью ggplot2
  • Для циклов над диграфом в R не работает
  • Строки data.frame в список
  • Как разбить строку на подстроки заданной длины?
  • Разделить строку строки фрейма данных на несколько столбцов
  • Вычислить кумулятивную сумму в каждом идентификаторе (группе)
  • Порядок приоритета оператора при использовании «:» (двоеточие)
  • Как читать только строки, которые выполняют условие из csv в R?
  • Как эффективно рассчитать расстояние между парой координат с помощью data.table: =
  • Как удалить пустые факторы из граней ggplot2?
  • ggplot legendends - изменить ярлыки, порядок и название
  • Interesting Posts

    Как заставить Visual Studio копировать DLL-файл в выходной каталог?

    Могу ли я использовать монитор USB (например, Mimo) в качестве основного монитора?

    Как можно приобрести / получить Microsoft DVD / CD-носители, если у вас есть только версия для загрузки MSDNAA

    Новое контекстное меню Windows 8: официальное название и документация?

    Заполнение выпадающего списка HTML в JSP со значениями, полученными из базы данных в Servlet

    Результат входа в Windows Vista: чистый профиль

    Сравнение двух NSDates и игнорирование временной составляющей

    Aptana Studio 3 Eclipse плагин javascript завершение кода

    Как полностью отключить Windows-защитник в Windows 10?

    Использование обратной косой черты для удаления символов в cmd.exe (например, команда runas)

    Как UPSERT (MERGE, INSERT … ON DUPLICATE UPDATE) в PostgreSQL?

    Firefox, сохраняя все изображения с каждой страницы, чтобы их можно было восстановить?

    Создавайте дружественные URL-адреса SEO (пули)

    Обновление синтаксиса кэшированных данных CSS

    Какую кодировку я должен использовать для базовой проверки подлинности HTTP?

    Давайте будем гением компьютера.