如何在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
相关产品推荐
相关产品推荐

