Предположим, у меня есть переменная ответа и данные, содержащие три ковариаты (в качестве игрушечного примера):
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
.
Ответы:
Существует специальный идентификатор, который можно использовать в формуле для обозначения всех переменных, это
.
идентификатор.Вы также можете сделать это, чтобы использовать все переменные, кроме одной (в этом случае x3 исключен):
Технически
.
означает все переменные, еще не упомянутые в формуле . Напримергде
.
будет только ссылка,x3
посколькуx1
иx2
уже есть в формуле.источник
.
технически означает, что все переменные ещеdata
не включены в формулу .data
что это список, из которого переменные в формуле ищутся из этого списка, тогда да. Фрейм данных, список или окружение являются приемлемыми вариантамиdata
аргумента. Если это не то, что вы имеете в виду, вам нужно немного расширить.lm(d[[1]] ~ d[[3]] + ., data = d)
names
списка; что у вас естьll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, то следующие работы:lm(y ~ x + ., data = ll)
. Так что нет особых причин для таких данных, если они уже не являются списком, но это работает. Требование, чтобы элементы формулы были одинаковой длины, накладывает некоторые ограничения на то, что у вас есть в списке. Более сложные объекты, вероятно, нуждаются в коде для извлечения нужных вам элементов; если быd[[1]]
это был фрейм данных / матрица, вам нужен код, чтобы это работалоНемного другой подход - создать формулу из строки. На
formula
странице справки вы найдете следующий пример:Тогда, если вы посмотрите на сгенерированную формулу, вы получите:
источник
Да, конечно, просто добавьте ответ в
y
качестве первого столбца в фрейм данных и вызовитеlm()
его:Кроме того, моя информация о R указывает на то, что назначение с
<-
рекомендуется более=
.источник
foo(bar <- 1:10)
работа (иbar
создается)foo(bar = 1:10)
, либо не сработают, потому чтоbar
не являются аргументомfoo
и не будут создаватьbar
ни то, ни другое.x3
NA
?Расширением метода джубы является использование
reformulate
функции, которая специально предназначена для такой задачи.Для примера в OP самым простым решением здесь было бы
или
Обратите внимание, что добавление зависимой переменной в data.frame в
d <- cbind(y, d)
предпочтительнее не только потому, что оно позволяет использоватьreformulate
, но также потому, что оно позволяет использоватьlm
объект в будущем в таких функциях, какpredict
.источник
Я создаю это решение,
reformulate
не заботясь о том, есть ли в именах переменных пробелы.`` `
источник
Вы можете проверить пакет
leaps
и, в частности, функцииregsubsets()
функции для выбора модели. Как указано в документации:Выбор модели путем исчерпывающего поиска, пошаговой или последовательной замены вперед или назад
источник