非参 / 半参方法:核回归、局部多项式与部分线性模型
OOLS 假设 $Y = \alpha + \beta X + \varepsilon$——但真实世界里"教育回报率随经验年限怎么变"、"收入与污染的关系"往往不是直线。非参数估计(核回归、局部线性、样条)不假设函数形式,让数据自己说话;半参数模型(部分线性 PLM、变系数、可加模型 GAM)则保留一部分线性结构、只让关键变量走非参。本页讲清 Nadaraya–Watson 估计量的推导、局部线性估计为何能消除边界偏差、带宽选择的交叉验证,以及 Stata 与 Python 的完整实现。
01 是什么:非参与半参的分类谱
参数方法(OLS、Probit、GMM)预先把 $m(x)$ 的函数形式钉死——例如 $m(x)=\beta_0+\beta_1 x+\beta_2 x^2$。好处是估计量收敛快($\sqrt n$ 速率)、解释直接;坏处是如果真实 $m(x)$ 不是这个形状,所有系数都不可信。非参数方法不假设 $m(\cdot)$ 的形式,只要求它"足够光滑",让数据自己把曲线画出来。半参数方法折中:一部分变量走线性(保留解释性),另一部分走非参(保留灵活性)。
常见方法谱系:
- 核回归(Kernel regression):Nadaraya–Watson 估计量,用 $x$ 附近的 $Y_i$ 加权平均。
- 局部多项式回归(Local polynomial):在每个 $x$ 附近拟合一阶(局部线性)或二阶(局部二次)多项式,降低边界偏差。RDD 里的
rdrobust默认就是局部线性。 - 样条(Spline):把定义域切成段,每段用多项式拼接。
mkspline、回归样条在长面板/季节调整里常用。 - 部分线性模型 PLM(Partially Linear Model):$Y = X^\top\beta + g(Z) + \varepsilon$。$X$ 的系数 $\beta$ 有 $\sqrt n$ 速率,$g(\cdot)$ 非参。Robinson (1988) 提出的 "double residual" 估计量是经典。
- 变系数模型(Varying Coefficient Model):$\beta(Z)$ 随 $Z$ 平滑变化,Hastie–Tibshirani (1990)。
- 可加模型 GAM(Generalized Additive Model):$Y = \beta_0 + g_1(X_1) + g_2(X_2) + \cdots$。每个 $g_j$ 独立非参拟合,缓解维度灾难。
一个直观判断:如果你的论文里核心自变量与结果变量的散点图肉眼看不是直线(例如 U 形、S 形、阶梯形),就不该直接报 OLS 线性系数。此时要么用非参曲线展示形状,要么用半参模型把核心变量非参化、控制变量保持线性。本页代码同时给出 Stata(lpoly、npregress、semipar)与 Python(statsmodels)两套实现,建议在自己数据上各跑一遍对照。
方法对比速查表
| 方法 | 函数形式假设 | 收敛速率 | 解释性 | 典型用途 |
|---|---|---|---|---|
| OLS | 线性 | $\sqrt n$ | 系数直接解释 | 基准回归 |
| NW 核回归 | 无(光滑) | $n^{-2/5}$ | 只能画图 | 一维散点拟合 |
| 局部线性 LL | 无(光滑) | $n^{-2/5}$,边界偏差小 | 只能画图 | RDD、边界拟合 |
| PLM 部分线性 | 参数部分线性 + 非参 $g(Z)$ | 参数部分 $\sqrt n$ | $\beta$ 可解释 | 关键变量灵活、控制变量线性 |
| GAM 可加 | 可加分解 | 每维 $n^{-2/5}$ | 画图 + 可加性 | 多维但无交互 |
| 样条 | 分段多项式 | $\sqrt n$(knot 固定) | 段内斜率可读 | 长面板、季节调整 |
02 假设与原理:条件期望函数与核权重
核心模型假设:
我们要估计的就是条件期望函数 $m(x) = E[Y|X=x]$。直觉上:在点 $x$ 处,取所有离 $x$ "足够近"的观测,把它们的 $Y_i$ 平均一下,就是 $m(x)$ 的估计。关键问题是:多近算近?远近如何加权?
核函数 $K(\cdot)$ 就是一个把"距离"映射为"权重"的对称函数,要求 $\int K(u)du=1$、$K(u)=K(-u)\ge 0$。常用:
- Epanechnikov 核:$K(u)=\frac{3}{4}(1-u^2)\mathbb{1}[|u|\le 1]$,理论上最优(最小渐近 MSE)。
- Gaussian 核:$K(u)=\frac{1}{\sqrt{2\pi}}e^{-u^2/2}$,光滑无界,实务最常用。
- 三角核(Triangular):$K(u)=(1-|u|)\mathbb{1}[|u|\le 1]$,RDD 默认。
带宽 $h$ 控制"邻域大小"。偏差—方差权衡:
- $h$ 太小 → 每个点附近只有几个观测,方差大、曲线抖动。
- $h$ 太大 → 把远处不属于局部的关系也扯进来,偏差大、曲线被过度平滑成直线。
用均方误差 $MSE(x)=Bias^2(x)+Var(x)$ 量化:偏差 $\propto h^2$(二阶导数 $m''(x)$ 大小),方差 $\propto (nh)^{-1}$。二者平衡给出最优 $h^* \propto n^{-1/5}$。这一权衡与本页第 03 节 bunching 反事实多项式拟合中"多项式阶数 × excluded window"的选择在哲学上完全一致——灵活性 vs 稳定性是所有非参/半参方法的核心矛盾。
为什么经济学家需要非参?
实证论文的常见尴尬:OLS 跑出来 $\hat\beta$ 显著,但加一个 $X^2$ 或 $X^3$ 后系数就变号或消失。这说明你报告的"线性效应"可能只是函数形式误设的产物。非参曲线是一面照妖镜:把 $m(X)$ 画出来,如果真实形状是 U 形或阶梯形,OLS 的"平均效应"毫无政策含义。Yatchew (1998, JEL) 建议把非参图作为实证论文的"诊断步骤",而非最终结果——先画一条非参曲线判断函数形式,再决定要不要参数化。
03 完整推导:Nadaraya–Watson 与局部线性
Nadaraya–Watson 估计量
对任意点 $x$,核权重 $K_h(x-X_i) = \frac{1}{h}K\big(\frac{x-X_i}{h}\big)$。Nadaraya–Watson (NW) 估计量就是加权平均:
推导:由定义 $m(x)=E[Y|X=x]=\dfrac{\int y f(x,y)dy}{f_X(x)}$。分母用核密度估计 $\hat f_X(x)=\frac{1}{n}\sum_i K_h(x-X_i)$;分子用 $\frac{1}{n}\sum_i K_h(x-X_i)Y_i$ 估计 $\int y f(x,y)dy$。两者相除即得 Eq. 3.1。
局部线性估计(Local Linear, LL)
NW 的主要缺点是边界偏差大:在样本支撑区间的两端,$x$ 一侧没有数据,加权平均被"拉"向有数据的一侧。解决办法是在每个 $x$ 附近拟合一条局部直线:
解出的 $\hat\beta_0$ 就是 $\hat m_{LL}(x)$。局部线性自动修正边界处的一阶偏差,且在内部等价于 NW 加一个偏差修正项。Fan–Gijbels (1996) 证明局部线性在渐近 MSE 上几乎最优。
样条(Spline)与回归样条
除核回归外,样条是另一种主流非参工具。它把 $X$ 的定义域切成若干段(knots),每段用低次多项式拟合,段间在 knot 处保持连续(并要求一阶/二阶导数连续)。最常用的是三次样条(cubic spline)与光滑样条(smoothing spline)。Stata 里 mkspline 直接生成样条基变量,然后照常 OLS。样条与核回归的区别:核回归是"局部加权",样条是"分段多项式拼接";两者渐近性质一致,但样条对边界更敏感、knot 数量直接决定灵活度。
可加模型 GAM 与维度灾难的缓解
纯非参回归在 $d$ 维下收敛速率为 $n^{-2/(d+4)}$,$d=5$ 时即使 $n=10^5$ 也不够——这就是维度灾难(curse of dimensionality)。GAM 的聪明之处是把高维函数拆成一维函数之和:$m(X_1,\dots,X_d)=\beta_0+\sum_j g_j(X_j)$,每个 $g_j$ 独立非参拟合。这样每个 $g_j$ 仍是一维估计,收敛速率回到 $n^{-2/5}$。代价是假设各变量可加、无交互——若怀疑交互,可加两个变量的交互项 $g_{jk}(X_j,X_k)$。
带宽选择
理论上最优带宽(IMSE 最优):$h^* \propto n^{-1/5}$(一维核回归)。实务中两个选择器:
- 交叉验证 CV:$CV(h)=\frac{1}{n}\sum_i (Y_i - \hat m_{-i}(X_i))^2$,选 $h$ 最小化 CV。留一法避免过拟合。
- Silverman 经验法则:$h^* \approx 1.06\,\hat\sigma\, n^{-1/5}$,其中 $\hat\sigma$ 是 $X$ 的标准差。快速近似用。
04 逐步操作流程
05 完整代码(Stata + Python)
*==============================================================*
* 非参 / 半参回归演示:核回归、局部线性、PLM
* 情境:模拟 Y = sin(X) + 0.3*X + eps,看非参能否抓出非线性
*==============================================================*
clear all
set more off
set seed 20260911
* --- 1. 模拟数据 ---
set obs 1000
gen X = runiform()*4*_pi - 2*_pi // X ~ Uniform[-2pi, 2pi]
gen Z = rnormal() // PLM 中的非参变量
gen true_m = sin(X) + 0.3*Z // 真实 m(X) 与线性 Z 系数
gen Y = true_m + rnormal()*0.5
* --- 2. 非参核回归:lpoly(局部线性) ---
* 语法:lpoly Y X, width(h) gengrid n(100) ci
* 默认 Epanechnikov 核;width 为带宽
lpoly Y X, leg(order(2)) ///
ci /// 画 95% 置信带
bw cvplot /// 用 CV 选带宽并画 CV 曲线
graph(title("局部线性回归:Y 关于 X")) ///
ytitle("拟合值") xtitle("X")
graph export "lpoly_cv.png", replace
* --- 3. 多档带宽稳健性 ---
local h_default = 0.5
twoway (lpolyci Y X, fcolor(gs12%30) lcolor(navy)), ///
legend(off) title("带宽 = 0.5")
* 对比 0.25 与 1.0
lpoly Y X, at(X) bwidth(0.25) gen(y025)
lpoly Y X, at(X) bwidth(0.50) gen(y050)
lpoly Y X, at(X) bwidth(1.00) gen(y100)
twoway (line y025 X, sort lcolor(red)) ///
(line y050 X, sort lcolor(navy)) ///
(line y100 X, sort lcolor(orange)), ///
legend(label(1 "h=0.25") label(2 "h=0.50") label(3 "h=1.00")) ///
title("带宽敏感性:过小/适中/过大")
* --- 4. 部分线性模型 PLM:Robinson (1988) 残差法 ---
* 模型:Y = beta*Z + g(X) + eps
* 步骤:① 非参拟合 E[Y|X]、E[Z|X];② 残差化;③ OLS
lpoly Y X, at(X) bwidth(0.5) gen(E_Y)
lpoly Z X, at(X) bwidth(0.5) gen(E_Z)
gen tilde_Y = Y - E_Y
gen tilde_Z = Z - E_Z
reg tilde_Y tilde_Z
* tilde_Z 的系数就是 beta 的 Robinson 估计(渐近 sqrt-n 一致)
* 与 OLS 直接对比:
reg Y Z X
* 若 X 与 Z 相关、且 g(X) 非线性,OLS 会偏;PLM 一致
* --- 5. Stata 16+ 官方 npregress(更现代) ---
* npregress kernel Y X, kernel(epanechnikov) bw(cv)
* npregress series Y X, order(3) // 序列回归(多项式样条)
* 注意:npregress 是 Stata 16+ 内置,无需 ssc install
# ==============================================================
# 非参 / 半参:statsmodels KernelReg + 手写 Nadaraya-Watson
# ==============================================================
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.nonparametric.kernel_regression import KernelReg
from statsmodels.nonparametric.kde import KDEUnivariate
rng = np.random.default_rng(20260911)
# --- 1. 模拟数据:与 Stata 一致 ---
n = 1000
X = rng.uniform(-2*np.pi, 2*np.pi, n)
Z = rng.normal(size=n)
true_m = np.sin(X) + 0.3*Z
Y = true_m + rng.normal(scale=0.5, size=n)
# --- 2. statsmodels 核回归(局部线性,多维自动带宽) ---
# reg_type='ll' 局部线性;var_type='c' 连续变量
kr = KernelReg(endog=Y, exog=np.column_stack([X, Z]),
var_type='cc', reg_type='ll', bw='cv_ls')
m_hat, bw = kr.fit()
print("CV 选出的带宽 =", bw)
# --- 3. 手写 Nadaraya-Watson(便于理解) ---
def nw(x0, X, Y, h, kernel='gauss'):
u = (X - x0)/h
if kernel == 'gauss':
w = np.exp(-0.5*u**2)
else: # epanechnikov
w = np.where(np.abs(u) <= 1, 0.75*(1-u**2), 0.0)
return np.sum(w*Y)/np.sum(w)
grid = np.linspace(X.min(), X.max(), 200)
h = 0.5
nw_fit = np.array([nw(g, X, Y, h) for g in grid])
ll_fit, _ = kr.fit(data_predict=[grid, np.full_like(grid, Z.mean())])
# --- 4. 可视化 ---
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.scatter(X, Y, s=8, alpha=0.3, color='gray', label='观测')
ax.plot(grid, np.sin(grid)+0.3*Z.mean(), 'k--', lw=1.5, label='真实 m(X)')
ax.plot(grid, nw_fit, lw=2, color='#b87333', label=f'NW (h={h})')
ax.plot(grid, ll_fit, lw=2, color='#1c5d6e', label='局部线性 (CV)')
ax.set_xlabel('X'); ax.set_ylabel('Y')
ax.set_title('非参回归:NW vs 局部线性 vs 真实函数')
ax.legend(); plt.tight_layout(); plt.show()
# --- 5. Robinson (1988) PLM 估计 ---
# Y = beta*Z + g(X) + eps;先非参去均值,再 OLS
E_Y = np.array([nw(g, X, Y, h) for g in X])
E_Z = np.array([nw(g, X, Z, h) for g in X])
beta_plm = np.sum((Z-E_Z)*(Y-E_Y)) / np.sum((Z-E_Z)**2)
print(f"Robinson PLM beta_Z = {beta_plm:.3f} (true = 0.300)")
06 论文案例
07 常见错误
$h$ 太小会让曲线跟着每个数据点抖。判断方法:画 $0.5h$、$h$、$2h$ 三档曲线,如果 $0.5h$ 出现明显锯齿、$2h$ 接近直线,说明你选的 $h$ 偏小。
$h$ 太大会让非参估计退化成常数线(近似 OLS 截距)。如果画出的曲线几乎水平、与 OLS 回归线重合,检查带宽是否过大。
NW 在支撑区间两端偏差显著。应改用局部线性(reg_type='ll'),并在论文中明确标注支撑区间,区间外的曲线不要画或画虚线。
非参回归的收敛速度随维数 $d$ 下降:$n^{-2/(d+4)}$。当 $d\ge 5$,即使 10 万样本也不够。对策:用 GAM(可加分解)、PLM(只对关键变量非参)、或 DML 式的 ML 方法。
pointwise 95% 置信带只在单个 $x$ 点上有解释力;说"整条曲线与零显著不同"需要 simultaneous 置信带(如 sup-t 调整)。
08 交叉链接
- 与 04 基准回归:非参是 OLS 的非参数对照。当 OLS 系数对函数形式敏感时,画一条非参曲线能直观判断"线性假设错在哪"。
- 与 07 RDD:RDD 的局部线性回归就是一维非参回归在 cutoff 处的应用;带宽选择(IK/CCT)与本页 CV 同源。
- 与 16 DML 去偏机器学习:DML 用非参/ML 估计 nuisance function($E[Y|X]$、$E[D|X]$),再做正交化回归——非参是 DML 的工具之一。
- 与 28 Bunching/Kink:bunching 反事实密度的多项式拟合本质是局部多项式非参回归;bin width 与 excluded window 的选择是带宽选择的变体。
最后提醒:非参/半参方法在中文顶刊中常用于诊断与稳健性,而非主回归。典型范式是:基准回归用 OLS 报系数,稳健性部分用局部线性核回归画 $m(X)$ 曲线,证明"线性假设不是结论的来源"。如果非参曲线与 OLS 线性预测一致,OLS 结论更可信;如果不一致,需要回到模型设定讨论。把非参当作"视觉化的函数形式检验",比把它当作独立的因果识别工具更稳妥。