1. 导入、查看数据集
library(MASS)
head(birthwt)
image.png
2. 逐步回归法
从完全模型开始
full <- glm(low ~.,family = binomial,data = birthwt)
summary(full)
image.png
step <- stepAIC(full,trace = FALSE)
step
image.png
前向回归
forward <- stepAIC(full,direction = "forward",trace = FALSE)
forward
image.png
该语句中因为使用完全模型进行前向逐步回归,所以没有额外的变量可以加入,最终的模型即为完全模型。
前向选择也可以以空模型开始(incept only model)
后向回归
backward <- stepAIC(full,direction = "backward",trace = FALSE)
backward
image.png
参数的使用:k
BIC <- stepAIC(full,k = log(nrow(birthwt)),trace = F)
# Only k =2 gives the genuine AIC; k = kog(n) sometimes referred to as BIC or SBC
BIC
image.png
参数的使用:scope (用来指定被纳入模型中的变量范围)
scope <- stepAIC(full,scope = list(lower =~smoke+age,upper = full),trace = F)
# 如果scope为单一公式,则指定为上层模型,下层模型则为空
# 如果scope缺失,则原始模型为上层模型
scope
image.png
更加复杂的模型(加入交互项)
step2 <- stepAIC(full,~.^2+I(scale(age)^2)+I(scale(lwt)^2),trace = FALSE)
# “^”符号表示指定程度的交互。本例中,“2”表示所有可能变量组合中指定了二级交互。如:a,b,c -> a:b+b:c+a:c
# I()中所有元素均以其算术的方式进行解读。
# scale(age)函数将年龄以均值和标准差进行标准化处理。
# “~. ^2+I(scale(age)^2)+I(scale(lwt)^2)” 为scope参数,而单一公式代表为上层模型。
step2
image.png
3. 最佳子集法
#install.packages("bestglm")
library(bestglm)
args(bestglm)
# function (Xy, family = gaussian, IC = "BIC", t = "default", CVArgs = "default",
# qLevel = 0.99, TopModels = 5, method = "exhaustive", intercept = TRUE,
# weights = NULL, nvmax = "default", RequireFullEnumerationQ = FALSE,
# ...)
# 注意Xy的形式,因变量y一定要放在最后
image.png
整理数据框(为使用最佳子集法):
birthwt.move <- birthwt[,-1]
birthwt.move$low <- birthwt$low
#install.packages("dummies")
library(dummies)
race <- data.frame(dummy(birthwt$race)[,c(1,2)]) # 会有warning
ftv <- data.frame(dummy(birthwt$ftv)[,c(2,3)]) # 会有warning
birthwt.dummy <- birthwt[,-c(1,4,9)]
low <- birthwt$low
birthwt.dummy <- cbind(birthwt.dummy,race,ftv,low)
head(birthwt.dummy)
image.png
bestglm(birthwt.dummy,IC="BIC",family=binomial)
image.png
如果不进行哑变量处理,则会报错:
image.png
参考资料
文中代码及部分截图来自章仲恒教授的丁香园公开课:回归模型的优化:最佳子集和逐步回归












网友评论