相关性矩阵是什么?
相关矩阵只回答两个变量是否一起变化。它能帮助初步判断变量方向、共线性风险和数据是否反常,但它不控制其他变量,也不能证明因果。
先用一句话理解
把相关矩阵想成变量之间的合影。两个人总是一起出现在照片里,并不说明一个人导致另一个人出现;它只能提示关系方向和强弱,真正的主结论还要回到回归模型。
什么时候用
| 判断项 | 教科书式判断 |
|---|---|
| 适合用在 | 描述变量之间的初步关系,检查核心变量方向是否和理论完全相反。 |
| 先不要用在 | 想控制其他因素、固定效应或识别因果效应时。 |
| 最关键的前提 | 变量量纲和异常值已处理,否则相关系数会被极端值带偏。 |
| 读表顺序 | 先看核心变量与因变量,再看控制变量之间是否高度相关。 |
| 论文表述边界 | 只能写相关关系,不能用相关系数替代主回归。 |
把它和相近方法分清楚
| 容易混淆的对象 | 怎么区分 | 初学者记法 |
|---|---|---|
| Pearson | 衡量线性相关,对极端值敏感。 | 适合连续变量的初步方向检查。 |
| Spearman | 衡量秩相关,对极端值更稳。 | 适合右偏或非线性单调关系。 |
| 回归系数 | 控制其他变量后的条件关系。 | 不能用相关系数替代。 |
核心直觉和模型公式
Pearson 相关系数
Pearson 相关系数可以写成:
\[r_{xy}=\frac{\sum_i(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_i(x_i-\bar{x})^2}\sqrt{\sum_i(y_i-\bar{y})^2}}\]
r 的取值在 -1 到 1 之间,正负表示同向或反向,绝对值表示线性同动强弱。
公式里的符号怎么读
| 符号 | 含义 | 在本页怎么理解 |
|---|---|---|
| x_i / y_i | 两个变量的观测值 | 例如数字金融指数和企业创新。 |
| x_bar / y_bar | 变量均值 | 用来衡量每个观测相对平均水平的偏离。 |
| r_xy | 相关系数 | 两个变量线性同动的方向和强弱。 |
| r > 0 | 正相关 | 一个变量高时,另一个变量通常也高。 |
| r < 0 | 负相关 | 一个变量高时,另一个变量通常较低。 |
专业使用口径
专业相关矩阵是回归前的诊断,不是论文主结果。
| 口径 | 专业写法 |
|---|---|
| 核心方向 | 核心变量和因变量方向若完全反常,要回头检查变量定义。 |
| 控制变量相关 | 控制变量之间接近 0.8 或 0.9 时,要进一步看 VIF。 |
| 显著性星号 | 相关矩阵的星号只说明两两相关,不代表控制后仍成立。 |
| 异常值 | 极端值会扭曲 Pearson,可补 Spearman 或 winsor 后对照。 |
一步一步做:从问题到结果的五步
| 步骤 | 这一页具体做什么 | 做到什么程度才算读懂 |
|---|---|---|
| 1. 先清理变量 | 处理缺失码、异常值和量纲问题。 | 脏数据会直接污染相关系数。 |
| 2. 选择相关口径 | 连续变量常用 Pearson,右偏变量可补 Spearman。 | 口径要和变量特征匹配。 |
| 3. 读核心变量对 | 先看 Y 与 X 的方向和大致强弱。 | 方向反常时先检查定义。 |
| 4. 查控制变量相关 | 寻找明显高度相关的一组控制变量。 | 高相关提示共线性风险。 |
| 5. 写成诊断语言 | 只说变量之间存在同向或反向相关。 | 不要写成因果。 |
结果怎么读:先读口径,再读数字
本页案例读表时,先记住这个口径:Patent 与 DFI 的相关系数是 .43950948;这只能说明二者同向变化,不能直接写成因果关系。
| 读表顺序 | 本页怎么读 | 不要这样读 |
|---|---|---|
| 先看方向 | 正负号是否符合理论和变量定义。 | 不要只看星号。 |
| 再看大小 | 相关系数越接近 1 或 -1,线性同动越强。 | 小相关不代表回归一定不显著。 |
| 然后看控制变量之间 | 高度相关会提示共线性。 | 相关矩阵不是 VIF 的替代品。 |
| 最后看边界 | 两两相关没有控制变量。 | 不要把它写成主结论。 |
初学者最容易错在哪里
| 误读 | 为什么错 |
|---|---|
| 相关等于因果 | 错。相关矩阵没有识别设计。 |
| 用相关矩阵替代回归 | 错。它不控制任何变量。 |
| 看到星号就写假设成立 | 错。两两相关显著不代表主模型成立。 |
| 忽略变量方向定义 | 错。变量编码反向会让相关解释完全相反。 |
先看这个案例的结论
- Patent 与 DFI 的相关系数是 .43950948;这只能说明二者同向变化,不能直接写成因果关系。
- 相关矩阵里更重要的是排查控制变量之间是否存在过高相关,而不是只看核心变量一格。
- 如果 Pearson 和 Spearman 差异很大,通常说明变量有右偏、极端值或非线性单调关系,需要在正文里解释。
变量要求和案例口径
| 字段 | 口径 |
|---|---|
| 数据 | 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 |
| 输出文件 | 相关系数矩阵.csv |
| 角色要求 | 无硬性角色要求 |
| 依赖包 | 无额外 Stata 社区包要求 |
实际代码
下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。
log using "/root/workspace/empirical-wizard/workspace/5b186599/analysis.log", replace text
global JOB_DIR "/root/workspace/empirical-wizard/workspace/5b186599"
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 statvars "patent_count dfi_index roa lev size growth cashflow tobinq top1 dual"
local timevar "year"
local idvar "stkcd"
local dvvar "patent_count"
local ivvar "dfi_index"
tempfile ewiz_desc
tempname ewiz_post
postfile `ewiz_post' str64 variable double count mean sd min p25 p50 p75 max using `ewiz_desc', replace
foreach v of local statvars {
capture confirm numeric variable `v'
if !_rc {
quietly summarize `v', detail
post `ewiz_post' ("`v'") (r(N)) (r(mean)) (r(sd)) (r(min)) (r(p25)) (r(p50)) (r(p75)) (r(max))
}
}
postclose `ewiz_post'
preserve
use `ewiz_desc', clear
rename count N
export delimited using "$JOB_DIR/描述性统计.csv", replace
restore
quietly pwcorr `statvars', sig
matrix EWIZ_C = r(C)
matrix EWIZ_P = r(sig)
local nvars : word count `statvars'
preserve
clear
set obs `nvars'
gen str64 variable = ""
forvalues i = 1/`nvars' {
local vname : word `i' of `statvars'
replace variable = "`vname'" in `i'
}
forvalues j = 1/`nvars' {
gen c`j' = .
}
forvalues i = 1/`nvars' {
forvalues j = 1/`nvars' {
replace c`j' = EWIZ_C[`i', `j'] in `i'
}
}
forvalues j = 1/`nvars' {
local vname : word `j' of `statvars'
rename c`j' `vname'
}
export delimited using "$JOB_DIR/相关系数矩阵.csv", replace
restore
* 同时导出 p 值矩阵(上三角 p、下三角系数约定:这里直接把 p 矩阵单独导出
* 供 reporter 读取;渲染时组合成『下三角系数+星号 / 上三角 p』学术格式)
preserve
clear
set obs `nvars'
gen str64 variable = ""
forvalues i = 1/`nvars' {
local vname : word `i' of `statvars'
replace variable = "`vname'" in `i'
}
forvalues j = 1/`nvars' {
gen p`j' = .
}
forvalues i = 1/`nvars' {
forvalues j = 1/`nvars' {
capture replace p`j' = EWIZ_P[`i', `j'] in `i'
}
}
forvalues j = 1/`nvars' {
local vname : word `j' of `statvars'
rename p`j' `vname'
}
export delimited using "$JOB_DIR/相关系数矩阵_pvalue.csv", replace
restore
foreach v in `dvvar' `ivvar' {
if "`v'" != "" {
capture confirm numeric variable `v'
if !_rc {
quietly inspect `v'
local _nunique = r(N_unique)
quietly summarize `v', meanonly
local _vmin = r(min)
local _vmax = r(max)
// Treat as dummy ONLY when there are exactly 1-2 unique values AND they are 0/1.
if `_nunique' <= 2 & `_vmin' >= 0 & `_vmax' <= 1 & `_vmax' - `_vmin' <= 1 & `_vmax' == int(`_vmax') & `_vmin' == int(`_vmin') {
graph bar (mean) `v', title("`v' Distribution") ytitle("Share") blabel(bar, format(%9.3f))
}
else {
histogram `v', normal title("`v' Distribution") xtitle("`v'") ytitle("Frequency")
}
capture graph export "$JOB_DIR/distribution_`v'.png", replace width(1600)
}
}
}
if "`timevar'" != "" & "`dvvar'" != "" {
capture confirm variable `timevar'
if !_rc {
preserve
keep `timevar' patent_count dfi_index
collapse (mean) patent_count dfi_index, by(`timevar')
sort `timevar'
if "`ivvar'" != "" {
twoway (line `dvvar' `timevar', lcolor(navy) lwidth(medthick) msymbol(o)) (line `ivvar' `timevar', yaxis(2) lcolor(maroon) lpattern(dash) msymbol(diamond)), title("Core Variable Trends") xtitle("`timevar'") ytitle("`dvvar' mean", axis(1)) ytitle("`ivvar' mean", axis(2)) legend(order(1 "`dvvar'" 2 "`ivvar'"))
}
else {
twoway line `dvvar' `timevar', lcolor(navy) lwidth(medthick) msymbol(o) title("Outcome Trend") xtitle("`timevar'") ytitle("`dvvar' mean")
}
capture graph export "$JOB_DIR/descriptive_trend.png", replace width(1800)
restore
}
}
if "`idvar'" != "" & "`timevar'" != "" {
capture confirm variable `idvar'
capture confirm variable `timevar'
if !_rc {
preserve
collapse (count) obs_count=`timevar' (min) start_period=`timevar' (max) end_period=`timevar', by(`idvar')
export delimited using "$JOB_DIR/panel_structure.csv", replace
restore
}
}
di "描述性统计与相关分析输出完成"
log close
实际输出表
这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。
| variable | patent_count | dfi_index | roa | lev | size | growth | cashflow | tobinq | top1 | dual |
|---|---|---|---|---|---|---|---|---|---|---|
| patent_count | 1 | .43950948 | .24073994 | .013024604 | .17620607 | -.027265593 | .033593308 | .019011619 | -.032499224 | .0060554333 |
| dfi_index | .43950948 | 1 | .010009783 | .0087096244 | .03340555 | -.021365453 | .012453728 | -.0013975492 | -.0043962095 | -.0011652668 |
| roa | .24073994 | .010009783 | 1 | .026359176 | -.039585255 | .044941634 | .02670249 | .015529391 | -.0061969026 | .025583275 |
| lev | .013024604 | .0087096244 | .026359176 | 1 | .070986755 | -.027704539 | .020903539 | .041491505 | .0043391068 | .00078530196 |
| size | .17620607 | .03340555 | -.039585255 | .070986755 | 1 | .0048936065 | -.062741034 | -.030523267 | -.033124272 | .010508359 |
| growth | -.027265593 | -.021365453 | .044941634 | -.027704539 | .0048936065 | 1 | -.012840015 | .042992894 | -.01781022 | .0097842375 |
| cashflow | .033593308 | .012453728 | .02670249 | .020903539 | -.062741034 | -.012840015 | 1 | -.016293354 | .013908384 | .056830361 |
| tobinq | .019011619 | -.0013975492 | .015529391 | .041491505 | -.030523267 | .042992894 | -.016293354 | 1 | -.0075492994 | -.0093645761 |
| top1 | -.032499224 | -.0043962095 | -.0061969026 | .0043391068 | -.033124272 | -.01781022 | .013908384 | -.0075492994 | 1 | .01563069 |
| dual | .0060554333 | -.0011652668 | .025583275 | .00078530196 | .010508359 | .0097842375 | .056830361 | -.0093645761 | .01563069 | 1 |
案例图
这是一张由同一份案例数据生成的页面内诊断图。

论文里怎么写
本文在共用企业面板样本上报告相关分析,核心输出见 相关系数矩阵.csv。结果解释时同时关注样本口径、变量构造、系数方向、标准误和适用前提,避免只凭单个 p 值完成方法选择。
检查清单
- 先区分 Pearson 和 Spearman:前者看线性同动,后者看排序同动。
- 重点检查控制变量之间是否有过高相关,而不是只看核心变量那一格。
- 相关显著不能写成因果显著;它只是后续回归前的描述性证据。