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
相关产品推荐
相关产品推荐

