将名称保存为函数 运行 众多单变量回归模型中的列表

Save names as a list from a function running numerous univariate regression models

我正在使用包含大约 40 个变量的数据集构建逻辑回归模型。在构建这些类型的模型时,我使用的第一步是 运行 每个变量与 DV 单变量(Hosmer、Lemeshow 和 Sturdivant,2013)。我已经构建了一个为我执行此操作的函数,returns 每个函数的 p 值。

Fit Univariate logistic regression model for each covariate
uni.log2 <- function(x) {
  log.mod2 <- glm(Renewf ~ x, data = dt.train2, family = binomial())
  return(coef(summary(log.mod2))[,4]) #get p-values only
}

然后我将此函数应用于我的 dt

中的每个选定列
#apply function to selected IV's 
apply(X = dt.train2[c(3:16)], MARGIN = 2, FUN = uni.log2)

我想做的下一步是筛选这些变量以获得阈值 p < 0.25 的 p 值和 return 在 p < 时具有单变量显着性的变量名称列表0.25.

有人知道如何做到这一点吗?

我可以使用以下代码设置阈值并从多变量模型中复制姓名列表:

threshold <- 0.001
signif_form <- as.formula(paste("Renewf ~ 
",paste(names(which((summary(log.mod2)$coefficients[2: 
(nrow(summary(log.mod2)$coefficients)), 4] < threshold) == TRUE)), collapse 
= "+")))

但是,同样,我不知道如何粘贴单变量回归模型系列中的名称。如果有人知道如何做到这一点,我将不胜感激。

提前致谢!

如果您在查看了@BenBolker 提供的 link 之后仍然想使用这种方法(可能还有其他资源 stepwise regression and statistical significance 的风险)...

以下代码将 return 每个回归中自变量的 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

上面的代码使用管道运算符 (%>%) 将函数链接在一起。使用 glmtidy return 创建模型后,系数和 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

然后 filterpull 函数 select 所考虑的特定变量的 p 值:

glm(vs ~ mpg, data=mtcars, family=binomial) %>% 
  tidy %>% filter(term=="mpg") %>% pull(p.value)
[1] 0.006590045

将整个事物包装在 sapply return 一个命名的 p 值向量中,其中名称是每个单变量回归中的自变量。

至 return 仅低于 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])

直接return 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]

最后,将其打包为 return 所需变量名称的函数:

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"