首页 > 解决方案 > 使用 for 循环计算多个简单逻辑回归模型的 AUC

问题描述

首先让我说这是我第一次发布关于堆栈溢出的问题,所以我希望我能很好地解释这一点。

我正在尝试计算多个逻辑回归简单模型的 c-stat(曲线下面积)。

我有一个简单模型的代码。我有一个二元响应变量(这是一个级别为 0 和 1 的因子)和 100 个预测变量,它们都是数字的。这里我只使用一个数字预测变量。此代码有效。

simple_model <- glm(target_variable ~ pred1, family = binomial, data = training_data)
pROC::auc(roc(training_data$target_variable, predict(simple_model, type = "response")))

现在我要做的是创建一个单独的数据框,其中一列中包含预测变量的名称,第二列中包含其 c stat。

这是我到目前为止没有成功的尝试:

        auc <- sapply(training_data, 2, function (x) {
               temp_data <- cbind(training_data$target_variable, x)
               multiple_simple_models <- glm(target_variable ~ ., family = binomial, data = temp_data)
               proc::auc(roc(temp_data$target_variable, predict(multiple_simple_models, type = "response")))
})

但我收到一条错误消息:

Error in match.fun(FUN): '2' is not a function, character or symbol

标签: rfor-loopstatisticsapplyproc-r-package

解决方案


您的解决方案并不遥远!

正如您在上面的评论中提出的,唯一突出的问题是,由于“矩阵/数据框”预期问题,您无法处理代码 - 这是因为glm()需要一个数据框,或者至少可以强制转换为数据框保留列名。结果,您不能使用,cbind()因为它会创建一个未命名的矩阵。

所以 - 假设你可以访问一个target_variable向量和一个包含在其中的数据框predictors- 我对你的代码的轻微修改看起来像这样:

results <- sapply(predictors, function (p) {
     temp_data <- data.frame(p, target_variable)
     temp_model <- glm(target_variable ~ ., family = binomial, data = temp_data)
     pROC::auc(roc(target_variable, predict(temp_model, type = "response")))})

results_data <- data.frame(predictor = names(results), auc = results)

请注意,您需要额外的行,results_data因为sapply()它自己会返回一个命名向量(它会尽可能自动简化其输出)


推荐阅读