如何测试逻辑回归模型的拟合优度?

机器算法验证 r 物流 拟合优度
2022-04-07 08:19:32

我想评估我正在研究的逻辑回归模型的拟合优度。我做了很多研究,碰巧找到似然比检验、卡方检验、Hosmer 和 Lemeshow 检验以及几个 R2 测量(如 Nagelkerke R2、Cox 和 Snell R2 和 Tjuf R2 测量)以评估整体优度适合我的模型。

我还了解到,提供 Hosmer-Lemeshow 测试的有价值结果的有效性和准确性正在争论中,因为组数(测试参数之一)的选择是任意的,不同数量的组可以导致完全不同的结果,所以我想这不是评估该模型拟合优度的可行选择(如此所述)。

我不是统计学家,而且我对这些主题还很陌生,所以所有这些研究都给我带来了很多困惑,所以如果有人能帮助我了解我应该运行什么样的拟合测试,我将不胜感激以及如何让它们在 R 中运行。

该模型目前有 11 个预测变量,因变量 ( Successful) 是合乎逻辑的。只有一个预测变量具有数值 ( AvgUpperCharsPPost),而其他预测变量是分类变量 ( Weekday, GMTHour, TitleLength, BodyLength, UserReputation) 或逻辑变量 ( CodeSnippet, URL, Tag, SentimentPositiveScore, SentimentNegativeScore)。该数据集有 93k 个观测值。

用于运行逻辑回归的公式是:

logitA1 <- glm(formula = Successful ~ CodeSnippet + I(Weekday=='Weekend') + 
               I(GMTHour=='Afternoon') + I(GMTHour=='Evening') + 
               I(GMTHour=='Night') + I(BodyLength=='Medium') + 
               I(BodyLength =='Long') + I(TitleLength=='Medium') + 
               I(TitleLength=='Long')+ SentimentPositiveScore + 
               SentimentNegativeScore + NTag + AvgUpperCharsPPost + URL + 
               IsTheSameTopicBTitle + I(UserReputation=='Low') + 
               I(UserReputation=='Established') + I(UserReputation=='Trusted'), 
               data=dsA1, family=binomial())

我还了解到,运行卡方检验意味着将模型中的拟合值与观察到的计数(数据集中的成功列?)进行比较,并且可以通过使用chisq.testR 中的函数来计算,并且似然比检验是使用lrtest最新包中的功能或替代logLik功能完成。这些信息是否正确?我应该如何解释这些函数的输出?

另外,我尝试使用以下代码获得 ROC 曲线:

dsA1 <-read.csv2("A1 secondStudyNoComments.csv")
                 prob=predict(logitA1.1, type=c("response"))
dsA1$prob=prob
g <- roc(Successful~prob, data=dsA1)
plot(g)

结果如下:

Call:
roc.formula(formula = Successful ~ prob, data = dsA1)

Data: prob in 60865 controls (Successful FALSE) < 32149 cases (Successful TRUE).
Area under the curve: 0.6499

ROC曲线

我应该如何解释这些结果?

1个回答

您走在正确的轨道上,ROC是逻辑回归模型的常见错误度量。更常见的是,使用接收器工作曲线( AUROC) 下的面积。优点是该度量是数字的,可以与逻辑回归的其他验证运行/模型设置进行比较。

例如,您可以使用交叉验证来评估模型的性能。由于这种拟合优度在很大程度上取决于您的训练和测试集,因此通常会在不同的训练和测试集上使用多次重复。最后,您对模型拟合度有一个稍微稳定的估计,取所有重复的平均值。

在 R 中有几个提供交叉验证方法的包。假设您有一个合适的模型,您可以例如使用sperrorest具有以下设置的包:

nspres <- sperrorest(data = data, formula = formula, # your data and formula here
                     model.fun = glm, model.args = list(family = "binomial"), 
                     pred.fun = predict, pred.args = list(type = "response"), 
                     smp.fun = partition.cv, 
                     smp.args = list(repetition = 1:50, nfold = 10))

summary(nspres$pooled.err$train.auroc)   
summary(nspres$pooled.err$test.auroc)                  

这将使用 10 次折叠、50 次重复执行交叉验证,并为您提供总体平均重复误差的摘要。