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

