You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何将聚合的成功/失败计数拆分为0/1单行数据用于逻辑回归

方案1:解聚生成伯努利格式数据集

你可以直接用tidyr包的uncount函数快速完成解聚操作,代码非常简洁:

library(tidyr)
library(dplyr)

# 生成COVID=1的阳性记录子集
pos_df <- d %>% 
  select(state, jabsx100k, TOTpos) %>% 
  uncount(TOTpos) %>% 
  mutate(COVID = 1)

# 生成COVID=0的阴性记录子集
neg_df <- d %>% 
  select(state, jabsx100k, TOTneg) %>% 
  uncount(TOTneg) %>% 
  mutate(COVID = 0)

# 合并得到最终长表
long_df <- bind_rows(pos_df, neg_df)

生成的long_df完全符合你要的格式,直接拟合逻辑回归即可:

fit <- glm(COVID ~ scale(jabsx100k), family = binomial, data = long_df)

后续调用pROC包做分析的代码:

library(pROC)
# 计算预测概率
pred_prob <- predict(fit, type = "response")
# 生成ROC对象、计算AUC
roc_res <- roc(long_df$COVID, pred_prob)
auc(roc_res)
# 绘制ROC曲线
plot(roc_res, print.auc = TRUE)

如果你不想加载tidyverse系列包,也可以用基础R实现相同效果:

long_df <- do.call(rbind, lapply(1:nrow(d), function(i) {
  row <- d[i, ]
  rbind(
    data.frame(state = row$state, COVID = 1, jabsx100k = row$jabsx100k)[rep(1, row$TOTpos), ],
    data.frame(state = row$state, COVID = 0, jabsx100k = row$jabsx100k)[rep(1, row$TOTneg), ]
  )
}))

方案2:无需解聚,直接基于聚合数据计算AUC

如果你的数据量很大,解聚后内存占用过高,也可以不用生成长表,直接基于聚合模型的结果计算AUC,最终结果和解聚后完全一致:

# 基于你原来的cbind格式拟合的模型,生成每行的预测概率
pred_agg <- predict(fit2, type = "response")
# 传入权重计算ROC
roc_agg <- roc(rep(c(1,0), each = nrow(d)), rep(pred_agg, 2), 
               weights = c(d$TOTpos, d$TOTneg))
# 查看AUC
auc(roc_agg)

内容的提问来源于stack exchange,提问作者Antoni Parellada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:09:00