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

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

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

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

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

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

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

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

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

  • 方案 A:加一个线性时间趋势变量 ttt=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+βtt+ε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+γit+εitY_{it} = \beta_0 + \beta_1 X_{it} + \lambda_t + \gamma_i \cdot t + \varepsilon_{it}

  • λt\lambda_t 吸收了所有个体共有的年度冲击(全国性的经济周期、政策)。
  • γit\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 在控制了时间之后还能被看到。"


七、B站/公众号呈现建议

  • B站视频:建议用"一条直线 vs 一组台阶"作为核心视觉对比。开场:一个面板散点图——X 轴是年份(2000—2020),Y 轴是居民消费。数据点整体向右上方倾斜。一条直线从 2000 年画到 2020 年(线性趋势)。2008 年那里,数据点明显向下塌陷(金融危机),但直线不理会——它无动于衷地穿过了塌陷。旁白:"线性趋势假设时间是一条直线——每年 Y 的'自然变化'都是固定的。但 2008 年不是'平常的一年'——你的直线没法弯腰。"画面中直线脱落,换成一组台阶——每一年一个台阶,2008 年的台阶比其他年份明显低一截。旁白:"年份固定效应说:每一年可以跳到任何高度。2008 年可以低一点,2009 年可以高一点——我不需要知道为什么,我只是不让这些年度波动污染你的 β₁。"第一幕"t 怎么赋值":一个时间轴,滑动原点位置。t = 0 在公元 0 年(画面边缘外、标注"毫无意义的截距"),滑到 t = 0 在样本起始年(标注"截距 = 起始年的 Y 预测值"),再滑到 t = 0 在样本中点(标注"截距 = 中间年份的 Y 预测值——最安全的选择")。旁白:"t 的原点决定了截距是谁——让 t = 0 落在样本中间,你就有了一个在样本范围内的、有意义的基准线。"第二幕"怎么选":一个决策树动画——T ≤ 5 → 线性趋势(绿灯)。T 较大 → 问"有金融危机/政策突变吗?" → 有 → 年份 FE(黄灯)。再问"X 是全国性随时间变的政策吗?" → 是 → 线性趋势(年份 FE 会吸走你的识别变异——红灯警告)。第三幕"可以共存":画面展示一个带有个体特定趋势的面板——每个个体有一条自己的浅色趋势线,所有个体共享一组年份台阶(深色)。旁白:"年份台阶吸收了全国的共同冲击——比如 2008 年大家都不好。个体趋势线允许每个省有自己的时间斜坡——这个省本来就比那个省增长得快。两者各做各的——台阶管共同的时间波动,趋势管个体的时间斜率。"
  • 公众号:线性趋势 vs 年份 FE 的双列对比表(假设、参数数量、自由度消耗、识别来源、Stata 命令)做成信息图核心。t 的三种赋值方式(自然编码、从 1 开始、中心化)配截距含义的对比,做成三行卡片。选择框架的决策树做成纵向流程图。个体特定趋势的方程和 Stata 命令(reghdfe, absorb(id year id#c.t))做成代码卡片。误区四则(年份 FE 吸走 X 变异、线性趋势不处理非线性冲击、t 赋值不影响 β_t 但影响 β₀、FE+FE 不处理时变异质性)做成警告卡。
  • 推荐标题
    • 主标题:《控制时间趋势——加一个 t 还是加一串年份虚拟变量?》
    • 备选标题:《线性趋势 vs 年份固定效应——一条直线和一组台阶,谁更诚实?》
    • 新媒体标题:《你的 Y 每年都在涨——不控制时间,你的 X 系数可能只是一场趋势伪相关》
  • 金句提炼

    "线性趋势是一条直线——你假设每一年对 Y 的影响是同一个固定的速率。年份 FE 是一组台阶——你承认有些年份就是不一样,不需要解释为什么。一条直线比较省参数,一组台阶比较诚实。"

    "t 的原点是你截距的锚。让 t = 0 落在公元 0 年——你的截距是一个公元 0 年的 Y 的荒谬预测。让 t = 0 落在样本中点——你的截距是'在你研究的这段时间的中间年份,X = 0 时的 Y 的预测值'。同样的斜率,不同的基准——一个有意义,一个没有。"

    "年份 FE 会吸走你的 X——如果你的 X 是'全国性的随时间变化的政策'。年份 FE 把每一年所有省份共享的时间波动都吸走了——而这个波动恰好包含着你的政策是否实施了的变异。用年份 FE 之前,先问自己:我的 X 有足够的横向变异吗?"

    "个体 FE + 年份 FE ≠ 控制了所有混淆因素。两者共同捕捉的只是时间和个体两个固定维度——随时间变化且因个体而异的混淆因素,仍然在误差项里,仍然会让你的 β₁ 有偏。"