Функция линейной модели R (лм) не исключает предсказанную переменную из предикторов - PullRequest
0 голосов
/ 12 января 2020

У меня есть фрейм данных, в котором я хочу предсказать все переменные из других переменных, поэтому я создаю al oop следующим образом:

df = iris
df$Species <- NULL

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] <- lm(df[, i] ~ ., df)
}

Но, к моему удивлению, каждая переменная выглядит так, как собственный предиктор; даже если я сделаю:

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] = lm(df[, i] ~ . - df[, i], df)
}

То же самое происходит.

Я знаю, что могу создать правильное выражение формулы на стороне с правильными именами и так далее, но я чувствую, что это не должно быть желательным поведением для lm.

Вопрос в том, : Я что-то пропустил? Есть ли причина, почему эта функция имеет такое неудобное поведение? Если ответ на предыдущий вопрос «нет», разве это не должно быть улучшено?

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Исключает имена, но этот код не использует их.

df = iris
df$Species <- NULL

LM <- function(nm) {
  fo <- paste(nm, "~.")
  do.call("lm", list(fo, quote(df)))
}
Map(LM, names(df))

, давая этот список из 4 элементов (отображается только первый):

$Sepal.Length

Call:
lm(formula = "Sepal.Length ~.", data = df)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      1.8560        0.6508        0.7091       -0.5565  

## ..snip...
2 голосов
/ 12 января 2020

Это кажется ожидаемым и очень соответствует тому, как R работает для меня. Вы передаете df в аргумент data, но затем ссылаетесь на другую df в своей формуле (это та же самая, но другая ссылка на объект в этой точке.

В вашем первом примере , ваша y переменная не из data, она из другого df. Поэтому столбец data отсутствует, а . возвращает все.

Во втором примере, Вы говорите, что включаете все переменные из data, но исключаете столбец из некоторого другого фрейма данных df. Таким образом, он исключает этот столбец из df, но все равно остается со всеми столбцами из data.

Я думаю, это то, что вы ожидаете:

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] = lm(df[, i] ~ ., df[, -i])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...