前置条件与学习依赖 / PREREQUISITES
① 数学 / 统计基础
条件期望函数 $m(x)=E[Y|X=x]$、核函数性质、偏差—方差权衡、$h \to 0, nh \to \infty$ 的渐近框架。
② 经济学理论前置
为什么"参数误设"是实证大忌:函数形式错误导致斜率估计偏误、政策效应错误。
③ 软件 / 计算前置
Stata 16+(npregresslpolysemipar);Python(statsmodels.nonparametric.KernelRegscipy)。
④ 站内前置页面
先学 04 基准回归;与 07 RDD(局部线性回归)、16 DML(用非参做 nuisance)互链。
⑤ 难度分级
进阶

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(lpolynpregresssemipar)与 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 假设与原理:条件期望函数与核权重

核心模型假设:

Eq. 2.1 — 非参数回归的总体假设
$$ Y_i = m(X_i) + \varepsilon_i, \qquad E[\varepsilon_i|X_i]=0 $$

我们要估计的就是条件期望函数 $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$。常用:

带宽 $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) 估计量就是加权平均:

Eq. 3.1 — Nadaraya–Watson 估计量
$$ \hat m_{NW}(x) = \frac{\sum_{i=1}^n K_h(x-X_i)\, Y_i}{\sum_{i=1}^n K_h(x-X_i)} $$

推导:由定义 $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$ 附近拟合一条局部直线:

Eq. 3.2 — 局部线性最小化问题
$$ \min_{\beta_0, \beta_1} \sum_{i=1}^n K_h(x-X_i)\big[Y_i - \beta_0 - \beta_1(X_i-x)\big]^2 $$

解出的 $\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}$(一维核回归)。实务中两个选择器:

04 逐步操作流程

① 选择核函数
核函数选择对结果影响很小(远小于带宽)。实务默认 Gaussian 或 Epanechnikov。RDD 用三角核。
② 选择带宽
先用 CV 自动选 $h^*$,再画 $0.5h^*$、$h^*$、$2h^*$ 三档曲线。如果三条曲线形状差别不大,说明对带宽不敏感;如果差别大,需要回到 CV 并检查样本量。
③ 估计并画置信带
用局部线性拟合 $\hat m(x)$;用 pointwise 95% 置信区间 $\hat m(x) \pm 1.96\,\widehat{SE}(\hat m(x))$ 画灰色置信带。不要用整体置信带代替 pointwise,反之亦然。
④ 半参模型:先线性部分再非参部分
PLM 用 Robinson 残差法:分别非参拟合 $E[Y|Z]$ 与 $E[X|Z]$,再用残差回归 $\tilde Y = \tilde X^\top\beta + \varepsilon$。
⑤ 稳健性与外推边界
报告不同核、不同带宽下的曲线;标注支撑区间(support),区间外的外推不可信。

05 完整代码(Stata + Python)

stata · nonparametric.do
*==============================================================*
* 非参 / 半参回归演示:核回归、局部线性、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
python · nonparametric.py
# ==============================================================
# 非参 / 半参: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 论文案例

English · 专著
Local Polynomial Modelling and Its Applications
Jianqing Fan & Irene Gijbels · Chapman & Hall, 1996
局部多项式回归的圣经。系统讲清局部线性/局部二次估计量的渐近性质、边界偏差、带宽选择。任何做非参的实证学者案头必备。
English · Econometrica
Root-N-Consistent Semiparametric Regression
Peter M. Robinson · Econometrica, 1988
部分线性模型 PLM 的经典论文。证明"残差化 + OLS"估计量的参数部分仍可达 $\sqrt n$ 速率——半参模型既能灵活、又能快。
English · JASA / 专著
Generalized Additive Models(GAM)
Trevor Hastie & Robert Tibshirani · Chapman & Hall, 1990
可加模型与变系数模型的开创性著作。把"一个未知函数"推广为"多个未知函数相加",是统计学习经典教材。
English · JEL
Nonparametric Regression Techniques in Economics
Adonis Yatchew · Journal of Economic Literature, 1998
面向经济学家的非参回归综述。不讲严格渐近理论,专讲"怎么用、怎么读、怎么避免错误"。是实证学者读非参的最佳入门。
中文 · 中文计量应用
半参数 / 非参方法在国内实证中的应用(TFP 估计、可加模型)
周亚虹(上海财经大学)等团队系列;谢琍、刘磊、曹瑞元《部分线性可加自回归模型及其应用》,《数理统计与管理》2018 年第 37 卷第 2 期
国内半参数计量经济研究的代表:周亚虹团队长期从事半参数模型理论与微观数据应用;谢琍等(2018)把部分线性可加自回归模型用于波士顿房价数据,并用样条逼近可加函数分量,是中文期刊里半参模型应用的规范范例。
中文 · 非参 TFP
中国高新技术企业全要素生产率估计与分析——基于非参数模型
《北京航空航天学报(社会科学版)》系列论文,2023 年
用 2013–2019 年国家高新区企业微观数据,构建非参数生产函数模型,放松投入—产出线性假设,并处理投入决策内生性,用两阶段非参数法估计企业 TFP。是中文实证中非参生产函数应用的代表。

07 常见错误

错误 1:带宽过小,曲线过拟合噪声

$h$ 太小会让曲线跟着每个数据点抖。判断方法:画 $0.5h$、$h$、$2h$ 三档曲线,如果 $0.5h$ 出现明显锯齿、$2h$ 接近直线,说明你选的 $h$ 偏小。

错误 2:带宽过大,把非线性"磨平"

$h$ 太大会让非参估计退化成常数线(近似 OLS 截距)。如果画出的曲线几乎水平、与 OLS 回归线重合,检查带宽是否过大。

错误 3:忽略边界偏差

NW 在支撑区间两端偏差显著。应改用局部线性(reg_type='ll'),并在论文中明确标注支撑区间,区间外的曲线不要画或画虚线。

错误 4:高维非参(维度灾难)

非参回归的收敛速度随维数 $d$ 下降:$n^{-2/(d+4)}$。当 $d\ge 5$,即使 10 万样本也不够。对策:用 GAM(可加分解)、PLM(只对关键变量非参)、或 DML 式的 ML 方法。

错误 5:把置信带当成"显著性区间"

pointwise 95% 置信带只在单个 $x$ 点上有解释力;说"整条曲线与零显著不同"需要 simultaneous 置信带(如 sup-t 调整)。

08 交叉链接

最后提醒:非参/半参方法在中文顶刊中常用于诊断与稳健性,而非主回归。典型范式是:基准回归用 OLS 报系数,稳健性部分用局部线性核回归画 $m(X)$ 曲线,证明"线性假设不是结论的来源"。如果非参曲线与 OLS 线性预测一致,OLS 结论更可信;如果不一致,需要回到模型设定讨论。把非参当作"视觉化的函数形式检验",比把它当作独立的因果识别工具更稳妥。