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

ggplot geom_smooth绘制虚拟变量线性回归无回归线问题排查

问题分析

你的核心需求是可视化以setosa为参考组的虚拟变量线性模型——展示versicolor与setosa、virginica与setosa的对比回归线,但原代码存在两个关键问题:

  • 当x=Species(分类变量)且group=Species时,每个物种对应单一离散x值,geom_smooth(method=lm)无法基于单个点拟合直线,因此无回归线输出。
  • 当group=1时,是对所有物种的点拟合整体回归线,并非你需要的两组对比线。
解决方案

要实现目标,需基于线性模型的预测值绘制对比线,以下是两种可行方法:

方法一:生成预测数据集绘图

通过生成包含参考组与目标组的预测数据,直接连接两组均值得到回归线:

library(tidyverse)

# 加载数据并拟合模型
dataset <- as_tibble(iris)
ols_lm_iris_all <- lm(Petal.Length ~ Species, data = dataset)

# 生成对比用的预测数据集
pred_data <- tribble(
  ~comparison, ~group, ~Species,
  "versicolor vs setosa", "ref", "setosa",
  "versicolor vs setosa", "target", "versicolor",
  "virginica vs setosa", "ref", "setosa",
  "virginica vs setosa", "target", "virginica"
) %>%
  mutate(Petal.Length = predict(ols_lm_iris_all, newdata = .))

# 绘制图形
ggplot() +
  # 原始数据抖动散点
  geom_jitter(data = dataset, aes(x = Species, y = Petal.Length, colour = Species), width = 0.2) +
  # 对比回归线
  geom_line(data = pred_data, aes(x = group, y = Petal.Length, colour = comparison, group = comparison), linewidth = 1) +
  # 调整x轴标签
  scale_x_discrete(labels = c("setosa", "对应物种")) +
  labs(
    title = "OLS线性回归:物种与setosa的对比",
    x = "",
    colour = "对比组"
  )

方法二:重构数据为成对对比格式

将数据转换为每个非setosa物种与setosa的配对形式,直接拟合对比模型:

library(tidyverse)

dataset <- as_tibble(iris)

# 重构数据:为每个非setosa物种加入setosa的基准数据
pair_data <- dataset %>%
  mutate(
    comparison = case_when(
      Species == "versicolor" ~ "versicolor vs setosa",
      Species == "virginica" ~ "virginica vs setosa",
      TRUE ~ NA_character_
    ),
    # 用0代表setosa,1代表目标物种
    x = ifelse(Species == "setosa", 0, 1)
  ) %>%
  filter(!is.na(comparison)) %>%
  # 给每个对比组追加setosa的数据
  group_by(comparison) %>%
  bind_rows(., dataset %>% filter(Species == "setosa") %>% mutate(comparison = cur_group()$comparison))

# 绘图
ggplot(pair_data, aes(x = x, y = Petal.Length, colour = comparison)) +
  geom_jitter(width = 0.1, alpha = 0.7) +
  geom_smooth(method = lm, se = FALSE, linewidth = 1) +
  scale_x_continuous(breaks = c(0,1), labels = c("setosa", "目标物种")) +
  labs(
    title = "OLS线性回归:物种与setosa的对比",
    x = "",
    colour = "对比组"
  )
原理说明

你拟合的lm(Petal.Length ~ Species)本质是虚拟变量模型:

  • 截距对应setosa的Petal.Length均值
  • Speciesversicolor和Speciesvirginica的系数,分别是对应物种与setosa的均值差

上述两种方法都是基于这个模型的结果,将setosa的均值与另外两个物种的均值连接成直线,直观展示两组间的对比关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:14:51