Logistic回归是一种用于探索分类响应变量与一个或多个分类或连续预测变量之间的关系的方法。 该模型通常以以下格式表示,其中β表示参数,x表示自变量。
log(odds)=β0+β1∗x1+...+βn∗xn
Table of Contents
Logistic Regression Example
Model Evaluation and Diagnostics
Goodness of Fit
Statistical Tests for Individual Predictors
Validation of Predicted Values
将参考数据集分为训练集和测试集
library(caret)
data(GermanCredit)
Train <- createDataPartition(GermanCredit$Class, p=0.6, list=FALSE)
training <- GermanCredit[ Train, ]
testing <- GermanCredit[ -Train, ]
使用训练集构建模型
mod_fit <- train(Class ~ Age + ForeignWorker + Property.RealEstate + Housing.Own +
CreditHistory.Critical, data=training, method="glm", family="binomial")
exp(coef(mod_fit$finalModel))
## (Intercept) Age ForeignWorker
## 1.1606762 1.0140593 0.5714748
## Property.RealEstate Housing.Own CreditHistory.Critical
## 1.8214566 1.6586940 2.5943711
这告诉我们,年龄每增加1单位,获得良好信用的几率就会增加1.01倍。 在许多情况下,我们经常希望使用模型参数来预测一组全新的观察结果中目标变量的值。 这可以通过预测函数来完成。 请记住,如果模型是使用glm函数创建的,则需要在预测命令中添加type =“ response”。
predict(mod_fit, newdata=testing)
predict(mod_fit, newdata=testing, type="prob")
建立了逻辑回归模型并得到了系数。 但是,仍然存在一些关键问题。 这个模型好吗? 模型对数据的拟合程度如何? 哪些预测指标最重要? 预测准确吗? 本文档的其余部分将涵盖回答这些问题的技术,并提供R代码进行分析。
在以下各节中,我们将主要使用用glm()函数创建的逻辑回归。 虽然我更喜欢使用Caret包,但R中的许多功能对于glm对象都可以更好地工作。
mod_fit_one <- glm(Class ~ Age + ForeignWorker + Property.RealEstate + Housing.Own +
CreditHistory.Critical, data=training, family="binomial")
mod_fit_two <- glm(Class ~ Age + ForeignWorker, data=training, family="binomial")
1.似然比检验(Likelihood Ratio Test)
如果预测变量较少的模型改善,则证明逻辑回归可以更好地拟合数据。这使用似然比检验执行,该检验将完整模型下的数据的可能性与预测变量较少的模型下的数据的可能性进行比较。从模型中删除预测变量几乎总是会使模型拟合得不太好(即模型的对数似然性较低),但是有必要测试模型拟合中观察到的差异是否具有统计学意义。假设H0认为简化模型是正确的,则整体模型拟合统计量的p值小于0.05将使我们拒绝原假设。它将提供反对简化模型支持当前模型的证据。可以在R中使用lmtest包中的lrtest()函数或在base.anova(mod_fit_one,mod_fit_two,test =“ Chisq”)中使用anova()函数在R中执行似然比测试
library(lmtest)
lrtest(mod_fit_one, mod_fit_two)
2.Pseudo R^2
与具有最小二乘估计的线性回归不同,没有R2统计量可以解释预测变量所解释的因变量中方差的比例。 但是,有许多伪R2指标可能很有价值。 最值得注意的是McFadden的R2,其定义为1- [ln(LM)/ ln(L0)],其中ln(LM)是拟合模型的对数似然值,ln(L0)是空模型的对数似然 仅将拦截器用作预测变量。 度量范围是从0到小于1,其值接近零,表明该模型没有预测能力。
library(pscl)
pR2(mod_fit_one) # look for 'McFadden'
## llh llhNull G2 McFadden r2ML
## -344.42107079 -366.51858123 44.19502089 0.06029029 0.07101099
## r2CU
## 0.10068486
3.Hosmer-Lemeshow Test
确定拟合优度的另一种方法是通过Homer-Lemeshow统计数据,该统计数据是在观察值已基于具有相似预测概率进行分组后,根据数据进行计算的。 它使用皮尔逊卡方检验检查观测结局比例是否与数据集子集中的预计发生概率相似。 p值较大的小值表示对数据的良好拟合,而p值小于0.05的较大值表示拟合较差。 零假设认为模型适合数据,在下面的示例中我们将拒绝H0。
library(MKmisc)
HLgof.test(fit = fitted(mod_fit_one), obs = training$Class)
library(ResourceSelection)
hoslem.test(training$Class, fitted(mod_fit_one), g=10)
1. Wald检验(Wald Test)
Wald检验用于评估模型中每个系数的统计显著性,并通过计算回归系数的平方与系数标准误差的平方之比来计算。 这个想法是要检验以下假设:模型中自变量的系数与零显著不同。 如果检验未能拒绝零假设,则表明从模型中删除变量不会严重损害该模型的拟合度。
library(survey)
regTermTest(mod_fit_one, "ForeignWorker")
## Wald test for ForeignWorker
## in glm(formula = Class ~ Age + ForeignWorker + Property.RealEstate +
## Housing.Own + CreditHistory.Critical, family = "binomial",
## data = training)
## F = 0.949388 on 1 and 594 df: p= 0.33027
regTermTest(mod_fit_one, "CreditHistory.Critical")
## Wald test for CreditHistory.Critical
## in glm(formula = Class ~ Age + ForeignWorker + Property.RealEstate +
## Housing.Own + CreditHistory.Critical, family = "binomial",
## data = training)
## F = 16.67828 on 1 and 594 df: p= 5.0357e-05
2.变量重要性 (Variable Importance )
To assess the relative importance of individual predictors in the model, we can also look at the absolute value of the t-statistic for each model parameter. This technique is utilized by the varImp function in the caret package for general and generalized linear models.
varImp(mod_fit)
## glm variable importance
##
## Overall
## CreditHistory.Critical 100.00
## Property.RealEstate 57.53
## Housing.Own 50.73
## Age 22.04
## ForeignWorker 0.00
1. 区分度(Classification Rate)
在开发用于预测的模型时,最关键的指标应考虑模型在样本观察之外预测目标变量方面的性能。 该过程涉及使用模型估计来预测测试集上的值。 之后,我们将比较每个目标的预测目标变量与观测值。 在下面的示例中,您会注意到我们的模型准确地预测了测试集中的观察值67。
pred = predict(mod_fit, newdata=testing)
accuracy <- table(pred, testing[,"Class"])
sum(diag(accuracy))/sum(accuracy)
## [1] 0.705
pred = predict(mod_fit, newdata=testing)
confusionMatrix(data=pred, testing$Class)
2.ROC曲线 (ROC Curve )
受试者特征曲线是分类器性能的度量。 使用正确地被认为是正数的正数据点的比例和被错误地认为是正数的负数据点的比例,我们生成了一个图形,该图形显示了可以正确预测某些事物的速率与 错误地预测某事。 归根结底,我们担心的是ROC曲线下的面积,即AUC。 该指标的范围从0.50到1.00,并且值大于0.80表示该模型在区分构成我们目标变量的两个类别方面做得很好。 请记住,ROC曲线可以同时检查目标x预测变量对和目标x模型的性能。 两者的示例如下。
library(pROC)
# Compute AUC for predicting Class with the variable CreditHistory.Critical
f1 = roc(Class ~ CreditHistory.Critical, data=training)
plot(f1, col="red")
##
## Call:
## roc.formula(formula = Class ~ CreditHistory.Critical, data = training)
##
## Data: CreditHistory.Critical in 180 controls (Class Bad) < 420 cases (Class Good).
## Area under the curve: 0.5944
library(ROCR)
# Compute AUC for predicting Class with the model
prob <- predict(mod_fit_one, newdata=testing, type="response")
pred <- prediction(prob, testing$Class)
perf <- performance(pred, measure = "tpr", x.measure = "fpr")
plot(perf)
auc <- performance(pred, measure = "auc")
auc <- [email protected][[1]]
auc
## [1] 0.6540625
3.K折交叉验证(K-Fold Cross Validation)
在评估模型时,我们经常要评估其在预测数据的不同子集上的目标变量方面的表现。 一种这样的技术是k折交叉验证,它将数据划分为k个相等大小的段(称为“折”)。 保留一个折叠以进行验证,而其他k-1个折叠用于训练模型,然后用于预测测试数据中的目标变量。 该过程重复了k次,每个模型的性能预测都使用性能指标(如准确性)进行跟踪。 交叉验证的最常见变体是10倍交叉验证。
ctrl <- trainControl(method = "repeatedcv", number = 10, savePredictions = TRUE)
mod_fit <- train(Class ~ Age + ForeignWorker + Property.RealEstate + Housing.Own +
CreditHistory.Critical, data=GermanCredit, method="glm", family="binomial",
trControl = ctrl, tuneLength = 5)
pred = predict(mod_fit, newdata=testing)
confusionMatrix(data=pred, testing$Class)