实证方法教程 / correlation

相关性矩阵

Pearson 不等于相关性的全部

这节课解决什么用于进入模型前确认样本、变量、分布和基础诊断是否可信。
先准备哪些变量变量含义清楚
会看到哪张表相关系数矩阵.csv
论文里怎么克制解释正文只报告和主模型相关的关键口径;完整清洗记录放到附录或复现包。

相关性矩阵是什么?

相关矩阵只回答两个变量是否一起变化。它能帮助初步判断变量方向、共线性风险和数据是否反常,但它不控制其他变量,也不能证明因果。

先用一句话理解

把相关矩阵想成变量之间的合影。两个人总是一起出现在照片里,并不说明一个人导致另一个人出现;它只能提示关系方向和强弱,真正的主结论还要回到回归模型。

什么时候用

判断项教科书式判断
适合用在描述变量之间的初步关系,检查核心变量方向是否和理论完全相反。
先不要用在想控制其他因素、固定效应或识别因果效应时。
最关键的前提变量量纲和异常值已处理,否则相关系数会被极端值带偏。
读表顺序先看核心变量与因变量,再看控制变量之间是否高度相关。
论文表述边界只能写相关关系,不能用相关系数替代主回归。

把它和相近方法分清楚

容易混淆的对象怎么区分初学者记法
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

实际输出表

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

variablepatent_countdfi_indexroalevsizegrowthcashflowtobinqtop1dual
patent_count1.43950948.24073994.013024604.17620607-.027265593.033593308.019011619-.032499224.0060554333
dfi_index.439509481.010009783.0087096244.03340555-.021365453.012453728-.0013975492-.0043962095-.0011652668
roa.24073994.0100097831.026359176-.039585255.044941634.02670249.015529391-.0061969026.025583275
lev.013024604.0087096244.0263591761.070986755-.027704539.020903539.041491505.0043391068.00078530196
size.17620607.03340555-.039585255.0709867551.0048936065-.062741034-.030523267-.033124272.010508359
growth-.027265593-.021365453.044941634-.027704539.00489360651-.012840015.042992894-.01781022.0097842375
cashflow.033593308.012453728.02670249.020903539-.062741034-.0128400151-.016293354.013908384.056830361
tobinq.019011619-.0013975492.015529391.041491505-.030523267.042992894-.0162933541-.0075492994-.0093645761
top1-.032499224-.0043962095-.0061969026.0043391068-.033124272-.01781022.013908384-.00754929941.01563069
dual.0060554333-.0011652668.025583275.00078530196.010508359.0097842375.056830361-.0093645761.015630691

案例图

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

相关分析 的共用案例输出图。
相关分析 的共用案例输出图。

论文里怎么写

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

检查清单

  • 先区分 Pearson 和 Spearman:前者看线性同动,后者看排序同动。
  • 重点检查控制变量之间是否有过高相关,而不是只看核心变量那一格。
  • 相关显著不能写成因果显著;它只是后续回归前的描述性证据。

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