【问题标题】:Calculating AUC for multiple simple logistic regression models using a for loop使用 for 循环计算多个简单逻辑回归模型的 AUC
【发布时间】:2021-06-18 11:59:29
【问题描述】:

首先让我说这是我第一次发布有关堆栈溢出的问题,所以我希望我能解释清楚。

我正在尝试计算多个逻辑回归简单模型的 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

【问题讨论】:

  • 嗨,您的意思是使用apply(而不是sapply)吗?
  • 我将 'sapply' 替换为 'apply' 但现在我收到另一个错误,显示为 'error in model.frame.default(formula = target_variable ~ . , data = temp_data, : 'data' must be一个data.frame,而不是一个矩阵或数组'
  • 当您使用sapply() 时,第二个参数应该始终是函数。我想,正如上面的海报所示,您可能希望改用apply()。注意:我刚刚在上面看到了您的回复。会看看
  • 然后我看到两个选项: - apply 不接受 data.frame ,但它接受矩阵。 (正如错误消息告诉我们的那样)。所以apply(as.matrix(training_data), 2, function (x) { 工作的机会很大。 - 另一种选择是使用 sapply 并将您的 data.frame 转换为带有 sapply(split(training_data,cols(training_data), function(x) {... 的向量列表
  • 我自己好像搞糊涂了。 multiple_simple_models 是否应该有 data = 或 temp_data 的训练数据

标签: r for-loop statistics apply proc-r-package


【解决方案1】:

您的解决方案并不遥远!

正如您在上面的 cmets 中提出的,唯一未解决的问题是,由于“矩阵/数据框”预期问题,您无法处理代码 - 这是因为 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() 本身会返回一个命名向量(它会尽可能自动简化其输出)

【讨论】:

  • 谢谢!我很好奇如何创建一个 target_variable 向量和一个带有预测变量的数据框?
  • 假设您的目标变量名为 y 并且它属于数据框 df 然后 target_variable &lt;- df$y 提取列 y 作为向量,然后将名称 target_variable 分配给该向量. “预测变量”数据框只是预测变量的数据框,减去目标变量。因此,如果您的数据框有两个预测变量 p1p2 和目标变量 y,那么“预测变量”数据框将是一个只有 p1p2 的数据框。
  • 重要的是不要与所有这些混淆:您只需要 (i) 一个包含您要测试的所有预测变量的数据框 (predictors),以及 (ii) 一个包含目标变量结果 (target_variable)。那么上面的代码应该可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2018-04-10
  • 2019-05-11
  • 2014-10-30
  • 1970-01-01
  • 2019-07-12
相关资源
最近更新 更多