按set分层计算倾向得分(PS):logistic模型拟合报错求助
按set分层计算倾向得分(PS)的正确方法
错误原因
你遇到的尺寸不匹配问题,本质是在group_by(set)后直接用mutate调用glm时,模型拟合或预测的数据集与当前分组的行数不匹配——要么是glm意外使用了全局数据集而非分组子集,要么是predict未指定newdata导致返回了全量预测值,和当前分组行数不符。
正确实现方案
用dplyr的nest()+purrr::map()组合,先按set嵌套数据,再为每个分组独立拟合模型并计算PS值,能彻底避免尺寸不匹配问题。步骤如下:
- 加载依赖包
library(dplyr) library(tidyr) library(purrr)
- 数据预处理(转换二分类因变量)
先将group转换为二分类变量(是否属于AB组),这是logistic模型的必要前提:
# 假设你的原始数据集名为dat dat <- dat %>% mutate(treat = as.integer(group == "AB")) # 1代表AB组,0代表非AB组(A/B组)
- 按set分层拟合模型并计算PS
dat_with_ps <- dat %>% group_by(set) %>% # 过滤掉仅包含单一分组的set(避免glm无法拟合二项模型) filter(n_distinct(treat) == 2) %>% # 按set嵌套数据,每个set对应一个独立数据框 nest() %>% mutate( # 为每个set分组拟合logistic倾向得分模型 ps_model = map(data, ~ glm( formula = treat ~ age + educ + race + married + nodegree + re74 + re75 + re78, data = ., family = binomial(link = "logit") )), # 对当前分组的数据集预测PS值(type="response"返回概率值) pscore = map2(ps_model, data, ~ predict(.x, newdata = .y, type = "response")) ) %>% # 展开嵌套数据,将PS值合并回原数据集 unnest(c(data, pscore)) %>% # 取消分组状态 ungroup()
关键细节说明
nest():将每个set对应的子集数据打包成独立数据框,确保后续模型仅基于当前分组数据拟合。map()/map2():遍历每个分组的嵌套数据,分别拟合模型并完成预测,保证每个分组的模型和预测结果独立对应。filter(n_distinct(treat) == 2):提前过滤掉只有AB组或只有非AB组的set,避免因二分类因变量无变异导致glm报错。
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

