Marx MaxEN
菜单

异方差与稳健标准误:在同一份数据上比较 Python 和 Stata

摘要:换成稳健标准误时,改变的是协方差估计,而不是 OLS 系数。本指南用同一份 500 行模拟数据说明普通与 HC1 标准误、区间和 p 值的区别,提供 Python 与 Stata 的独立实算对照及下载复做包,并明确异方差、内生性和观测相关不能混为同一种问题。

一份回归加入 vce(robust) 后,系数没有变,标准误和区间却变了,这两件事并不矛盾。固定相同数据、变量、样本和估计方式时,OLS 点估计回答的是同一个问题,变化发生在对估计不确定性的计算上。要理解这个区别,先把比较条件固定下来,而不是同时改样本、加变量,再把结果变化都归到“稳健”上。

配套异方差案例从完全模拟的数据开始。Python 直接计算协方差矩阵,Stata 对同一 CSV 分别执行普通回归和 vce(robust);实际系数、标准误、区间及 p 值已经逐项对照。读者可以下载代码、数据、图和日志,在新练习目录独立复做。

让异方差成为已知条件

生成模型为 y = 1 + 2x + (0.3 + 1.2|x|)z,其中 x 服从 Uniform(−2,2),z 服从标准正态,二者独立,各观测相互独立。误差的条件均值为零,但其方差随 x 改变;这是本例特意设定的异方差,不是从一张残差图证明真实研究符合某种模型。

种子固定为 42,样本量为 500。比较时保留带截距的 y 对 x 回归,使用全部观测,没有挑选样本或增加控制变量。这样,标准误差异就不会与样本变化混在一起。

可以在独立练习项目中提出这样的任务:

使用给定的模拟生成过程,保留同一份数据和 OLS 系数,分别计算普通与 HC1 标准误、t 参考区间和 p 值。提供 Python 与 Stata 程序、全部系数表、残差图和实际日志。核对样本是否相同,不为了让结果显著而修改种子或样本。只写入练习目录。

这是一项任务示例;在 Marx Max 中尝试时,要查看实际代码与输出,使用 Stata 前按使用指南连接合法安装。

普通与 HC1 分别改变什么?

普通 OLS 协方差用一个残差均方描述误差尺度。HC1 则把各观测的残差平方放进 sandwich 形式,并乘以 n/(n−k);k 包含截距,本例为 2。Stata 官方 regress 说明给出了 vce(robust) 的异方差协方差计算及有限样本修正。

本次计算中,斜率约为 1.973,普通标准误约为 0.066,HC1 约为 0.084,区间相应变宽。截距的两种标准误几乎相同,HC1 略小。因此“稳健标准误”不意味着每一项都会变大。两种推断下斜率都显著,本案例也没有把显著性翻转作为成功条件。

区间和 p 值使用自由度 n−k 的 t 分布作参考。异方差下,这不是精确有限样本覆盖率保证;一次模拟也不能证明哪种方法在所有场景都更好。若要研究覆盖率,应另设重复模拟和比较方案,而不是从一次输出作普遍判断。

从下载包复做,再回到自己的问题

完整复做包包含自写 Python 程序、Stata do-file、500 行模拟数据、全部系数表、图、两套实际日志和说明。先保留一份原成果,解压到新目录。Python 按 README 准备依赖后运行 python analyze.py;Stata 在新的练习会话中切换到包根,运行 do analysis.do,可以独立读取模拟 CSV,不需要 Python 或额外 Stata 命令。

检查完成标记、500 个观测和全部系数,再对照两种标准误、区间及 p 值。Stata 的 clear all 会清空该会话,程序会覆写练习目录中的同名成果,先保存已有工作。若改变种子,使用新的完整包副本,保留新旧结果;不要把挑中某个 p 值当作方法验证。

回到真实研究时,还要判断观测是否独立、解释变量与误差是否相关,以及模型是否遗漏重要条件。HC1 不会改变系数,也不能修复内生性、遗漏变量、组内相关或时间相关。本例只隔离异方差推断这一件事。可以先回看OLS 抽样分布,区分系数的抽样波动与单次回归对不确定性的估计,再依据研究设计选择适合的推断方式。