R中加权逻辑回归实现疑问:基于成功比例、样本量与自变量
处理分组比例数据的逻辑回归(R语言)
嘿,我注意到你现在用复制数据集的方式来做逻辑回归,虽然能得到结果,但这种方法确实不够规范,还会平白把数据集变大——咱们换更高效更合理的方式来处理这类分组比例数据:
首先先明确你的数据结构:每一行代表一组观测,包含自变量x、该组的总样本量cases,以及成功比例prop。我们可以基于这些信息直接构建正确的逻辑回归模型,不需要复制数据集。
方法一:直接传入成功/失败计数(最直观)
先计算每组的成功数和失败数(如果你的prop是精确值,也可以手动输入准确的成功数,避免round的微小误差):
datf <- data.frame(prop = c(0.125, 0, 0.667, 1, 0.9), cases = c(8, 1, 3, 3, 10), x = c(11, 12, 15, 16, 18)) # 计算成功数和失败数 datf$success <- round(datf$prop * datf$cases) datf$failure <- datf$cases - datf$success
然后用glm的二项式模型,把成功数和失败数组合成响应变量:
model <- glm(cbind(success, failure) ~ x, data = datf, family = binomial) summary(model)
方法二:使用权重参数(更简洁)
如果你不想单独计算成功/失败数,可以直接用成功比例作为响应变量,把总样本量cases设为权重:
model <- glm(prop ~ x, data = datf, family = binomial, weights = cases) summary(model)
这个方法和方法一的结果完全一致,代码更短,适合快速建模。
为什么你原来的方法不妥当?
你之前把数据集复制两次,标记success为1和0,这种方式并没有正确反映每组的成功/失败样本量——相当于把每组的成功和失败都只当成1个样本,这和实际的分组数据不符。如果非要展开成个体级别的数据(不推荐大样本场景),可以这样做:
# 仅小样本演示,大样本不建议用 individual_data <- data.frame( x = rep(datf$x, datf$cases), success = unlist(mapply(rep, c(1, 0), times = c(datf$success, datf$failure))) ) model <- glm(success ~ x, data = individual_data, family = binomial) summary(model)
这个结果和前两种方法一致,但当样本量很大时,会生成非常庞大的数据集,占用大量内存,所以还是前两种方法更实用。
总结一下,优先选择方法一或方法二,它们既符合逻辑回归的建模规范,又能高效处理分组比例数据~
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

