Использование R lm на кадре данных со списком предикторов
У меня есть dataframe с пусть N + 2 столбцов. Во-первых, это только даты (в основном используемые для построения позже), вторая - переменная, ответ которой на остальные N столбцов, которые я хотел бы вычислить. Я думаю, что должно быть что-то вроде
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
fit = lm(y~df[,2:3],data=df)
Это не работает. Я также пробовал и терпел неудачу с помощью
fit = lm(y~sapply(colnames(df)[2:3],as.name),data=df)
Любые мысли?
Ответы
Ответ 1
Использование обозначения формул y ~ .
указывает, что вы хотите регрессировать y для всех других переменных в наборе данных.
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
# fits a model using x1 and x2
fit <- lm(y ~ ., data = df)
# Removes the column containing x1 so regression on x2 only
fit <- lm(y ~ ., data = df[, -2])
Ответ 2
Существует альтернатива ответам Dason, поскольку если вы хотите указать столбцы, чтобы исключить их по имени. Он должен использовать subset()
и указать аргумент select
:
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
fit = lm(y ~ ., data = subset(df, select=-x1))
Попытка использовать data[,-c("x1")]
не работает с "недопустимым аргументом для унарного оператора".
Он может распространяться на исключение нескольких столбцов: subset(df, select = -c(x1,x2))
И вы все равно можете использовать числовые столбцы:
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
fit = lm(y ~ ., data = subset(df, select = -2))
(Это эквивалентно subset(df, select=-x1)
, потому что x1
- это второй столбец.)
Естественно, вы также можете использовать это, чтобы указать столбцы для включения.
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
fit = lm(y ~ ., data = subset(df, select=c(y,x2)) )
(Да, это эквивалентно lm(y ~ x2, df)
, но отличается, если вы собираетесь использовать step()
, например.)
Ответ 3
Я новичок в R, но я нашел другой способ сделать это для именованных столбцов в фрейме данных. Скажем, вы хотите запустить регрессию, используя все столбцы, кроме столбца x2
, тогда вы напишите:
df = data.frame(y = 1:10, x1 = runif(10), x2 = rnorm(10))
# Removes the column containing x2 so regression on x1 only
model <- lm(Y ~ . - x2, data = df)
# to remove more columns (assuming there were more columns in the data frame)
model <- lm(Y ~ . - x2 - x3 - x4, data = df)
Остальные ответы довольно старые, так что, возможно, это новая функция, но она довольно аккуратная!