将名称保存为函数 运行 众多单变量回归模型中的列表
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
上面的代码使用管道运算符 (%>%
) 将函数链接在一起。使用 glm
、tidy
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
然后 filter
和 pull
函数 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"
我正在使用包含大约 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
上面的代码使用管道运算符 (%>%
) 将函数链接在一起。使用 glm
、tidy
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
然后 filter
和 pull
函数 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"