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