Просмотрел форум, но не нашел того, что ищу.
Я хочу запустить простую линейную регрессию пару раз. Каждый раз, когда в качестве независимой переменной используется другой столбец, зависимая переменная остается неизменной. После запуска я хочу иметь возможность извлечь R в квадрате из каждой из регрессий. Мой мыслительный процесс состоял в том, чтобы использовать простой цикл for. Однако я не могу заставить его работать.
Предположим, я работаю со следующими данными:
num value person1 person2 person3
0 1 229 29 81 0
1 2 203 17 75 0
2 3 244 62 0 55
и что я хочу запустить регрессию на value
, используя три переменные: person1
, person2
и person3
. Обратите внимание, что это минимальный рабочий пример, но я надеюсь обобщить идею.
И поэтому моя первоначальная попытка состояла в том, чтобы:
column <- names(df)[-2]
for(i in 3:5){
temp <- df[,c("value", column[i])]
lm.test <- lm(value ~ ., data = temp)
i + 1
}
Однако, когда я запускаю summary(lm.test)
, я получаю только сводку последней регрессии, т.е. lm(value ~ person3)
что, как мне кажется, имеет смысл, но при попытке переписать его как: lm.test[i] <- lm(value ~ ., data = temp)
я получаю следующую ошибку:
debug at #3: temp <- df[,c("value", column[i])]
предполагая, что что-то не так с линией 3?
Если возможно, я хотел бы получить сводку для каждой регрессии, кроме что мне действительно нужно, так это R в квадрате для каждой из регрессий.
Вы можете создать formula
в цикле, а затем запустить lm
. Например, если я хочу запустить регрессию для mtcars
для регрессии mpg
для каждого из cyl, wt, hp
, я могу использовать следующее:
vars <- c("cyl", "wt", "hp")
lm_results <- lapply(vars, function(col){
lm_formula <- as.formula(paste0("mpg ~ ", col))
lm(lm_formula, data = mtcars)
})
Затем вы можете снова перебрать lm_results
, чтобы получить r.squared:
lapply(lm_results, function(x) summary(x)$r.squared)
вы можете использовать lm_results <- setNames(lm_results, vars)
, чтобы lm_results
был именованным списком
Вот подход с использованием broom::glance()
и purrr::map_dfr()
для сбора сводной статистики модели в аккуратную табличку:
library(broom)
library(purrr)
lm.test <- map_dfr(
set_names(names(df)[-2]),
~ glance(lm(
as.formula(paste("value ~", .x)),
data = df
)),
.id = "predictor"
)
Результат:
# A tibble: 4 x 13
predictor r.squared adj.r.squared sigma statistic p.value df logLik AIC
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 num 0.131 -0.739 27.4 0.150 0.765 1 -12.5 31.1
2 person1 0.836 0.672 11.9 5.10 0.265 1 -10.0 26.1
3 person2 0.542 0.0831 19.9 1.18 0.474 1 -11.6 29.2
4 person3 0.607 0.215 18.4 1.55 0.431 1 -11.3 28.7
# ... with 4 more variables: BIC <dbl>, deviance <dbl>, df.residual <int>,
# nobs <int>
NB, вы можете получить коэффициенты модели с помощью аналогичный подход, используя broom::tidy()
вместо glance()
.
Я видел аналогичный подход в другом вопросе, но тогда он у меня не работал. Это работает! Есть ли способ напечатать имя переменной, а не номер столбца?