基准回归是什么?
基准回归回答论文主表的第一个问题:在同一批样本、同一套控制变量、清楚的固定效应和标准误口径下,核心解释变量与因变量是否存在稳定的条件关系。它不是为了找到最显著的一列,而是为了给全文建立一条可复核的主规格。
先用一句话理解
把基准回归想成论文的参照尺。后面的稳健性、机制、异质性和内生性检验,都在问同一件事:如果换一把合理的尺子,主关系是否还站得住。
什么时候用
| 判断项 | 教科书式判断 |
|---|---|
| 适合用在 | 研究问题已经明确,因变量、核心解释变量、控制变量和固定效应都能从理论上解释。 |
| 先不要用在 | 只是想试很多变量组合,直到某个系数显著。那是规格搜索,不是主规格设计。 |
| 最关键的前提 | 核心变量不是明显由结果变量反向决定,遗漏变量风险至少要在后续模块中继续处理。 |
| 读表顺序 | 先看样本和固定效应,再看核心系数的方向、量级、标准误口径和列间稳定性。 |
| 论文表述边界 | 只能写成条件相关或主规格估计,不能因为显著就直接写成因果效应。 |
把它和相近方法分清楚
| 容易混淆的对象 | 怎么区分 | 初学者记法 |
|---|---|---|
| 描述性统计 | 只告诉样本分布,不控制其他因素。 | 它是进入模型前的样本体检。 |
| 相关矩阵 | 看两个变量是否一起变化。 | 它不能替代控制变量后的主回归。 |
| 基准回归 | 在预先说明的控制和固定效应下估计核心关系。 | 它是全文的参照规格。 |
核心直觉和模型公式
主规格公式
面板论文里常见的主规格可以写成:
\[Y_{it}=\beta X_{it}+\boldsymbol{\gamma}'\mathbf{Z}_{it}+\mu_i+\lambda_t+\varepsilon_{it}\]
这条公式的重点不是星号,而是每一项都有清楚的研究含义。
公式里的符号怎么读
| 符号 | 含义 | 在本页怎么理解 |
|---|---|---|
| Y_it | 因变量 | 第 i 个对象在第 t 期的结果,本案例通常是企业创新产出。 |
| X_it | 核心解释变量 | 论文最关心的解释变量,本案例通常是数字普惠金融指数。 |
| Z_it | 控制变量 | 规模、盈利、杠杆、治理等可能同时影响 Y 和 X 的因素。 |
| β | 核心系数 | 在控制 Z、个体差异和年份冲击后,X 与 Y 的条件关系。 |
| μ_i | 个体固定效应 | 控制企业、地区或个体不随时间变化的差异。 |
| λ_t | 时间固定效应 | 控制所有样本共同经历的年份或时期冲击。 |
| ε_it | 误差项 | 模型没有解释的部分,也是标准误和识别风险讨论的来源。 |
专业使用口径
专业主表不是把控制变量越堆越多,而是让读者知道每一列为什么存在。
| 口径 | 专业写法 |
|---|---|
| 列设计 | 从短规格到完整主规格逐步加入控制变量和固定效应,列与列之间只改变少数口径。 |
| 标准误 | 面板数据通常按个体聚类;若换稳健标准误,要说明为什么。 |
| 样本 | 每列 N 不应无故大幅跳动;跳动时先解释缺失值和变量口径。 |
| 固定效应 | 写清个体 FE、年份 FE 是否进入模型,不要只在表注里含糊写 controls。 |
一步一步做:从问题到结果的五步
| 步骤 | 这一页具体做什么 | 做到什么程度才算读懂 |
|---|---|---|
| 1. 写清主问题 | 先用一句话说明 Y、X 和预期方向。 | 不能从代码里反推研究问题。 |
| 2. 固定样本口径 | 确认每列使用的样本范围、年份和缺失处理一致。 | 样本变动是主表最常见的隐形问题。 |
| 3. 决定控制变量 | 控制变量来自理论和文献,不是显著性筛选。 | 每个控制变量都应能被解释。 |
| 4. 设定固定效应和标准误 | 面板主表通常至少考虑个体和时间维度。 | 标准误口径要和数据结构匹配。 |
| 5. 读完整列而非一格 | 同时读核心系数、N、R²、FE 标记和标准误。 | 只截一个 p 值会误导读者。 |
结果怎么读:先读口径,再读数字
本页案例读表时,先记住这个口径:核心变量 dfi_index 在四个模型中的系数是 0.5835*** / 0.5709*** / 0.5671*** / 0.5660***,方向和显著性都比较稳定。
| 读表顺序 | 本页怎么读 | 不要这样读 |
|---|---|---|
| 先看表头 | 确认每一列加入了哪些控制和固定效应。 | 不要直接跳到核心变量星号。 |
| 再看核心系数 | 方向是否符合理论,量级是否在变量单位下可解释。 | 不要把系数大小和显著性混为一谈。 |
| 然后看推断 | 标准误是否聚类,p 值是否和主表设计一致。 | 不要把稳健性模块结果伪装成主规格。 |
| 最后看边界 | 如果主表只是条件相关,正文就不要写成因果。 | 不要让标题比模型能支持的结论更强。 |
初学者最容易错在哪里
| 误读 | 为什么错 |
|---|---|
| 把主规格当成显著性优化 | 错。主规格应先由研究设计决定,再看结果。 |
| 控制变量靠逐步筛选 | 错。控制变量应来自理论、制度背景和文献。 |
| 固定效应写不清楚 | 错。个体 FE 和时间 FE 改变的是估计来源,必须明示。 |
| 只报告显著列 | 错。列设计本身也是证据,不能选择性展示。 |
先看这个案例的结论
- 核心变量 dfi_index 在四个模型中的系数是 0.5835*** / 0.5709*** / 0.5671*** / 0.5660***,方向和显著性都比较稳定。
- R² 从 0.1932 / 0.2824 / 0.4069 / 0.4098 逐步上升,说明控制变量、个体固定效应和时间固定效应确实解释了额外变异。
- 四列样本量是 720 / 720 / 720 / 720;如果你自己的表里样本量每列跳动很大,先回去检查缺失和变量口径。
变量要求和案例口径
| 字段 | 口径 |
|---|---|
| 数据 | 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 |
| 输出文件 | regression_table_基准回归.csv |
| 角色要求 | 因变量、核心解释变量 |
| 依赖包 | 无额外 Stata 社区包要求 |
实际代码
下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。
log using "/root/workspace/empirical-wizard/workspace/e53e8eb7/analysis.log", replace text
global JOB_DIR "/root/workspace/empirical-wizard/workspace/e53e8eb7"
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 "."
quietly duplicates drop
local dvvar "patent_count"
local ivvar "dfi_index"
local controls "roa lev size growth cashflow tobinq top1 dual board indep soe age"
local idvar "stkcd"
local timevar "year"
local industryvar "ind"
local geovar ""
local allvars "dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age"
capture confirm variable `dvvar'
if _rc {
di as error "Dependent variable not found: `dvvar'"
exit 111
}
capture confirm variable `ivvar'
if _rc {
di as error "Core independent variable not found: `ivvar'"
exit 111
}
local absorb_id "`idvar'"
if "`idvar'" != "" {
capture confirm numeric variable `idvar'
if _rc {
tempvar __ewiz_id
encode `idvar', gen(`__ewiz_id')
local absorb_id "`__ewiz_id'"
}
}
local cluster_id "`absorb_id'"
local fe_time "`timevar'"
if "`timevar'" != "" {
capture confirm numeric variable `timevar'
if _rc {
tempvar __ewiz_time
encode `timevar', gen(`__ewiz_time')
local fe_time "`__ewiz_time'"
}
}
local industry_fe "`industryvar'"
if "`industryvar'" != "" {
capture confirm numeric variable `industryvar'
if _rc {
tempvar __ewiz_industry
encode `industryvar', gen(`__ewiz_industry')
local industry_fe "`__ewiz_industry'"
}
}
local cluster_industry "`industry_fe'"
local geo_fe "`geovar'"
if "`geovar'" != "" {
capture confirm numeric variable `geovar'
if _rc {
tempvar __ewiz_geo
encode `geovar', gen(`__ewiz_geo')
local geo_fe "`__ewiz_geo'"
}
}
local cluster_geo "`geo_fe'"
tempfile ewiz_summary
tempname ewiz_sum
postfile `ewiz_sum' str32 spec double coef se pvalue str4 stars double N R2 using `ewiz_summary', replace
foreach v of local allvars {
local cell_b1_`v' ""
local secell_b1_`v' ""
local cell_b2_`v' ""
local secell_b2_`v' ""
local cell_b3_`v' ""
local secell_b3_`v' ""
local cell_b4_`v' ""
local secell_b4_`v' ""
}
preserve
quietly reg `dvvar' `ivvar', vce(robust)
restore
capture local N_b1 : display %12.0f e(N)
if "`N_b1'"=="" local N_b1 = .
capture local R2_b1 : display %9.4f e(r2)
if "`R2_b1'"=="" local R2_b1 = .
capture scalar __ewiz_main_b_b1 = _b[`ivvar']
capture scalar __ewiz_main_se_b1 = _se[`ivvar']
capture local coefmain_b1 : display %9.4f __ewiz_main_b_b1
capture if abs(__ewiz_main_b_b1) < 0.00005 & __ewiz_main_b_b1 != 0 local coefmain_b1 : display %9.2e __ewiz_main_b_b1
capture local semain_b1 : display %9.4f __ewiz_main_se_b1
capture if abs(__ewiz_main_se_b1) < 0.00005 & __ewiz_main_se_b1 != 0 local semain_b1 : display %9.2e __ewiz_main_se_b1
local pmain_b1 = .
local starsmain_b1 ""
local __ewiz_model_valid_b1 = 1
capture scalar __ewiz_coef_abs_b1 = abs(_b[`ivvar'])
if _rc local __ewiz_model_valid_b1 = 0
capture scalar __ewiz_se_abs_b1 = abs(_se[`ivvar'])
if _rc local __ewiz_model_valid_b1 = 0
capture if scalar(__ewiz_se_abs_b1) <= 1e-12 local __ewiz_model_valid_b1 = 0
capture if scalar(__ewiz_coef_abs_b1) <= 1e-12 & scalar(__ewiz_se_abs_b1) <= 1e-12 local __ewiz_model_valid_b1 = 0
capture local __df_b1 = e(df_r)
capture local __z_b1 = abs(_b[`ivvar'] / _se[`ivvar'])
if !_rc & `__ewiz_model_valid_b1' == 1 {
if "`__df_b1'"=="" | "`__df_b1'"=="." local pmain_b1 = 2*(1-normal(`__z_b1'))
else local pmain_b1 = 2*ttail(`__df_b1', `__z_b1')
}
if `__ewiz_model_valid_b1' == 1 local starsmain_b1 = cond(`pmain_b1'<0.01,"***",cond(`pmain_b1'<0.05,"**",cond(`pmain_b1'<0.1,"*","")))
if `__ewiz_model_valid_b1' == 1 {
capture post `ewiz_sum' ("(1)") (_b[`ivvar']) (_se[`ivvar']) (`pmain_b1') ("`starsmain_b1'") (`N_b1') (`R2_b1')
if _rc post `ewiz_sum' ("(1)") (.) (.) (.) ("") (`N_b1') (`R2_b1')
}
else post `ewiz_sum' ("(1)") (.) (.) (.) ("") (`N_b1') (`R2_b1')
if `__ewiz_model_valid_b1' == 1 {
local __included_vars "`ivvar' dfi_index"
foreach v of local allvars {
local __is_included = 0
foreach __inc of local __included_vars {
if "`v'" == "`__inc'" local __is_included = 1
}
if `__is_included' == 0 continue
local model_term "`v'"
if "`v'" == "`ivvar'" local model_term "`ivvar'"
capture scalar __ewiz_term_b = _b[`model_term']
capture scalar __ewiz_term_se = _se[`model_term']
if _rc | missing(__ewiz_term_se) | __ewiz_term_se <= 1e-12 {
local cell_b1_`v' "omitted"
local secell_b1_`v' "(absorbed)"
continue
}
capture local __coef : display %9.4f __ewiz_term_b
capture if abs(__ewiz_term_b) < 0.00005 & __ewiz_term_b != 0 local __coef : display %9.2e __ewiz_term_b
if !_rc {
capture local __se : display %9.4f __ewiz_term_se
capture if abs(__ewiz_term_se) < 0.00005 & __ewiz_term_se != 0 local __se : display %9.2e __ewiz_term_se
local __p = .
local __stars ""
capture local __df = e(df_r)
capture local __z = abs(_b[`model_term'] / _se[`model_term'])
if !_rc {
if "`__df'"=="" | "`__df'"=="." local __p = 2*(1-normal(`__z'))
else local __p = 2*ttail(`__df', `__z')
}
if !_rc local __stars = cond(`__p'<0.01,"***",cond(`__p'<0.05,"**",cond(`__p'<0.1,"*","")))
local cell_b1_`v' "`__coef'`__stars'"
local secell_b1_`v' "(`__se')"
}
}
}
di "(1): `ivvar'=`coefmain_b1'`starsmain_b1' (se=`semain_b1', p=`pmain_b1'), N=`N_b1', R2=`R2_b1'"
preserve
quietly reg `dvvar' `ivvar' roa lev size growth cashflow tobinq top1 dual board indep soe age, vce(robust)
restore
capture local N_b2 : display %12.0f e(N)
if "`N_b2'"=="" local N_b2 = .
capture local R2_b2 : display %9.4f e(r2)
if "`R2_b2'"=="" local R2_b2 = .
capture scalar __ewiz_main_b_b2 = _b[`ivvar']
capture scalar __ewiz_main_se_b2 = _se[`ivvar']
capture local coefmain_b2 : display %9.4f __ewiz_main_b_b2
capture if abs(__ewiz_main_b_b2) < 0.00005 & __ewiz_main_b_b2 != 0 local coefmain_b2 : display %9.2e __ewiz_main_b_b2
capture local semain_b2 : display %9.4f __ewiz_main_se_b2
capture if abs(__ewiz_main_se_b2) < 0.00005 & __ewiz_main_se_b2 != 0 local semain_b2 : display %9.2e __ewiz_main_se_b2
local pmain_b2 = .
local starsmain_b2 ""
local __ewiz_model_valid_b2 = 1
capture scalar __ewiz_coef_abs_b2 = abs(_b[`ivvar'])
if _rc local __ewiz_model_valid_b2 = 0
capture scalar __ewiz_se_abs_b2 = abs(_se[`ivvar'])
if _rc local __ewiz_model_valid_b2 = 0
capture if scalar(__ewiz_se_abs_b2) <= 1e-12 local __ewiz_model_valid_b2 = 0
capture if scalar(__ewiz_coef_abs_b2) <= 1e-12 & scalar(__ewiz_se_abs_b2) <= 1e-12 local __ewiz_model_valid_b2 = 0
capture local __df_b2 = e(df_r)
capture local __z_b2 = abs(_b[`ivvar'] / _se[`ivvar'])
if !_rc & `__ewiz_model_valid_b2' == 1 {
if "`__df_b2'"=="" | "`__df_b2'"=="." local pmain_b2 = 2*(1-normal(`__z_b2'))
else local pmain_b2 = 2*ttail(`__df_b2', `__z_b2')
}
if `__ewiz_model_valid_b2' == 1 local starsmain_b2 = cond(`pmain_b2'<0.01,"***",cond(`pmain_b2'<0.05,"**",cond(`pmain_b2'<0.1,"*","")))
if `__ewiz_model_valid_b2' == 1 {
capture post `ewiz_sum' ("(2)") (_b[`ivvar']) (_se[`ivvar']) (`pmain_b2') ("`starsmain_b2'") (`N_b2') (`R2_b2')
if _rc post `ewiz_sum' ("(2)") (.) (.) (.) ("") (`N_b2') (`R2_b2')
}
else post `ewiz_sum' ("(2)") (.) (.) (.) ("") (`N_b2') (`R2_b2')
if `__ewiz_model_valid_b2' == 1 {
local __included_vars "`ivvar' dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age"
foreach v of local allvars {
local __is_included = 0
foreach __inc of local __included_vars {
if "`v'" == "`__inc'" local __is_included = 1
}
if `__is_included' == 0 continue
local model_term "`v'"
if "`v'" == "`ivvar'" local model_term "`ivvar'"
capture scalar __ewiz_term_b = _b[`model_term']
capture scalar __ewiz_term_se = _se[`model_term']
if _rc | missing(__ewiz_term_se) | __ewiz_term_se <= 1e-12 {
local cell_b2_`v' "omitted"
local secell_b2_`v' "(absorbed)"
continue
}
capture local __coef : display %9.4f __ewiz_term_b
capture if abs(__ewiz_term_b) < 0.00005 & __ewiz_term_b != 0 local __coef : display %9.2e __ewiz_term_b
if !_rc {
capture local __se : display %9.4f __ewiz_term_se
capture if abs(__ewiz_term_se) < 0.00005 & __ewiz_term_se != 0 local __se : display %9.2e __ewiz_term_se
local __p = .
local __stars ""
capture local __df = e(df_r)
capture local __z = abs(_b[`model_term'] / _se[`model_term'])
if !_rc {
if "`__df'"=="" | "`__df'"=="." local __p = 2*(1-normal(`__z'))
else local __p = 2*ttail(`__df', `__z')
}
if !_rc local __stars = cond(`__p'<0.01,"***",cond(`__p'<0.05,"**",cond(`__p'<0.1,"*","")))
local cell_b2_`v' "`__coef'`__stars'"
local secell_b2_`v' "(`__se')"
}
}
}
di "(2): `ivvar'=`coefmain_b2'`starsmain_b2' (se=`semain_b2', p=`pmain_b2'), N=`N_b2', R2=`R2_b2'"
preserve
quietly areg `dvvar' `ivvar' roa lev size growth cashflow tobinq top1 dual board indep soe age, absorb(`absorb_id') vce(robust)
restore
capture local N_b3 : display %12.0f e(N)
if "`N_b3'"=="" local N_b3 = .
capture local R2_b3 : display %9.4f e(r2)
if "`R2_b3'"=="" local R2_b3 = .
capture scalar __ewiz_main_b_b3 = _b[`ivvar']
capture scalar __ewiz_main_se_b3 = _se[`ivvar']
capture local coefmain_b3 : display %9.4f __ewiz_main_b_b3
capture if abs(__ewiz_main_b_b3) < 0.00005 & __ewiz_main_b_b3 != 0 local coefmain_b3 : display %9.2e __ewiz_main_b_b3
capture local semain_b3 : display %9.4f __ewiz_main_se_b3
capture if abs(__ewiz_main_se_b3) < 0.00005 & __ewiz_main_se_b3 != 0 local semain_b3 : display %9.2e __ewiz_main_se_b3
local pmain_b3 = .
local starsmain_b3 ""
local __ewiz_model_valid_b3 = 1
capture scalar __ewiz_coef_abs_b3 = abs(_b[`ivvar'])
if _rc local __ewiz_model_valid_b3 = 0
capture scalar __ewiz_se_abs_b3 = abs(_se[`ivvar'])
if _rc local __ewiz_model_valid_b3 = 0
capture if scalar(__ewiz_se_abs_b3) <= 1e-12 local __ewiz_model_valid_b3 = 0
capture if scalar(__ewiz_coef_abs_b3) <= 1e-12 & scalar(__ewiz_se_abs_b3) <= 1e-12 local __ewiz_model_valid_b3 = 0
capture local __df_b3 = e(df_r)
capture local __z_b3 = abs(_b[`ivvar'] / _se[`ivvar'])
if !_rc & `__ewiz_model_valid_b3' == 1 {
if "`__df_b3'"=="" | "`__df_b3'"=="." local pmain_b3 = 2*(1-normal(`__z_b3'))
else local pmain_b3 = 2*ttail(`__df_b3', `__z_b3')
}
if `__ewiz_model_valid_b3' == 1 local starsmain_b3 = cond(`pmain_b3'<0.01,"***",cond(`pmain_b3'<0.05,"**",cond(`pmain_b3'<0.1,"*","")))
if `__ewiz_model_valid_b3' == 1 {
capture post `ewiz_sum' ("(3)") (_b[`ivvar']) (_se[`ivvar']) (`pmain_b3') ("`starsmain_b3'") (`N_b3') (`R2_b3')
if _rc post `ewiz_sum' ("(3)") (.) (.) (.) ("") (`N_b3') (`R2_b3')
}
else post `ewiz_sum' ("(3)") (.) (.) (.) ("") (`N_b3') (`R2_b3')
if `__ewiz_model_valid_b3' == 1 {
local __included_vars "`ivvar' dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age"
foreach v of local allvars {
local __is_included = 0
foreach __inc of local __included_vars {
if "`v'" == "`__inc'" local __is_included = 1
}
if `__is_included' == 0 continue
local model_term "`v'"
if "`v'" == "`ivvar'" local model_term "`ivvar'"
capture scalar __ewiz_term_b = _b[`model_term']
capture scalar __ewiz_term_se = _se[`model_term']
if _rc | missing(__ewiz_term_se) | __ewiz_term_se <= 1e-12 {
local cell_b3_`v' "omitted"
local secell_b3_`v' "(absorbed)"
continue
}
capture local __coef : display %9.4f __ewiz_term_b
capture if abs(__ewiz_term_b) < 0.00005 & __ewiz_term_b != 0 local __coef : display %9.2e __ewiz_term_b
if !_rc {
capture local __se : display %9.4f __ewiz_term_se
capture if abs(__ewiz_term_se) < 0.00005 & __ewiz_term_se != 0 local __se : display %9.2e __ewiz_term_se
local __p = .
local __stars ""
capture local __df = e(df_r)
capture local __z = abs(_b[`model_term'] / _se[`model_term'])
if !_rc {
if "`__df'"=="" | "`__df'"=="." local __p = 2*(1-normal(`__z'))
else local __p = 2*ttail(`__df', `__z')
}
if !_rc local __stars = cond(`__p'<0.01,"***",cond(`__p'<0.05,"**",cond(`__p'<0.1,"*","")))
local cell_b3_`v' "`__coef'`__stars'"
local secell_b3_`v' "(`__se')"
}
}
}
di "(3): `ivvar'=`coefmain_b3'`starsmain_b3' (se=`semain_b3', p=`pmain_b3'), N=`N_b3', R2=`R2_b3'"
preserve
quietly areg `dvvar' `ivvar' roa lev size growth cashflow tobinq top1 dual board indep soe age i.`fe_time', absorb(`absorb_id') vce(robust)
restore
capture local N_b4 : display %12.0f e(N)
if "`N_b4'"=="" local N_b4 = .
capture local R2_b4 : display %9.4f e(r2)
if "`R2_b4'"=="" local R2_b4 = .
capture scalar __ewiz_main_b_b4 = _b[`ivvar']
capture scalar __ewiz_main_se_b4 = _se[`ivvar']
capture local coefmain_b4 : display %9.4f __ewiz_main_b_b4
capture if abs(__ewiz_main_b_b4) < 0.00005 & __ewiz_main_b_b4 != 0 local coefmain_b4 : display %9.2e __ewiz_main_b_b4
capture local semain_b4 : display %9.4f __ewiz_main_se_b4
capture if abs(__ewiz_main_se_b4) < 0.00005 & __ewiz_main_se_b4 != 0 local semain_b4 : display %9.2e __ewiz_main_se_b4
local pmain_b4 = .
local starsmain_b4 ""
local __ewiz_model_valid_b4 = 1
capture scalar __ewiz_coef_abs_b4 = abs(_b[`ivvar'])
if _rc local __ewiz_model_valid_b4 = 0
capture scalar __ewiz_se_abs_b4 = abs(_se[`ivvar'])
if _rc local __ewiz_model_valid_b4 = 0
capture if scalar(__ewiz_se_abs_b4) <= 1e-12 local __ewiz_model_valid_b4 = 0
capture if scalar(__ewiz_coef_abs_b4) <= 1e-12 & scalar(__ewiz_se_abs_b4) <= 1e-12 local __ewiz_model_valid_b4 = 0
capture local __df_b4 = e(df_r)
capture local __z_b4 = abs(_b[`ivvar'] / _se[`ivvar'])
if !_rc & `__ewiz_model_valid_b4' == 1 {
if "`__df_b4'"=="" | "`__df_b4'"=="." local pmain_b4 = 2*(1-normal(`__z_b4'))
else local pmain_b4 = 2*ttail(`__df_b4', `__z_b4')
}
if `__ewiz_model_valid_b4' == 1 local starsmain_b4 = cond(`pmain_b4'<0.01,"***",cond(`pmain_b4'<0.05,"**",cond(`pmain_b4'<0.1,"*","")))
if `__ewiz_model_valid_b4' == 1 {
capture post `ewiz_sum' ("(4)") (_b[`ivvar']) (_se[`ivvar']) (`pmain_b4') ("`starsmain_b4'") (`N_b4') (`R2_b4')
if _rc post `ewiz_sum' ("(4)") (.) (.) (.) ("") (`N_b4') (`R2_b4')
}
else post `ewiz_sum' ("(4)") (.) (.) (.) ("") (`N_b4') (`R2_b4')
if `__ewiz_model_valid_b4' == 1 {
local __included_vars "`ivvar' dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age"
foreach v of local allvars {
local __is_included = 0
foreach __inc of local __included_vars {
if "`v'" == "`__inc'" local __is_included = 1
}
if `__is_included' == 0 continue
local model_term "`v'"
if "`v'" == "`ivvar'" local model_term "`ivvar'"
capture scalar __ewiz_term_b = _b[`model_term']
capture scalar __ewiz_term_se = _se[`model_term']
if _rc | missing(__ewiz_term_se) | __ewiz_term_se <= 1e-12 {
local cell_b4_`v' "omitted"
local secell_b4_`v' "(absorbed)"
continue
}
capture local __coef : display %9.4f __ewiz_term_b
capture if abs(__ewiz_term_b) < 0.00005 & __ewiz_term_b != 0 local __coef : display %9.2e __ewiz_term_b
if !_rc {
capture local __se : display %9.4f __ewiz_term_se
capture if abs(__ewiz_term_se) < 0.00005 & __ewiz_term_se != 0 local __se : display %9.2e __ewiz_term_se
local __p = .
local __stars ""
capture local __df = e(df_r)
capture local __z = abs(_b[`model_term'] / _se[`model_term'])
if !_rc {
if "`__df'"=="" | "`__df'"=="." local __p = 2*(1-normal(`__z'))
else local __p = 2*ttail(`__df', `__z')
}
if !_rc local __stars = cond(`__p'<0.01,"***",cond(`__p'<0.05,"**",cond(`__p'<0.1,"*","")))
local cell_b4_`v' "`__coef'`__stars'"
local secell_b4_`v' "(`__se')"
}
}
}
di "(4): `ivvar'=`coefmain_b4'`starsmain_b4' (se=`semain_b4', p=`pmain_b4'), N=`N_b4', R2=`R2_b4'"
postclose `ewiz_sum'
capture file close f_base
file open f_base using "$JOB_DIR/regression_table_基准回归.csv", write replace
file write f_base "变量,(1),(2),(3),(4)" _n
file write f_base ",OLS,OLS + Controls,个体固定效应,个体固定效应 + 时间固定效应" _n
file write f_base "dfi_index,`cell_b1_dfi_index',`cell_b2_dfi_index',`cell_b3_dfi_index',`cell_b4_dfi_index'" _n
file write f_base ",`secell_b1_dfi_index',`secell_b2_dfi_index',`secell_b3_dfi_index',`secell_b4_dfi_index'" _n
file write f_base "roa,`cell_b1_roa',`cell_b2_roa',`cell_b3_roa',`cell_b4_roa'" _n
file write f_base ",`secell_b1_roa',`secell_b2_roa',`secell_b3_roa',`secell_b4_roa'" _n
file write f_base "lev,`cell_b1_lev',`cell_b2_lev',`cell_b3_lev',`cell_b4_lev'" _n
file write f_base ",`secell_b1_lev',`secell_b2_lev',`secell_b3_lev',`secell_b4_lev'" _n
file write f_base "size,`cell_b1_size',`cell_b2_size',`cell_b3_size',`cell_b4_size'" _n
file write f_base ",`secell_b1_size',`secell_b2_size',`secell_b3_size',`secell_b4_size'" _n
file write f_base "growth,`cell_b1_growth',`cell_b2_growth',`cell_b3_growth',`cell_b4_growth'" _n
file write f_base ",`secell_b1_growth',`secell_b2_growth',`secell_b3_growth',`secell_b4_growth'" _n
file write f_base "cashflow,`cell_b1_cashflow',`cell_b2_cashflow',`cell_b3_cashflow',`cell_b4_cashflow'" _n
file write f_base ",`secell_b1_cashflow',`secell_b2_cashflow',`secell_b3_cashflow',`secell_b4_cashflow'" _n
file write f_base "tobinq,`cell_b1_tobinq',`cell_b2_tobinq',`cell_b3_tobinq',`cell_b4_tobinq'" _n
file write f_base ",`secell_b1_tobinq',`secell_b2_tobinq',`secell_b3_tobinq',`secell_b4_tobinq'" _n
file write f_base "top1,`cell_b1_top1',`cell_b2_top1',`cell_b3_top1',`cell_b4_top1'" _n
file write f_base ",`secell_b1_top1',`secell_b2_top1',`secell_b3_top1',`secell_b4_top1'" _n
file write f_base "dual,`cell_b1_dual',`cell_b2_dual',`cell_b3_dual',`cell_b4_dual'" _n
file write f_base ",`secell_b1_dual',`secell_b2_dual',`secell_b3_dual',`secell_b4_dual'" _n
file write f_base "board,`cell_b1_board',`cell_b2_board',`cell_b3_board',`cell_b4_board'" _n
file write f_base ",`secell_b1_board',`secell_b2_board',`secell_b3_board',`secell_b4_board'" _n
file write f_base "indep,`cell_b1_indep',`cell_b2_indep',`cell_b3_indep',`cell_b4_indep'" _n
file write f_base ",`secell_b1_indep',`secell_b2_indep',`secell_b3_indep',`secell_b4_indep'" _n
file write f_base "soe,`cell_b1_soe',`cell_b2_soe',`cell_b3_soe',`cell_b4_soe'" _n
file write f_base ",`secell_b1_soe',`secell_b2_soe',`secell_b3_soe',`secell_b4_soe'" _n
file write f_base "age,`cell_b1_age',`cell_b2_age',`cell_b3_age',`cell_b4_age'" _n
file write f_base ",`secell_b1_age',`secell_b2_age',`secell_b3_age',`secell_b4_age'" _n
file write f_base "核心解释变量口径,dfi_index,dfi_index,dfi_index,dfi_index" _n
file write f_base "估计模型,OLS/FE,OLS/FE,OLS/FE,OLS/FE" _n
file write f_base "控制变量,否,是,是,是" _n
file write f_base "个体固定效应,否,否,是,是" _n
file write f_base "时间固定效应,否,否,否,是" _n
file write f_base "聚类标准误,稳健标准误,稳健标准误,稳健标准误,稳健标准误" _n
file write f_base "N,`N_b1',`N_b2',`N_b3',`N_b4'" _n
file write f_base "R²,`R2_b1',`R2_b2',`R2_b3',`R2_b4'" _n
file close f_base
capture file close f_trip
file open f_trip using "$JOB_DIR/回归结果三线表.csv", write replace
file write f_trip "变量,(1),(2),(3),(4)" _n
file write f_trip ",OLS,OLS + Controls,个体固定效应,个体固定效应 + 时间固定效应" _n
file write f_trip "dfi_index,`cell_b1_dfi_index',`cell_b2_dfi_index',`cell_b3_dfi_index',`cell_b4_dfi_index'" _n
file write f_trip ",`secell_b1_dfi_index',`secell_b2_dfi_index',`secell_b3_dfi_index',`secell_b4_dfi_index'" _n
file write f_trip "roa,`cell_b1_roa',`cell_b2_roa',`cell_b3_roa',`cell_b4_roa'" _n
file write f_trip ",`secell_b1_roa',`secell_b2_roa',`secell_b3_roa',`secell_b4_roa'" _n
file write f_trip "lev,`cell_b1_lev',`cell_b2_lev',`cell_b3_lev',`cell_b4_lev'" _n
file write f_trip ",`secell_b1_lev',`secell_b2_lev',`secell_b3_lev',`secell_b4_lev'" _n
file write f_trip "size,`cell_b1_size',`cell_b2_size',`cell_b3_size',`cell_b4_size'" _n
file write f_trip ",`secell_b1_size',`secell_b2_size',`secell_b3_size',`secell_b4_size'" _n
file write f_trip "growth,`cell_b1_growth',`cell_b2_growth',`cell_b3_growth',`cell_b4_growth'" _n
file write f_trip ",`secell_b1_growth',`secell_b2_growth',`secell_b3_growth',`secell_b4_growth'" _n
file write f_trip "cashflow,`cell_b1_cashflow',`cell_b2_cashflow',`cell_b3_cashflow',`cell_b4_cashflow'" _n
file write f_trip ",`secell_b1_cashflow',`secell_b2_cashflow',`secell_b3_cashflow',`secell_b4_cashflow'" _n
file write f_trip "tobinq,`cell_b1_tobinq',`cell_b2_tobinq',`cell_b3_tobinq',`cell_b4_tobinq'" _n
file write f_trip ",`secell_b1_tobinq',`secell_b2_tobinq',`secell_b3_tobinq',`secell_b4_tobinq'" _n
file write f_trip "top1,`cell_b1_top1',`cell_b2_top1',`cell_b3_top1',`cell_b4_top1'" _n
file write f_trip ",`secell_b1_top1',`secell_b2_top1',`secell_b3_top1',`secell_b4_top1'" _n
file write f_trip "dual,`cell_b1_dual',`cell_b2_dual',`cell_b3_dual',`cell_b4_dual'" _n
file write f_trip ",`secell_b1_dual',`secell_b2_dual',`secell_b3_dual',`secell_b4_dual'" _n
file write f_trip "board,`cell_b1_board',`cell_b2_board',`cell_b3_board',`cell_b4_board'" _n
file write f_trip ",`secell_b1_board',`secell_b2_board',`secell_b3_board',`secell_b4_board'" _n
file write f_trip "indep,`cell_b1_indep',`cell_b2_indep',`cell_b3_indep',`cell_b4_indep'" _n
file write f_trip ",`secell_b1_indep',`secell_b2_indep',`secell_b3_indep',`secell_b4_indep'" _n
file write f_trip "soe,`cell_b1_soe',`cell_b2_soe',`cell_b3_soe',`cell_b4_soe'" _n
file write f_trip ",`secell_b1_soe',`secell_b2_soe',`secell_b3_soe',`secell_b4_soe'" _n
file write f_trip "age,`cell_b1_age',`cell_b2_age',`cell_b3_age',`cell_b4_age'" _n
file write f_trip ",`secell_b1_age',`secell_b2_age',`secell_b3_age',`secell_b4_age'" _n
file write f_trip "核心解释变量口径,dfi_index,dfi_index,dfi_index,dfi_index" _n
file write f_trip "估计模型,OLS/FE,OLS/FE,OLS/FE,OLS/FE" _n
file write f_trip "控制变量,否,是,是,是" _n
file write f_trip "个体固定效应,否,否,是,是" _n
file write f_trip "时间固定效应,否,否,否,是" _n
file write f_trip "聚类标准误,稳健标准误,稳健标准误,稳健标准误,稳健标准误" _n
file write f_trip "N,`N_b1',`N_b2',`N_b3',`N_b4'" _n
file write f_trip "R²,`R2_b1',`R2_b2',`R2_b3',`R2_b4'" _n
file close f_trip
preserve
use `ewiz_summary', clear
export delimited using "$JOB_DIR/regression_table.csv", replace
drop if missing(coef)
if _N == 0 {
capture file close f_base
tempname __ewz_skipfh
file open `__ewz_skipfh' using "$JOB_DIR/regression_table_基准回归.csv", write replace
file write `__ewz_skipfh' "状态,值" _n
file write `__ewz_skipfh' "状态,skipped" _n
file write `__ewz_skipfh' "原因,所有规格估计失败(被解释变量无变异 / 控制变量完美共线 / 样本量不足等),无法生成有效回归表" _n
file close `__ewz_skipfh'
di as error "[regression] all specs degenerate; wrote skipped marker"
}
if _N > 0 {
gen spec_order = _n
gen lb = coef - 1.96 * se
gen ub = coef + 1.96 * se
twoway (rcap ub lb spec_order, lcolor(gs8)) (scatter coef spec_order, mcolor(navy) msymbol(D)), yline(0, lpattern(dash) lcolor(maroon)) xlabel(1 "(1)" 2 "(2)" 3 "(3)" 4 "(4)", angle(45) labsize(small)) xtitle("Specification") ytitle("Coefficient on `ivvar'") title("Specification Comparison")
capture graph export "$JOB_DIR/baseline_coef_plot.png", replace width(1800)
}
restore
di "[EWIZ_STATS] target=dfi_index;coef=`coefmain_b4';se=`semain_b4';pvalue=`pmain_b4';nobs=`N_b4'"
di "回归表输出完成"
log close
实际输出表
这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。
| 变量 | (1) | (2) | (3) | (4) |
|---|---|---|---|---|
| OLS | OLS + Controls | 个体固定效应 | 个体固定效应 + 时间固定效应 | |
| dfi_index | 0.5835*** | 0.5709*** | 0.5671*** | 0.5660*** |
| ( 0.0426) | ( 0.0409) | ( 0.0459) | ( 0.0460) | |
| roa | 0.3016*** | 0.3059*** | 0.3040*** | |
| ( 0.0407) | ( 0.0446) | ( 0.0449) | ||
| lev | -0.0141 | -0.0509 | -0.0548 | |
| ( 0.0436) | ( 0.0469) | ( 0.0473) | ||
| size | 0.2278*** | 0.2377*** | 0.2375*** | |
| ( 0.0403) | ( 0.0461) | ( 0.0461) | ||
| growth | -0.0462 | -0.0849* | -0.0819 | |
| ( 0.0433) | ( 0.0503) | ( 0.0509) | ||
| cashflow | 0.0441 | 0.0423 | 0.0407 | |
| ( 0.0419) | ( 0.0456) | ( 0.0456) | ||
| tobinq | 0.0335 | 0.0246 | 0.0247 | |
| ( 0.0441) | ( 0.0485) | ( 0.0488) | ||
| top1 | -0.0310 | -0.0170 | -0.0166 | |
| ( 0.0450) | ( 0.0499) | ( 0.0498) | ||
| dual | -0.0025 | -0.0244 | -0.0272 | |
| ( 0.0424) | ( 0.0458) | ( 0.0459) | ||
| board | -0.0155 | -0.0396 | -0.0383 | |
| ( 0.0404) | ( 0.0447) | ( 0.0447) | ||
| indep | -0.0306 | -0.0282 | -0.0309 | |
| ( 0.0429) | ( 0.0488) | ( 0.0491) | ||
| soe | -0.0102 | 0.0015 | 0.0025 | |
| ( 0.0435) | ( 0.0501) | ( 0.0503) | ||
| age | -0.0151 | -0.0502 | -0.0539 | |
| ( 0.0423) | ( 0.0456) | ( 0.0450) | ||
| 核心解释变量口径 | dfi_index | dfi_index | dfi_index | dfi_index |
| 估计模型 | OLS/FE | OLS/FE | OLS/FE | OLS/FE |
| 控制变量 | 否 | 是 | 是 | 是 |
| 个体固定效应 | 否 | 否 | 是 | 是 |
| 时间固定效应 | 否 | 否 | 否 | 是 |
| 聚类标准误 | 稳健标准误 | 稳健标准误 | 稳健标准误 | 稳健标准误 |
| N | 720 | 720 | 720 | 720 |
| R² | 0.1932 | 0.2824 | 0.4069 | 0.4098 |
补充输出
下面这些文件来自同一次案例生成流程,用来补齐主表之外的诊断信息。
regression_table.csv
| spec | coef | se | pvalue | stars | N | R2 |
|---|---|---|---|---|---|---|
| (1) | .5834721605890186 | .042610165 | 4.3467875e-38 | *** | 720 | .19320001 |
| (2) | .5709054170767351 | .040931679 | 0 | *** | 720 | .28240001 |
| (3) | .5670792211042022 | .045913894 | 2.5794169e-31 | *** | 720 | .40689999 |
| (4) | .5660408387964105 | .04600032 | 4.3109577e-31 | *** | 720 | .40979999 |
回归结果三线表.csv
| 变量 | (1) | (2) | (3) | (4) |
|---|---|---|---|---|
| OLS | OLS + Controls | 个体固定效应 | 个体固定效应 + 时间固定效应 | |
| dfi_index | 0.5835*** | 0.5709*** | 0.5671*** | 0.5660*** |
| ( 0.0426) | ( 0.0409) | ( 0.0459) | ( 0.0460) | |
| roa | 0.3016*** | 0.3059*** | 0.3040*** | |
| ( 0.0407) | ( 0.0446) | ( 0.0449) | ||
| lev | -0.0141 | -0.0509 | -0.0548 | |
| ( 0.0436) | ( 0.0469) | ( 0.0473) | ||
| size | 0.2278*** | 0.2377*** | 0.2375*** | |
| ( 0.0403) | ( 0.0461) | ( 0.0461) | ||
| growth | -0.0462 | -0.0849* | -0.0819 | |
| ( 0.0433) | ( 0.0503) | ( 0.0509) | ||
| cashflow | 0.0441 | 0.0423 | 0.0407 | |
| ( 0.0419) | ( 0.0456) | ( 0.0456) | ||
| tobinq | 0.0335 | 0.0246 | 0.0247 | |
| ( 0.0441) | ( 0.0485) | ( 0.0488) | ||
| top1 | -0.0310 | -0.0170 | -0.0166 | |
| ( 0.0450) | ( 0.0499) | ( 0.0498) | ||
| dual | -0.0025 | -0.0244 | -0.0272 | |
| ( 0.0424) | ( 0.0458) | ( 0.0459) | ||
| board | -0.0155 | -0.0396 | -0.0383 | |
| ( 0.0404) | ( 0.0447) | ( 0.0447) | ||
| indep | -0.0306 | -0.0282 | -0.0309 | |
| ( 0.0429) | ( 0.0488) | ( 0.0491) | ||
| soe | -0.0102 | 0.0015 | 0.0025 | |
| ( 0.0435) | ( 0.0501) | ( 0.0503) | ||
| age | -0.0151 | -0.0502 | -0.0539 | |
| ( 0.0423) | ( 0.0456) | ( 0.0450) | ||
| 核心解释变量口径 | dfi_index | dfi_index | dfi_index | dfi_index |
| 估计模型 | OLS/FE | OLS/FE | OLS/FE | OLS/FE |
| 控制变量 | 否 | 是 | 是 | 是 |
| 个体固定效应 | 否 | 否 | 是 | 是 |
| 时间固定效应 | 否 | 否 | 否 | 是 |
| 聚类标准误 | 稳健标准误 | 稳健标准误 | 稳健标准误 | 稳健标准误 |
| N | 720 | 720 | 720 | 720 |
| R² | 0.1932 | 0.2824 | 0.4069 | 0.4098 |
案例图
这是一张由同一份案例数据生成的页面内诊断图。

论文里怎么写
本文在共用企业面板样本上报告基准回归,核心输出见 regression_table_基准回归.csv。结果解释时同时关注样本口径、变量构造、系数方向、标准误和适用前提,避免只凭单个 p 值完成方法选择。
检查清单
- 先读最终主规格列,而不是把最简单的一列当论文结论。
- 每增加控制变量、固定效应或聚类标准误,都要看核心系数方向和量级是否突变。
- 解释核心系数时同时说经济含义和统计推断,不能只写显著或不显著。