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

如何在R中绘制逻辑回归多变量预测结果并按规则分组展示

逻辑回归模型输出组合图绘制问题及解决方案

问题描述

我想要基于逻辑回归模型的输出结果绘制组合图,目前操作如下:
我已在如下结构的数据集上拟合了逻辑回归模型:

gender english art science sports geography   insured 
1  Female       0   1       0      0         0         1
2  Female       1   1       0      1         1         1
3  Female       1   0       0      1         1         1
4  Female       1   0       0      0         1         1
5  Female       1   1       1      0         1         1
6  Female       1   1       1      0         0         0
7    Male       1   1       1      1         0         1
8    Male       1   1       1      1         0         0
9  Female       1   1       0      0         0         1
10   Male       1   1       0      0         1         0
11 Female       1   1       0      0         1         1

我使用effects包绘制模型输出图,所用代码如下:

df_fit<- glm( insured ~ english +art+science + gender, data = df, family = 'binomial')

plot(Effect(focal.predictors = c("art",'gender'), df_fit), rug = FALSE)

我希望调整代码实现如下效果:english到science变量取值为'1'的所有glm预测结果放在左侧,取值为'0'的对应预测结果放在右侧,同时按gender分组展示。我曾尝试用dplyr包的gather函数将english到science的变量整合转换为长数据集,但会导致回归模型报错、数据结构被破坏,请问是否有其他实现该绘图的方法?

解决方案

你不需要改动原始建模数据集,单独构造预测用的网格数据即可实现需求,不会破坏原有建模流程,操作步骤如下:

  • 第一步:保留你已经拟合好的df_fit模型,先构造覆盖所有展示维度的预测网格
    你需要展示的维度共三类:科目(english/art/science)、科目取值(0/1)、性别,直接用expand.grid生成全量组合即可:
    library(tidyverse)
    # 构造预测网格
    pred_grid <- expand.grid(
      subject = c("english", "art", "science"),
      value = c(0, 1),
      gender = unique(df$gender)
    )
    # 把科目和取值映射为模型可识别的变量列
    pred_grid <- pred_grid %>%
      mutate(
        english = ifelse(subject == "english", value, 0),
        art = ifelse(subject == "art", value, 0),
        science = ifelse(subject == "science", value, 0)
      )
    
  • 第二步:基于已有模型生成预测值和95%置信区间
    # 生成对数几率尺度的预测值和标准误,再转换为概率尺度
    pred_result <- predict(df_fit, newdata = pred_grid, type = "link", se.fit = TRUE) %>%
      as.data.frame() %>%
      bind_cols(pred_grid) %>%
      mutate(
        predicted_prob = plogis(fit),
        lower_ci = plogis(fit - 1.96 * se.fit),
        upper_ci = plogis(fit + 1.96 * se.fit)
      )
    
  • 第三步:用ggplot2绘制目标组合图
    ggplot(pred_result, aes(x = factor(value, levels = c(1,0)), y = predicted_prob, color = gender, group = gender)) +
      geom_point(position = position_dodge(width = 0.2), size = 2) +
      geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci), width = 0.1, position = position_dodge(width = 0.2)) +
      geom_line(position = position_dodge(width = 0.2)) +
      facet_wrap(~subject) +
      labs(x = "变量取值", y = "投保预测概率", color = "性别") +
      theme_bw()
    
    代码中已经通过factor(value, levels = c(1,0))把取值1放在x轴左侧、0放在右侧,同时按性别分组、按科目分面展示,完全匹配需求效果。

内容的提问来源于stack exchange,提问作者Vale Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:08