Если вы все еще хотите использовать этот подход после просмотра ссылки, предоставленной @BenBolker (и, возможно, других ресурсов, представляющих опасность ступенчатая регрессия и статистическая значимость ) ...
Следующий код вернет вектор значений p для независимой переменной в каждой регрессии.Я использовал для иллюстрации встроенный фрейм данных mtcars
.
library(tidyverse)
library(broom)
pvals = sapply(names(mtcars)[names(mtcars) != "vs"], function(x) {
glm(paste("vs ~ ", x), data=mtcars, family=binomial) %>%
tidy %>%
filter(term==x) %>% pull(p.value)
})
pvals
mpg cyl disp hp drat wt qsec am
0.006590045 0.001917098 0.002453817 0.012340143 0.021777872 0.008672977 0.008813419 0.343628917
gear carb
0.250981095 0.004157666
Приведенный выше код использует оператор канала (%>%
) для объединения функций,После создания модели с glm
, tidy
возвращает коэффициенты и значения p в виде фрейма данных:
glm(vs ~ mpg, data=mtcars, family=binomial) %>%
tidy
term estimate std.error statistic p.value
1 (Intercept) -8.8330726 3.162274 -2.793266 0.005217877
2 mpg 0.4304135 0.158422 2.716880 0.006590045
Затем filter
и pull
функции выбирают p-значение для конкретной рассматриваемой переменной:
glm(vs ~ mpg, data=mtcars, family=binomial) %>%
tidy %>% filter(term=="mpg") %>% pull(p.value)
[1] 0.006590045
Оборачивание всего этого в sapply
возвращает именованный вектор p-значений, гдеимена являются независимыми переменными в каждой одномерной регрессии.
Чтобы вернуть только элементы ниже порогового значения p:
pvals[pvals < 0.25]
mpg cyl disp hp drat wt qsec carb
0.006590045 0.001917098 0.002453817 0.012340143 0.021777872 0.008672977 0.008813419 0.004157666
Если вы просто хотитеимена переменных, которые соответствуют критерию порога:
names(pvals[pvals < 0.25])
Чтобы непосредственно вернуть только элементы ниже порога p-значения:
pvals = sapply(names(mtcars)[names(mtcars) != "vs"], function(x) {
glm(paste("vs ~ ", x), data=mtcars, family=binomial) %>%
tidy %>%
filter(term==x) %>% pull(p.value)
}) %>% .[. < 0.25]
Наконец, упаковав это как функцию длявернуть имена нужных переменных:
select_vars = function(DV, data, threshold) {
sapply(names(data)[names(data) != DV], function(x) {
glm(paste(DV, " ~ ", x), data=data, family=binomial) %>%
tidy %>%
filter(term==x) %>% pull(p.value)
}) %>% .[. < threshold] %>% names
}
select_vars("vs", mtcars, 0.25)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "carb"
select_vars("Species", iris %>% filter(Species %in% c("versicolor","virginica")), 0.001)
[1] "Sepal.Length" "Petal.Length" "Petal.Width"