将二次项添加到逻辑回归
adding quadratic term to logistic regression
我正在尝试使用几个变量对逻辑回归建模。通过绘制该变量的响应并在其上拟合黄土曲线,我发现我的一个变量具有二次趋势。所以,我想在我的逻辑回归模型中添加一个二次项,以用二次趋势对该变量建模。我在弄清楚如何以最好/最准确的方式做到这一点时遇到了一些麻烦。
例如:
创建 df:
set.seed(1)
df <- data.frame(response = c(rep(0,times=30),rep(1,times=20)),
var1 = runif(50,min=12,max=30),
var2 = c(runif(20,min=0,max=25),runif(10,min=30,max=50),runif(20,min=15,max=40)),
var3 = var2^2) # note that this is just var2 squared
按第二个变量绘制以查看二次趋势
ggplot(df,aes(x=var2,y=response)) +
geom_point() +
geom_smooth(method="loess")+
coord_cartesian(ylim = c(0,1))
测试几个不同的模型公式
formulas <- list(response ~ var1 + var2, # both vars linear
response ~ var1 + var2 + I(var2^2), # add quad term for var2
response ~ var1 + I(var2^2), # only quad term for var2
response ~ var1 + var2 + var3, # add var3, which is var2^2
response ~ var1 + var3) # only var1 and var3
# build a df of some model selection criteria:
selection <- purrr::map_df(formulas, ~{
mod <- glm(.x, data= df, family="binomial")
data.frame(formula = format(.x),
AIC = round(AIC(mod),2),
BIC = round(BIC(mod),2),
R2adj = round(DescTools::PseudoR2(mod,which=c("McFaddenAdj")),4)
)
}) %>% arrange(desc(AIC))
查看选择标准:
> selection
formula AIC BIC R2adj
1 response ~ var1 + I(var2^2) 65.88 71.62 0.0211
2 response ~ var1 + var2 65.26 70.99 0.0304
3 response ~ var1 + var2 + var3 64.69 72.33 0.0389
4 response ~ var1 + var3 63.18 68.91 0.0613
5 response ~ var1 + var2 + I(var2^2) 45.09 52.74 0.3300
基本上我想知道 - 有人可以向我解释为什么这些都是不同的吗?我应该使用什么来使用一个具有二次模式的术语?为什么我得到如此不同的结果?
我得到的结果与你不同:
> selection
formula AIC BIC R2adj
1 response ~ var1 + var2 + I(var2^2) 40.4 48.05 0.3997
2 response ~ var1 + var2 + var3 40.4 48.05 0.3997
3 response ~ var1 + var2 70.5 76.23 -0.0475
4 response ~ var1 + I(var2^2) 72.6 78.34 -0.0788
5 response ~ var1 + var3 72.6 78.34 -0.0788
这对我来说很有意义。所以我不知道你做了什么。也许你更改了数据?
编辑:我认为您在 df 之外有一个浮动的 var3 向量,这与您认为的不一样。我的意思是,它不是 var2^2。在 base R 中创建数据框与使用第三方包(例如 dplyr)不同,它允许您从要在数据框中创建的其他变量 "promised" 创建新变量。您可能应该使用 tibble 函数:
set.seed(1)
df <- tibble(response = c(rep(0,times=30), rep(1,times=20)),
var1 = runif(50,min=12,max=30),
var2 = c(runif(20,min=0,max=25), runif(10,min=30,max=50), runif(20,min=15,max=40)),
var3 = var2^2)
我正在尝试使用几个变量对逻辑回归建模。通过绘制该变量的响应并在其上拟合黄土曲线,我发现我的一个变量具有二次趋势。所以,我想在我的逻辑回归模型中添加一个二次项,以用二次趋势对该变量建模。我在弄清楚如何以最好/最准确的方式做到这一点时遇到了一些麻烦。
例如:
创建 df:
set.seed(1)
df <- data.frame(response = c(rep(0,times=30),rep(1,times=20)),
var1 = runif(50,min=12,max=30),
var2 = c(runif(20,min=0,max=25),runif(10,min=30,max=50),runif(20,min=15,max=40)),
var3 = var2^2) # note that this is just var2 squared
按第二个变量绘制以查看二次趋势
ggplot(df,aes(x=var2,y=response)) +
geom_point() +
geom_smooth(method="loess")+
coord_cartesian(ylim = c(0,1))
测试几个不同的模型公式
formulas <- list(response ~ var1 + var2, # both vars linear
response ~ var1 + var2 + I(var2^2), # add quad term for var2
response ~ var1 + I(var2^2), # only quad term for var2
response ~ var1 + var2 + var3, # add var3, which is var2^2
response ~ var1 + var3) # only var1 and var3
# build a df of some model selection criteria:
selection <- purrr::map_df(formulas, ~{
mod <- glm(.x, data= df, family="binomial")
data.frame(formula = format(.x),
AIC = round(AIC(mod),2),
BIC = round(BIC(mod),2),
R2adj = round(DescTools::PseudoR2(mod,which=c("McFaddenAdj")),4)
)
}) %>% arrange(desc(AIC))
查看选择标准:
> selection
formula AIC BIC R2adj
1 response ~ var1 + I(var2^2) 65.88 71.62 0.0211
2 response ~ var1 + var2 65.26 70.99 0.0304
3 response ~ var1 + var2 + var3 64.69 72.33 0.0389
4 response ~ var1 + var3 63.18 68.91 0.0613
5 response ~ var1 + var2 + I(var2^2) 45.09 52.74 0.3300
基本上我想知道 - 有人可以向我解释为什么这些都是不同的吗?我应该使用什么来使用一个具有二次模式的术语?为什么我得到如此不同的结果?
我得到的结果与你不同:
> selection
formula AIC BIC R2adj
1 response ~ var1 + var2 + I(var2^2) 40.4 48.05 0.3997
2 response ~ var1 + var2 + var3 40.4 48.05 0.3997
3 response ~ var1 + var2 70.5 76.23 -0.0475
4 response ~ var1 + I(var2^2) 72.6 78.34 -0.0788
5 response ~ var1 + var3 72.6 78.34 -0.0788
这对我来说很有意义。所以我不知道你做了什么。也许你更改了数据?
编辑:我认为您在 df 之外有一个浮动的 var3 向量,这与您认为的不一样。我的意思是,它不是 var2^2。在 base R 中创建数据框与使用第三方包(例如 dplyr)不同,它允许您从要在数据框中创建的其他变量 "promised" 创建新变量。您可能应该使用 tibble 函数:
set.seed(1)
df <- tibble(response = c(rep(0,times=30), rep(1,times=20)),
var1 = runif(50,min=12,max=30),
var2 = c(runif(20,min=0,max=25), runif(10,min=30,max=50), runif(20,min=15,max=40)),
var3 = var2^2)