控制时间趋势——加一个 t 还是加一串年份虚拟变量?t 怎么赋值?
你研究\"城镇化率对居民消费的影响\"。你用的是省级面板数据,2000—2020 年。你跑了一个回归:
一、开篇:你的 Y 每年都在自然增长——不控制时间,X 的系数可能是一场误会
你研究"城镇化率对居民消费的影响"。你用的是省级面板数据,2000—2020 年。你跑了一个回归:
β̂₁ 显著为正。你正准备下结论——"城镇化促进了消费"。然后你画了一张图——居民消费在 2000—2020 年间几乎在所有省份都在上升(收入在增长、经济在发展),而城镇化率也在上升。这两个"都在上升"的趋势可能完全无关——你的回归只是捕获了两个变量各自独立的时间趋势之间的伪相关。
你需要在模型中控制"时间"。但怎么控?
- 方案 A:加一个线性时间趋势变量 ()。
- 方案 B:加一串年份虚拟变量(,每个年份一个 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 模型设定
其中 (或任何等距递增值)。
β_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 - 20102.4 线性趋势假设了什么——也是最容易出问题的地方
线性趋势假设时间对 Y 的影响是一条斜率为常数的直线。但真实世界不是线性的。 2008 年的 Y 和 2007 年的 Y 之间的差异,可能和 2018 年和 2017 年之间的差异完全不同。金融危机、政策冲击、技术突变——这些都不是线性的。
如果你强行用线性趋势去拟合非线性时间效应,未被吸收的非线性时间波动会残留在误差项中。如果这些波动恰好和你的 X 相关(比如"金融危机年份,城镇化投资也减少了"),你的 β₁ 就仍然是被时间效应污染的。
三、年份固定效应——每一年都有自己的一行
3.1 模型设定
其中 是 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 + 个体特定的线性趋势。
- 吸收了所有个体共有的年度冲击(全国性的经济周期、政策)。
- 允许每个个体有自己的时间趋势。比如在研究"最低工资对就业的影响"时——不同州在政策实施前可能有着不同的就业增长趋势。个体特定趋势允许"处理组在政策前就有更高的就业增长率"这个事实被吸收——从而让 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 都拿它没办法。你仍然需要控制变量和识别策略来应对这一层。
六、总结
控制时间趋势的五条核心知识:
-
线性趋势 t = 你假设时间效应是一条斜率为常数的直线。 它只消耗 1 个自由度,但任何偏离直线的非线性时间冲击都会残留在误差中,可能继续污染你的系数。
-
年份 FE = 你假设时间效应可以是任意形状——每一年有一个独立的截距。 它吸收了所有个体共有的年度冲击,但消耗 T−1 个自由度,且可能吸走"随时间变化但不在个体间变异"的 X 的有用变异。
-
t 的赋值——让 t = 0 对应样本中点或有制度意义的年份。 不要让 t = 0 对应公元 0 年或样本起始前一年。中心化让截距变得可解读。
-
选择取决于 T 的大小、时间效应的可能非线性程度、以及 X 的变异来源。 T ≤ 5 → 线性趋势。T 较大 + 可能有非线性冲击 → 年份 FE。X 主要是"随时间变化的全国性变量"→ 线性趋势(年份 FE 会吸收 X 的变异)。
-
两者可以共存——年份 FE + 个体特定趋势。 前者吸收共同冲击,后者允许个体间趋势不同——但需要 N 不大、T 足够长。
一句话收尾:
"线性时间趋势是一条直线——你假设每一年对 Y 的影响和前一年完全一样。年份固定效应是一组台阶——你允许每一年跳到任意高度,不需要解释为什么。一条直线是 1 个参数和 1 个假设,一组台阶是 T−1 个参数和 0 个假设。在你看不见时间效应的真正形状时——台阶比直线更诚实。但台阶有代价——它会挡住你看向那些随台阶一起起伏的 X。选择线还是台阶,不是哪个'更正确'——是哪个让你的 X 在控制了时间之后还能被看到。"
继续阅读
- 标准差、标准误、标准化——都这么"标准",到底讲的是啥?
如果你是在中文语境下学的统计和计量,一定经历过这种微妙的困惑——
计量经济学 - 从线性回归到 Logistic 模型——核心原理、过渡推理与可挖掘的经济含义
你研究\"个人是否创业\"——Y = 1 表示创业,Y = 0 表示没有。你想用年龄、教育、性别和家庭财富来预测一个人的创业概率。
计量经济学 - 大家都关心因果,那么数据"相关性"分析到底有什么用?
如果你关注近几年的社科研究方法论讨论,一定会感受到一股强大的风向——因果推断几乎占据了话语权的全部。
计量经济学 - 当我们拿到一份数据,如何从抽样的视角审视它的代表性与合理性?
上过计量方法课的人,大概率都学过抽样——简单随机抽样、分层抽样、整群抽样、系统抽样、PPS抽样,每种方法的公式和特点都背过。考试的时候,你知道分层抽样能降低方差,知道整群抽样的设计效应怎么算。
计量经济学 - 当我们说"OLS 估计量是无偏的",我们在说什么?
初学计量的人,在学完 OLS 的无偏性之后,往往会产生一种奇异的安心感。
计量经济学