Как лаконично написать формулу со многими переменными из фрейма данных?
Предположим, у меня есть переменная ответа и данные, содержащие три ковариаты (как пример игрушки):
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 ответов:
есть специальный идентификатор, который можно использовать в формулах для обозначения всех переменных, это
.
идентификатор.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
как первый столбец в фрейме данных и вызов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)
обратите внимание, что добавление зависимой переменной для сведения.кадр в
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
"'