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

如何在ggplot散点图中正确呈现多变量lm()模型的拟合线?

解决方案

核心问题排查

你得到非线性线条的大概率原因是日期变量未被处理为连续数值型/时间型变量,如果日期是字符或因子类型,lm()会将其当作分类变量拟合,导致预测结果呈现阶梯状非线性趋势。此外,使用predict()时需确保预测数据集的日期序列是有序的,且其他自变量取值符合需求(要么用原数据的实际值,要么固定为均值等参考值)。


步骤1:处理日期变量

将季度日期转换为连续的数值型或时间型变量,确保回归时识别为线性趋势项:

# 加载必要包
library(ggplot2)
library(zoo) # 用于处理季度日期

# 假设你的数据框为df,date列是类似"2006-Q1"的字符格式
df$date_qtr <- as.yearqtr(df$date) # 转换为季度时间对象
df$date_num <- as.numeric(df$date_qtr) # 转换为连续数值(如2006-Q1=2006.0,2006-Q2=2006.25)

步骤2:构建多元线性回归模型

包含所有7个自变量(日期+其他6个变量):

# 替换x1-x6为你实际的自变量名称
model <- lm(GDP ~ date_num + x1 + x2 + x3 + x4 + x5 + x6, data = df)

步骤3:生成拟合值并绘图

有两种常用方式,根据需求选择:

方式1:使用原数据的拟合值(对应每个观测的模型预测结果)

直接提取模型的拟合值,按日期顺序绘制直线:

# 添加拟合值到数据框
df$fitted_gdp <- fitted(model)

# 绘制散点图+拟合线
ggplot(df, aes(x = date_qtr)) +
  geom_point(aes(y = GDP), color = "#1f77b4", size = 2) + # 原始GDP散点
  geom_line(aes(y = fitted_gdp), color = "#ff7f0e", linewidth = 1) + # 拟合直线
  labs(x = "季度日期", y = "GDP", title = "GDP与季度日期散点图及多元回归拟合线") +
  theme_minimal()

方式2:固定其他自变量取值,绘制日期的边际效应拟合线

如果需要展示控制其他自变量为固定值(如均值)时,日期对GDP的线性影响,可生成新的预测数据集:

# 生成覆盖所有季度的预测数据,其他自变量取均值
pred_df <- data.frame(
  date_qtr = seq(min(df$date_qtr), max(df$date_qtr), by = "quarter"),
  date_num = as.numeric(seq(min(df$date_qtr), max(df$date_qtr), by = "quarter")),
  x1 = mean(df$x1, na.rm = TRUE),
  x2 = mean(df$x2, na.rm = TRUE),
  x3 = mean(df$x3, na.rm = TRUE),
  x4 = mean(df$x4, na.rm = TRUE),
  x5 = mean(df$x5, na.rm = TRUE),
  x6 = mean(df$x6, na.rm = TRUE)
)

# 预测GDP值
pred_df$pred_gdp <- predict(model, newdata = pred_df)

# 绘图
ggplot(df, aes(x = date_qtr)) +
  geom_point(aes(y = GDP), color = "#1f77b4", size = 2) +
  geom_line(data = pred_df, aes(y = pred_gdp), color = "#ff7f0e", linewidth = 1) +
  labs(x = "季度日期", y = "GDP", title = "GDP与季度日期散点图(控制其他变量均值)") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:02:00