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

如何在R中复刻Stata的残差一阶滞后散点图及拟合线?

在R中复刻残差与一阶滞后项的散点图及拟合线

问题背景

需要还原Stata中绘制$(e_{t-1},e_{t})$散点图并添加最小二乘拟合线的效果——对应William H. Greene《计量经济分析(第7版)》的「例2.3 美国汽油市场」。此前尝试R代码时type='p'参数失效,使用lag.plot(e, lag=-1)也未得到预期图像。

完整解决方案

1. 还原数据处理与回归流程

先复刻Stata中的数据导入、变量转换和回归步骤:

# 导入汽油市场数据
gasoline <- read.table("http://web.pdx.edu/~crkl/ec570/data/gasoline", header = TRUE)

# 生成对数形式的核心变量
gasoline$g <- log(gasoline$gasexp / gasoline$pop)
gasoline$y <- log(gasoline$income / gasoline$pop)
gasoline$pg <- log(gasoline$gasp)
gasoline$pnew <- log(gasoline$pnc)
gasoline$pused <- log(gasoline$puc)

# 拟合多元线性回归并提取残差
model <- lm(g ~ y + pg + pnew + pused, data = gasoline)
gasoline$e <- residuals(model)

2. 构造滞后残差并绘制目标图像

Stata中的l.e表示残差的一阶滞后项($e_{t-1}$),我们需要手动构造该变量,再绘制散点图+拟合线:

# 生成一阶滞后残差(base R写法)
gasoline$e_lag1 <- c(NA, gasoline$e[-nrow(gasoline)])
# 或用dplyr的lag函数:gasoline$e_lag1 <- dplyr::lag(gasoline$e, n = 1)

# 绘制散点图+最小二乘拟合线
plot(gasoline$e_lag1, gasoline$e, 
     xlab = expression(e[t-1]), ylab = expression(e[t]), 
     main = "残差与一阶滞后残差散点图",
     pch = 16, col = "steelblue")
# 添加拟合线
abline(lm(e ~ e_lag1, data = gasoline), col = "red", lwd = 2)

问题根源解释

  • type='p'失效:大概率是误用了时间序列专属绘图函数(如plot.ts),这类函数不支持type='p'参数,改用基础plot()函数即可;
  • lag.plot(e, lag=-1)不符合预期:该函数的lag=-1表示绘制$e_t$与超前1期残差的关系,而我们需要的是$e_t$与滞后1期残差的关系,即便改用lag=1,该函数的默认样式也无法匹配Stata中散点+拟合线的组合效果,手动构造滞后变量的方式更灵活可控。

可选:ggplot2实现优化版图像

如果需要更美观的可视化效果,用ggplot2实现:

library(ggplot2)

ggplot(gasoline, aes(x = e_lag1, y = e)) +
  geom_point(color = "steelblue", size = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 1) +
  labs(x = expression(e[t-1]), y = expression(e[t]), 
       title = "残差与一阶滞后残差散点图") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:07:49