计量小课:计量经济学基础
计量经济学计量小课

控制时间趋势——加一个 t 还是加一串年份虚拟变量?t 怎么赋值?

你研究\"城镇化率对居民消费的影响\"。你用的是省级面板数据,2000—2020 年。你跑了一个回归:

作者:计量科研导航站发布:2026-07-29★★

一、开篇:你的 Y 每年都在自然增长——不控制时间,X 的系数可能是一场误会

你研究"城镇化率对居民消费的影响"。你用的是省级面板数据,2000—2020 年。你跑了一个回归:

Yit=β0+β1⋅Urbanit+controls+εitY_{it} = \beta_0 + \beta_1 \cdot \text{Urban}_{it} + \text{controls} + \varepsilon_{it}

β̂₁ 显著为正。你正准备下结论——"城镇化促进了消费"。然后你画了一张图——居民消费在 2000—2020 年间几乎在所有省份都在上升(收入在增长、经济在发展),而城镇化率也在上升。这两个"都在上升"的趋势可能完全无关——你的回归只是捕获了两个变量各自独立的时间趋势之间的伪相关。

你需要在模型中控制"时间"。但怎么控?

  • 方案 A:加一个线性时间趋势变量 tt(t=1,2,…,Tt = 1, 2, \dots, T)。
  • 方案 B:加一串年份虚拟变量(λt\lambda_t,每个年份一个 0/1 变量)。

Stata 里的操作只差几个字符——但背后的假设和结论可能完全不同。

核心信息:线性时间趋势(方案 A)假设 Y 在时间上以恒定的速率变化——每过一年,Y 增加固定的 β_t 单位,无论经济周期、政策冲击、或外部事件如何。年份固定效应(方案 B)假设每年有一个独立的、不受任何参数形式约束的时间效应——2008 年可以因为金融危机而大幅偏离 2007 年和 2009 年的线性趋势。方案 A 只消耗 1 个自由度,方案 B 消耗 T−1 个自由度。如果你的 T 足够大且时间效应可能不是线性的——年份 FE 更安全、更灵活。如果你的 T 很小或你怀疑共线性使得年份 FE 吸走了 X 的大部分有用变异——线性趋势更经济、更不干扰核心系数的识别。t 的赋值——你给每年赋什么数字——会改变截距的含义和系数的解读:是让 t = 0 在样本的起始年、中间年、还是某个有制度意义的年份?不同的选择对应不同的'时间基准'。"


二、线性时间趋势 t ——一条直线穿过你的面板

2.1 模型设定

Yit=β0+β1Xit+βt⋅t+εitY_{it} = \beta_0 + \beta_1 X_{it} + \beta_t \cdot t + \varepsilon_{it}

其中 t=1,2,…,Tt = 1, 2, \dots, T(或任何等距递增值)。

β_t 的含义:在控制了 X 之后,Y 平均每一年变化 β_t 个单位。无论这一年发生了什么——金融危机、政策冲击、奥运——时间对 Y 的影响都是恒定的 β_t。

2.2 线性趋势做了什么——它消除了"X 和 Y 都随时间线性增长"的伪相关

直觉:如果你在 Y 对 X 的散点图上画一条穿过所有年份的直线——时间被"部分化出去"了。在时间被控制之后,你和你的邻居(同一年份的其他省份)在比较——而不是 2020 年的你和 2000 年的你在比较。

数学上:线性时间趋势等价于在每个变量的时间序列上去掉一条线性趋势线,然后对去趋势后的残差做回归。如果 X 和 Y 各自都有一条向上的时间趋势,去趋势的操作就是把"因为时间流逝而自然增长"的部分剥离,留下的才是 X 和 Y 之间超越时间的关联。

2.3 t 怎么赋值?——不只是"1, 2, 3, ..."

虽然 t 的间距(1 年、1 季度、1 月)不影响 β_t 的估计值,但 t 的原点(t = 0 对应哪一年)会影响截距 β₀ 的含义。

三种常见的赋值方式:

赋值方式 示例(数据 2000—2020) 截距 β₀ 的含义
自然编码 t = 2000, 2001, ..., 2020 公元 0 年的 Y 的预测值(毫无意义的外推)
从 1 开始 t = 1, 2, ..., 21 不存在的一年前(样本起始前一年)的 Y 预测值
中心化 t = −10, −9, ..., 0, ..., 10 样本中间年份的 Y 预测值(有意义的基准)

强烈建议使用中心化后的 t。让 t = 0 对应样本的中点(或某个有制度/经济意义的年份,如政策实施年)。这样,截距 β₀ 就等于"在样本中间年份,X = 0 时的 Y 的预测值"——这是一个在样本范围内的、有意义的数值,而不是一个在公元 0 年的荒谬外推。

* 中心化到样本中点
sum year
gen t = year - r(mean)    // t = 0 对应样本平均年份
 
* 中心化到某个制度节点(如政策实施年 = 2010)
gen t = year - 2010

2.4 线性趋势假设了什么——也是最容易出问题的地方

线性趋势假设时间对 Y 的影响是一条斜率为常数的直线。但真实世界不是线性的。 2008 年的 Y 和 2007 年的 Y 之间的差异,可能和 2018 年和 2017 年之间的差异完全不同。金融危机、政策冲击、技术突变——这些都不是线性的。

如果你强行用线性趋势去拟合非线性时间效应,未被吸收的非线性时间波动会残留在误差项中。如果这些波动恰好和你的 X 相关(比如"金融危机年份,城镇化投资也减少了"),你的 β₁ 就仍然是被时间效应污染的。


三、年份固定效应——每一年都有自己的一行

3.1 模型设定

Yit=β0+β1Xit+λt+εitY_{it} = \beta_0 + \beta_1 X_{it} + \lambda_t + \varepsilon_{it}

其中 λt\lambda_t 是 T−1 个年份虚拟变量(第 1 年为基准组,或等价地理解为每一年有一个独立的截距)。

在 Stata 中:

reg y x i.year        // 年份 FE(OLS)
xtreg y x i.year, fe  // 等价于包含年份虚拟变量的 FE
reghdfe y x, absorb(year)  // 高维 FE,更快

3.2 年份 FE 做了什么——消除了每一年所有个体共享的任何时间效应

年份 FE 等价于:在每一年内,将所有变量减去该年的横截面均值(年份去均值)。然后对去均值后的数据做回归。

这意味着:任何在某一年同时影响所有个体的因素——全国性的经济扩张/衰退、全国性的政策变动、全国性的技术冲击——都被年份 FE 吸收了。你的 X 的系数现在仅由同一年内不同个体之间的横向变异来识别。

年份 FE 不假设时间效应是任何特定的函数形式——它可以是线性、非线性、跳跃、U 形、任何形状。每一年独立地"锚定"一个水平。这是年份 FE 胜过线性趋势的最重要优势。

3.3 代价——自由度 + 可能吸走 X 的变异

  • 自由度损失:T 很大时(如日度数据 T = 3650),年份 FE 会消耗 T−1 = 3649 个自由度——这可能过于奢侈。通常使用月度或季度 FE 作为折中,或更粗的时间粒度。
  • 变异吸收:如果你的 X 主要是随时间变化的(如"全国性的政策"只在某些年份变动),年份 FE 会吸收 X 的大部分甚至全部变异——你的 β₁ 将无法被识别或标准误极大。这就是"政策变量 + 年份 FE"的经典困境——年份 FE 吸走了政策效果中随时间变化的那部分变异,而这恰好是政策的识别来源。

四、线性趋势 vs 年份 FE——怎么选?

线性时间趋势 t 年份固定效应
假设 时间效应是一条直线(恒定速率变化) 时间效应是任意形状(每年独立)
参数数量 1 T−1
自由度消耗 极少 较多(T 大时需谨慎)
适用于 T 小(≤ 5)、时间效应近似线性 T 大、时间效应可能不规则
识别来源 同时使用横截面和时间序列变异 主要使用横截面变异(年份内)
不能处理的 非线性时间冲击 全国性政策变量(和年份 FE 共线)
Stata 命令 reg y x t reg y x i.year

4.1 选择框架

你的 T 有多大?
├── T ≤ 5 → 线性趋势(年份 FE 消耗太多 df)
├── 5 < T ≤ 15 → 年份 FE(最常见的面板 T 范围,df 消耗可接受)
└── T > 15 → 年份 FE(但考虑使用更粗的时间粒度,如年度→两年一组)

你的时间效应可能是非线性的吗?
├── 是(有金融危机、政策突变等)→ 年份 FE
└── 否(平稳增长的数据)→ 线性趋势即可

你的 X 是"全国性随时间变化的政策变量"吗?
├── 是 → 年份 FE 会吸收政策变异!→ 用线性趋势 + 其他策略
└── 否(X 在个体间有横向变异)→ 年份 FE 更安全

4.2 两者可以共存——个体特定的线性趋势

一个常见的混合策略:年份 FE + 个体特定的线性趋势。

Yit=β0+β1Xit+λt+γi⋅t+εitY_{it} = \beta_0 + \beta_1 X_{it} + \lambda_t + \gamma_i \cdot t + \varepsilon_{it}

  • λt\lambda_t 吸收了所有个体共有的年度冲击(全国性的经济周期、政策)。
  • γi⋅t\gamma_i \cdot t 允许每个个体有自己的时间趋势。比如在研究"最低工资对就业的影响"时——不同州在政策实施前可能有着不同的就业增长趋势。个体特定趋势允许"处理组在政策前就有更高的就业增长率"这个事实被吸收——从而让 DID 的平行趋势假设更可能成立。

在 Stata 中:

* 个体特定线性趋势
xtreg y x i.year c.t##i.id  // 交互项太多,不推荐
reghdfe y x, absorb(id year id#c.t)  // 正确做法:reghdfe

个体特定趋势的代价是巨大的:你需要为每个个体估计一个趋势参数(N 个额外的参数)。只有在 N 不大、T 足够长、且理论上有理由认为个体间的趋势本身不同时,才使用这一策略。


五、常见误区

5.1 误区一:加了年份 FE 就万事大吉——忘了检查 X 的变异来源

年份 FE 去除了时间维度上所有个体共有的变异。如果你的 X 本身主要是随时间变化而不在个体之间变化(如全国性的宏观经济变量、统一推行的政策),年份 FE 会把它和共有的时间效应一起吸走。在加了年份 FE 之后,检查 X 的 within-R² 是否骤降到接近零——如果是,你的 X 不够"个体间横向变异",年份 FE 让它无法被识别。

5.2 误区二:线性趋势 = "我控制了时间"——但你的时间效应不是线性的

如果你的 Y 在样本期间经历了某次大幅波动(如 2008 年金融危机、2020 年疫情),一条直线是不可能捕捉这种波动的。你"控制"了一个错误形状的时间效应——你等于在说你已经处理了时间问题,但实际上你没有。 面对大幅波动,年份 FE 是唯一诚实的选择。

5.3 误区三:以为 t 的赋值影响 β_t——不影响,但影响 β₀

不管你用 t = 1, 2, 3... 还是 t = 2000, 2001, 2002...,β_t 的估计值完全不变——因为线性变换不改变斜率。但 β₀ 的含义会变。使用中心化的 t(t = 0 在样本中点或有意义的年份),让截距变得可解读——这是被广泛推荐但经常被忽略的良好实践。

5.4 误区四:面板数据中,个体 FE 和年份 FE 一起用就"控制了所有时间和个体层面的混淆因素"

个体 FE 消除了所有不随时间变化的个体异质性。年份 FE 消除了所有个体共有的时间效应。但两者都不能消除的是——随时间变化且在个体间不同的混淆因素(时变异质性)。 比如一个企业在某一年聘请了一位优秀的 CEO——这个变化是时变的、是个体特定的,个体 FE 和年份 FE 都拿它没办法。你仍然需要控制变量和识别策略来应对这一层。


六、总结

控制时间趋势的五条核心知识:

  1. 线性趋势 t = 你假设时间效应是一条斜率为常数的直线。 它只消耗 1 个自由度,但任何偏离直线的非线性时间冲击都会残留在误差中,可能继续污染你的系数。

  2. 年份 FE = 你假设时间效应可以是任意形状——每一年有一个独立的截距。 它吸收了所有个体共有的年度冲击,但消耗 T−1 个自由度,且可能吸走"随时间变化但不在个体间变异"的 X 的有用变异。

  3. t 的赋值——让 t = 0 对应样本中点或有制度意义的年份。 不要让 t = 0 对应公元 0 年或样本起始前一年。中心化让截距变得可解读。

  4. 选择取决于 T 的大小、时间效应的可能非线性程度、以及 X 的变异来源。 T ≤ 5 → 线性趋势。T 较大 + 可能有非线性冲击 → 年份 FE。X 主要是"随时间变化的全国性变量"→ 线性趋势(年份 FE 会吸收 X 的变异)。

  5. 两者可以共存——年份 FE + 个体特定趋势。 前者吸收共同冲击,后者允许个体间趋势不同——但需要 N 不大、T 足够长。


一句话收尾:

"线性时间趋势是一条直线——你假设每一年对 Y 的影响和前一年完全一样。年份固定效应是一组台阶——你允许每一年跳到任意高度,不需要解释为什么。一条直线是 1 个参数和 1 个假设,一组台阶是 T−1 个参数和 0 个假设。在你看不见时间效应的真正形状时——台阶比直线更诚实。但台阶有代价——它会挡住你看向那些随台阶一起起伏的 X。选择线还是台阶,不是哪个'更正确'——是哪个让你的 X 在控制了时间之后还能被看到。"


继续阅读

学习路径

计量小课:计量经济学基础·第 42 / 58 篇
42控制时间趋势——加一个 t 还是加一串年份虚拟变量?t 怎么赋值?