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

按set分层计算倾向得分(PS):logistic模型拟合报错求助

按set分层计算倾向得分(PS)的正确方法

错误原因

你遇到的尺寸不匹配问题,本质是在group_by(set)后直接用mutate调用glm时,模型拟合或预测的数据集与当前分组的行数不匹配——要么是glm意外使用了全局数据集而非分组子集,要么是predict未指定newdata导致返回了全量预测值,和当前分组行数不符。

正确实现方案

用dplyr的nest()+purrr::map()组合,先按set嵌套数据,再为每个分组独立拟合模型并计算PS值,能彻底避免尺寸不匹配问题。步骤如下:

  1. 加载依赖包
library(dplyr)
library(tidyr)
library(purrr)
  1. 数据预处理(转换二分类因变量)
    先将group转换为二分类变量(是否属于AB组),这是logistic模型的必要前提:
# 假设你的原始数据集名为dat
dat <- dat %>%
  mutate(treat = as.integer(group == "AB")) # 1代表AB组,0代表非AB组(A/B组)
  1. 按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:55