Использование 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)

Остальные ответы довольно старые, так что, возможно, это новая функция, но она довольно аккуратная!