实证方法教程 / driscoll_kraay

Driscoll-Kraay 标准误

用同一份企业面板跑出可解释的模型证据

这节课解决什么适合企业、地区、个人等重复观测数据,重点控制个体不随时间变化的遗漏因素。
先准备哪些变量因变量 / 核心解释变量 / 个体 ID / 时间变量
会看到哪张表driscoll_kraay_results.csv
论文里怎么克制解释必须说明是否控制个体/时间固定效应,以及标准误按什么层级聚类。

Driscoll-Kraay 标准误是什么?

Driscoll-Kraay 标准误处理的是面板误差中的横截面相关、异方差和序列相关。它不改变回归系数,只改变推断方式,让标准误对更复杂的误差结构稳健。

先用一句话理解

把 Driscoll-Kraay 想成承认不同地区或企业会一起受冲击。普通标准误假设误差相互独立,但金融危机、宏观政策或行业冲击会让很多单位同时波动。

什么时候用

判断项教科书式判断
适合用在面板数据中担心横截面相关和时间序列相关同时存在。
先不要用在时间维度非常短,无法可靠估计 HAC 型标准误。
最关键的前提Driscoll-Kraay 是推断修正,不是识别策略。
读表顺序先确认系数同主规格,再比较标准误和 p 值变化。
论文表述边界只能说推断对横截面相关更稳健,不能说解决内生性。

把它和相近方法分清楚

容易混淆的对象怎么区分初学者记法
Cluster SE按某一层级允许组内相关。常见但未必处理跨截面相关。
Newey-West处理单一时间序列自相关和异方差。不是面板横截面相关。
Driscoll-Kraay允许面板中广泛横截面相关和序列相关。适合面板稳健推断。

核心直觉和模型公式

横截面平均上的 HAC

Driscoll-Kraay 可以理解为对横截面平均得分做 HAC 修正:

\[SE_{DK}=HAC\left(\frac{1}{N}\sum_i X_{it}\hat{\varepsilon}_{it}\right)\]

它修正的是协方差矩阵,因此系数点估计通常不变,变化的是标准误和显著性。

公式里的符号怎么读

符号含义在本页怎么理解
N截面数量企业、地区或个体数量。
t时间期年份、季度或月份。
epsilon_hat残差主模型未解释的部分。
HAC异方差自相关稳健修正允许时间相关结构。
SE_DKDriscoll-Kraay 标准误对横截面相关更稳健的推断。

专业使用口径

专业 DK 报告要明确它只是标准误替代口径。

口径专业写法
误差风险说明为什么担心横截面相关或序列相关。
滞后阶数报告使用的 lag 或带宽选择。
系数不变强调这是推断修正,不是新模型识别。
对照标准误可与 cluster SE 或普通 robust SE 对照。

一步一步做:从问题到结果的五步

步骤这一页具体做什么做到什么程度才算读懂
1. 固定主模型先确定同一套回归系数。DK 不应改变主规格。
2. 判断误差结构看是否可能有共同冲击或序列相关。风险要具体。
3. 选择滞后阶数根据 T 和经验规则设定 lag。T 短时要谨慎。
4. 计算 DK SE用 DK 协方差替换标准误。系数通常不变。
5. 比较推断看 p 值和置信区间是否仍支持结论。不要写成新效应。

结果怎么读:先读口径,再读数字

本页案例读表时,先记住这个口径:kernel = Driscoll-Kraay (Bartlett)。

读表顺序本页怎么读不要这样读
先看系数是否和主规格一致。DK 不是换系数。
再看标准误是否比 cluster 或 robust 更大。显著性变化是推断风险信号。
然后看 lag滞后阶数是否合理。lag 不说明会影响可复核性。
最后看结论推断稳健时再说结果对相关结构不敏感。不能说识别问题解决。

初学者最容易错在哪里

误读为什么错
把 DK 当内生性处理错。它只修正标准误。
不报告 lag不够。推断不可复核。
T 很短仍强用风险较高。HAC 估计依赖时间维度。
系数变了还说只是标准误要检查代码。DK 不应改变估计方程。

先看这个案例的结论

  • kernel = Driscoll-Kraay (Bartlett)。
  • lag = 2。
  • 状态 = xtscc 失败 (需 ssc install xtscc) rc=199。
  • 这些数字来自页面里的结果表;写论文时先解释数值含义,再讨论理论含义。

变量要求和案例口径

字段口径
数据CSMAR 风格 A 股企业创新面板
原始样本196 家上市公司,2015-2020 年,约 1200 个公司-年观测;各方法有效样本以本页输出表 N 为准
因变量patent_count;回归页通常使用 ln(1 + patent_count)
核心解释变量dfi_index,数字普惠金融指数;部分案例输出展示的是标准化后的 dfi_index
控制变量roa、lev、size、growth、cashflow、tobinq、top1、dual、board、indep、soe、age
输出文件driscoll_kraay_results.csv
角色要求因变量、核心解释变量、个体 ID、时间变量
依赖包xtscc

实际代码

下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。

log using "/root/workspace/empirical-wizard/workspace/d2b9f5c9/analysis.log", replace text
global JOB_DIR "/root/workspace/empirical-wizard/workspace/d2b9f5c9"
set more off
adopath + "/root/ado/plus"
global DATA_PATH "/root/workspace/empirical-wizard/workspace/test_e2e/csmar_innovation.csv"
import delimited "/root/workspace/empirical-wizard/workspace/test_e2e/csmar_innovation.csv", clear case(preserve)
capture confirm global JOB_DIR
if _rc global JOB_DIR "."
* 自动去除完全重复行(同列同值),避免 N 虚增与 xtset 失败
quietly duplicates drop
local idvar ""
local timevar ""
capture confirm variable stkcd
if !_rc {
    capture confirm numeric variable stkcd
    if _rc {
        tempvar __ewiz_id
        capture encode stkcd, gen(`__ewiz_id')
        if !_rc local idvar "`__ewiz_id'"
    }
    else {
        local idvar "stkcd"
    }
}
else {
    di as text "面板ID变量不存在,跳过 xtset ID:stkcd"
}
capture confirm variable year
if !_rc {
    capture confirm numeric variable year
    if _rc {
        tempvar __ewiz_time
        capture encode year, gen(`__ewiz_time')
        if !_rc local timevar "`__ewiz_time'"
    }
    else {
        local timevar "year"
    }
}
else {
    di as text "时间变量不存在,跳过 xtset time:year"
}
if "`idvar'" != "" & "`timevar'" != "" {
    capture xtset `idvar' `timevar'
}

* ── Driscoll-Kraay 标准误 (xtscc) ──
capture noisily xtscc patent_count dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age, lag(2) fe
local _rc = _rc
tempname fh
capture file close `fh'
file open `fh' using "$JOB_DIR/driscoll_kraay_results.csv", write replace
file write `fh' "项目,值" _n
file write `fh' "因变量,patent_count" _n
file write `fh' "核心解释变量,dfi_index" _n
file write `fh' "kernel,Driscoll-Kraay (Bartlett)" _n
file write `fh' "lag,2" _n
if `_rc' == 0 {
    capture local _b : display %9.4f _b[dfi_index]
    capture local _se : display %9.4f _se[dfi_index]
    capture local _t = _b[dfi_index]/_se[dfi_index]
    capture local _t_s : display %9.3f `_t'
    capture local _p : display %9.4f 2*ttail(e(df_r), abs(`_t'))
    capture local _n = e(N)
    file write `fh' "系数,`_b'" _n
    file write `fh' "DK 标准误,`_se'" _n
    file write `fh' "t 值,`_t_s'" _n
    file write `fh' "p 值,`_p'" _n
    file write `fh' "N,`_n'" _n
}
else {
    file write `fh' "状态,xtscc 失败 (需 ssc install xtscc) rc=`_rc'" _n
}
file close `fh'
di "Driscoll-Kraay 完成"
log close

实际输出表

这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。

项目
因变量patent_count
核心解释变量dfi_index
kernelDriscoll-Kraay (Bartlett)
lag2
状态xtscc 失败 (需 ssc install xtscc) rc=199

案例图

这是一张由同一份案例数据生成的页面内诊断图。

Driscoll-Kraay 标准误 的共用案例输出图。
Driscoll-Kraay 标准误 的共用案例输出图。

论文里怎么写

本文在共用企业面板样本上报告Driscoll-Kraay 标准误,核心输出见 driscoll_kraay_results.csv。结果解释时同时关注样本口径、变量构造、系数方向、标准误和适用前提,避免只凭单个 p 值完成方法选择。

检查清单

  • 先确认面板存在横截面相关或序列相关风险,DK 是标准误修正。
  • 说明时间维度是否足够支撑 Driscoll-Kraay 推断。
  • DK 改变的是标准误和显著性,不改变回归系数本身。

返回教程库 · 查看共用案例