建模
下面通过R语言生成随机数来了解下用R语言建立逻辑回归模型
set.seed(1010)
N <- 100
x1 <- rnorm(N)
x2 <- runif(N)
epsilon <- rnorm(N)
y <- 2*x1 + 3*x2 + epsilon
y.class <- ifelse(y>0,1,0)
sim.data <- data.frame(x1,x2,y.class)
接着调用glm()函数拟合模拟数据如下:
model <- glm(y.class~x1+x2,family = "binomial",data = sim.data)
#family = "binomial"选项告诉R使用逻辑回归而不是其他广义线性模型
summary(model)
预测
对数几率比的预测
glm.logodd <- predict(model,newdata = sim.data)
head(glm.logodd)
几率比的预测
head(exp(glm.logodd))
如果在模型中加入参数type = “response”的选项将会使得R输出P(Y=1|X)
glm.pro <- predict(model,newdata = sim.data,type = "response")
head(glm.pro)
如果此时规定P(Y=1|X)>0.5时候Y取1否则取0,接着输出如下:
model.predict<- ifelse(glm.pro>0.5,1,0)
head(model.predict)
可以计算逻辑回归的混淆矩阵如下:
table(sim.data$y.class,model.predict)
通过ROC曲线判别分类质量
x轴表示假阳性率,y轴表示真阳性率,为了对比我们生成一组随机数
sim.data$pro_hat <- glm.pro
sim.data$random_data <- runif(N)
library(data.table)
roc_data<- melt(sim.data[,c(3,4,5)],id.vars="y.class",variable.name = "class",value.name ="response")
library(plotROC)
ggroc <- ggplot(roc_data, aes(d=y.class, m=response, color=class)) +
geom_roc() +
scale_color_discrete(name = "class", labels = c("logit", "Random")) +
geom_abline()
ggroc
当分类曲线接近黑色的对角线说明分类不好(更接近于随机的状态,即概率0.5),当然也可以用ROC下包裹的面积AUC来衡量分类好坏。AUC为1时说明分类完全正确,当AUC值接近0.5(即黑色对角线位置),意味着此分类器没比随机分类好多少。具体R代码结果如下:
calc_auc(ggroc)