面板和时间序列

先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。

arima

ARIMA 模型

Stata

arima y, ar(1/2)

R 包:stats

arima(data$y, order = c(2, 0, 0))

与 Stata 有差异 R 和 Stata ARIMA 初始化及截距参数化不同;比较系数前须匹配似然方法并转换截距。

carryforward

用上一个非缺失值向下填充

Stata

carryforward x, replace

R 包:tidyr

tidyr::fill(data, x, .direction = "down")

与 Stata 有差异 先 group_by(data, id) 即可在每个面板个体内填充。 fill() 未先分组时会跨面板单位填补;单位内 carryforward 须先 group_by(id)。

d.

面板内的一阶差分

Stata

generate d_x = D.x

R 包:tidystata

mutate(data, d_x = stata_diff(x, time = year), .by = id)

stata_diff(x, 2, time = year) 即 D2.x(差分的差分)。

f.

面板内的前定变量

Stata

generate lead_x = F.x

R 包:tidystata

mutate(data, lead_x = stata_lead(x, time = year), .by = id)

与 Stata 相同,year 中断处为缺失值。

l.

面板内的滞后变量

Stata

generate lag_x = L.x

R 包:tidystata

mutate(data, lag_x = stata_lag(x, time = year), .by = id)

与 Stata 相同,year 中断处为缺失值;dplyr::lag() 则只是按行移动。L2.x 用 stata_lag(x, 2, time = year),月度日期加 unit = “month”。

另有 1 个示例及替代实现

面板内的二期滞后

Stata

generate lag2_x = L2.x

R 包:dplyr

mutate(data, lag2_x = lag(x, 2, order_by = year), .by = id)

与 Stata 有差异 lag(x, 2, order_by = year) 移动两个观测行;L2.x 移动两个时间单位,遇时间缺口返回缺失。该规则应使用 stata_lag(x, 2, time = year)。

tsfill

补齐缺失的时间点

Stata

tsfill

R 包:tsibble

tsibble::fill_gaps(ts_data)

与 Stata 有差异 fill_gaps() 默认补齐各键观测范围;共同面板边界须明确设 .full,并保证 tsibble 间隔匹配 Stata delta。

tsline

时间序列折线图

Stata

tsline y

R 包:ggplot2

ggplot(data, aes(year, y)) + geom_line()

tsset

声明时间序列数据

Stata

tsset year

R 包:tsibble

tsibble::as_tsibble(data, index = year)

xtdescribe

每个面板个体的期数分布

Stata

xtdescribe

R 包:dplyr

count(count(data, id, name = "periods"), periods)

xtline

每个面板个体一张折线图

Stata

xtline y

R 包:ggplot2

ggplot(data, aes(year, y)) + geom_line() + facet_wrap(~id)

不分面而使用 aes(group = id) 会把所有个体画在一张图上,相当于 overlay 选项。

xtset

声明面板数据

Stata

xtset id year

R 包:tsibble

tsibble::as_tsibble(data, key = id, index = year)

tidystata 无需声明:stata_lag(x, time = year) 配合 .by = id;fixest 用 panel.id = ~id + year。

xtsum

总体和组内标准差

Stata

xtsum x

R 包:dplyr

data |> mutate(m = mean(x, na.rm = TRUE), .by = id) |> summarise(overall = sd(x, na.rm = TRUE), within = sd(x - m, na.rm = TRUE))

组间部分是各 id 均值的标准差:先 summarise(data, m = mean(x, na.rm = TRUE), .by = id),再求 sd(m)。