Semiparametric Prediction with Efficient Interval Length under a Right-Censored Covariate¶
作者: Kihyun Han, Yanyuan Ma, Karen Marder, Tanya P. Garcia
主题: 非参数 / 半参数
相关性: 7/10
链接: https://arxiv.org/abs/2607.26982
一、领域脉络与小综述¶
这个方向是什么¶
本文研究的子方向是:在右删失协变量(right-censored covariate)设定下,构建具有稳定区间长度和有效覆盖率的预测区间。具体来说,研究者观测到一个临床结局 \(Y\)、一个完全观测的协变量向量 \(Z\),以及一个“时间-事件”协变量 \(X\)(如疾病进展到某个关键阶段的时间)。但 \(X\) 对许多患者是右删失的——只知道它超过某个删失时间 \(C\),而不知道其确切值。目标是为一个新的观测 \((W_0, \Delta_0, Z_0)\) 构建一个 \((1-\alpha)\)-水平的预测区间 \(m(\cdot) \pm \zeta\),其中 \(m(\cdot)\) 是固定的中心,\(\zeta\) 是半长度。该方向当前的核心张力在于:共形预测(conformal prediction)方法能提供分布自由的覆盖保证,但其区间长度在不同样本间高度可变,无法支持可靠的临床决策。
发展脉络¶
-
奠基工作:预测区间与共形预测
- Cox (1975) 和 Tian, Nordman & Meeker (2022) 建立了预测区间的基本框架和评价标准(预期覆盖率)。这些工作定义了“预测区间”这一概念,但未处理协变量删失问题。
- Vovk, Gammerman & Shafer (2005) 和 Lei et al. (2018) 提出了共形预测(conformal prediction)框架,其核心优势是:在无需对数据分布做任何假设的情况下,即可为预测区间提供有限样本的覆盖率保证。这成为处理复杂数据结构的自然起点。
-
主要进展:共形预测的变体与右删失协变量下的估计
- Barber et al. (2021) 提出了 jackknife+,一种基于留一法的共形预测变体,在计算效率和样本利用之间取得平衡。
- Lee et al. (2026) 提出了 SPARCC 估计量,专门用于右删失协变量设定下结果模型参数 \(\beta\) 的半参数稳健估计。该工作建立了该设定下的半参数理论框架(包括切线空间分解和有效得分函数),但目标仍是估计模型参数 \(\beta\),而非预测区间。
- Vazquez et al. (2024) 系统比较了右删失协变量与缺失协变量之间的异同,为理解该设定下的识别问题提供了理论基础。
-
当前 Frontier 与本文位置
- 当前 frontier 是:在右删失协变量设定下,能否在不牺牲覆盖率有效性的前提下,显著降低预测区间长度的变异性?
- 本文的位置:作者将预测区间的构建重新表述为半长度的半参数估计问题。通过利用被共形预测丢弃的分布信息(结果模型、时间-事件模型、删失模型),作者构建了一个双稳健且半参数有效的半长度估计量。这直接回应了共形预测区间长度不稳定的痛点,并将该问题纳入了成熟的半参数效率理论框架。
子线索聚类¶
- 共形预测路线:以 Vovk et al. (2005)、Lei et al. (2018)、Barber et al. (2021) 为代表。核心思路是使用非符合性得分(如残差)的经验分位数来构建预测区间。优点是分布自由、有有限样本覆盖保证;缺点是区间长度高度依赖样本,变异性大。
- 模型预测路线:以 Cox (1975) 和 Tian et al. (2022) 为代表。核心思路是假设一个参数或半参数模型,然后基于模型推导预测区间。优点是若模型正确,区间长度可更稳定;缺点是对模型错误指定敏感,且难以处理右删失协变量。
- 半参数路线(本文):作者将预测区间构建转化为半长度 \(\zeta\) 的半参数估计问题。通过推导效率影响函数(EIF),构建了一个双稳健的估计方程。该方法结合了模型路线的信息利用效率和共形路线的稳健性(通过双稳健性)。
核心问题与已知瓶颈¶
- 核心问题 1:如何定义和估计右删失协变量设定下的预测区间半长度 \(\zeta\)?
- 核心问题 2:如何使 \(\zeta\) 的估计量具有最小的渐近方差(即半参数有效)?
- 核心问题 3:如何使 \(\zeta\) 的估计量对时间-事件模型或删失模型的错误指定具有稳健性(即双稳健)?
- 已知瓶颈:共形预测方法(如 split CP, full CP, jackknife+)虽然提供了有效的覆盖率保证,但其半长度估计完全依赖于经验残差分位数,导致区间长度在不同样本间高度可变。这种不稳定性使得预测区间无法支持可靠的临床决策。
⚠️ 作者的 framing¶
- 作者把缺口 frame 成什么:作者将共形预测方法的“区间长度不稳定”问题,frame 为“未能利用分布信息”的直接后果。作者声称,通过将预测问题重新表述为半参数估计问题,可以同时获得效率(最小方差)、双稳健性(对两个关键模型之一错误指定不敏感)和有效覆盖率(与共形预测同阶的 \(O(n^{-1})\) 误差)。这使得本文成为“显然的下一步”:既然共形预测有覆盖保证但长度不稳定,那么用半参数方法去直接估计那个“稳定”的半长度就是自然的改进。
- 哪些竞争路线被淡化或回避了:
- 完全非参数方法:作者没有讨论完全非参数地估计 \(\zeta\) 的可能性(例如,直接核密度估计残差分布)。这可能是因为在右删失协变量设定下,非参数估计的收敛速度会很慢,且难以处理高维 \(Z\)。
- 贝叶斯方法:作者完全回避了贝叶斯预测区间。贝叶斯方法可以自然地整合先验信息和模型不确定性,但作者可能认为其依赖于先验指定,与本文追求的“频率学派最优性”不同。
- 什么明显该被引 / 该存在、却没出现在 intro 里?
- 关于“预测区间长度稳定性”的量化文献:作者提到区间长度不稳定是问题,但没有引用任何专门研究预测区间长度变异性或稳定性的文献。是否存在一个已知的“区间长度变异性”的 minimax 下界?或者有工作专门讨论如何校准区间长度?这是一个值得研究者去查的问题。
- 关于“双稳健预测”的文献:双稳健性在因果推断中非常常见,但在“预测区间”这个具体问题中,是否有其他工作尝试过双稳健预测?作者没有提及,这可能意味着这是一个相对新颖的结合点。
张力¶
未见明显对立引用。被引工作之间没有在相同条件下得出相反结论的明显冲突。它们更多是沿着不同技术路线(共形 vs. 模型)发展,而本文试图在两者之间架起桥梁。
二、最核心、最简单的例子 / 数学问题¶
第一步:把符号、模型、可观测数据交代清楚¶
- 符号:
- \(Y \in \mathbb{R}\):结局变量(临床评分),是预测的目标。
- \(X \in \mathbb{R}\):时间-事件协变量(如疾病进展到 Stage 2 的时间),是关键的预测因子,但常被右删失。
- \(C \in \mathbb{R}\):删失时间(如退出研究的时间)。
- \(W \equiv \min(X, C)\):观测到的时间协变量。
- \(\Delta \equiv I(X \le C)\):删失指示符,\(\Delta = 1\) 表示 \(X\) 被观测到(事件发生),\(\Delta = 0\) 表示 \(X\) 被右删失。
- \(Z \in \mathbb{R}^{d_Z}\):完全观测的协变量向量(如年龄、性别)。
- \(O = (Y, W, \Delta, Z)\):可观测数据。
- \(\beta \in \mathbb{R}^{d_\beta}\):结果模型参数,用于刻画 \(Y|X, Z\) 的分布。
- \(\zeta \in \mathbb{R}\):目标半长度,即预测区间的半径。它是残差 \(r(O, \beta) = |Y - m(W, \Delta, Z, \beta)|\) 的 \((1-\alpha)\)-总体分位数。
- \(m(\cdot)\):固定的中心函数,是 \(Y\) 的一个预测值,依赖于 \((W, \Delta, Z)\) 和 \(\beta\)。
- \(\eta_1 \equiv f_{X|Z}\):时间-事件模型(nuisance model)。
- \(\eta_2 \equiv f_{C|Z}\):删失模型(nuisance model)。
- \(\eta_3 \equiv f_Z\):完全观测协变量的边际模型(nuisance model)。
- \(\phi_{\text{eff}}\):效率影响函数(Efficient Influence Function),用于构造半参数有效估计量。
- 模型:
- 非信息删失假设:\(C \perp (X, Y) \mid Z\)。即给定 \(Z\),删失时间 \(C\) 与 \(X\) 和 \(Y\) 独立。这是该设定下的标准假设,使得似然函数可以分解。
- 结果模型:\(Y|X, Z \sim f_{Y|X, Z}(\cdot; \beta)\),由参数 \(\beta\) 刻画。
- 时间-事件模型:\(X|Z \sim \eta_1\),是 nuisance。
- 删失模型:\(C|Z \sim \eta_2\),是 nuisance。
- 观测数据似然:由公式 (1) 给出,它整合了上述模型,并考虑了右删失机制。
- 可观测数据:
- 可观测:研究者能观测到 \(n\) 个独立同分布的样本 \(\{O_i = (Y_i, W_i, \Delta_i, Z_i)\}_{i=1}^n\)。
- 不可观测(潜在):对于 \(\Delta_i = 0\) 的个体,其真实的时间-事件协变量 \(X_i\) 是未知的,只知道它大于 \(W_i\)。删失时间 \(C_i\) 也是未知的,只知道它等于 \(W_i\)。对于 \(\Delta_i = 1\) 的个体,\(X_i = W_i\),但 \(C_i\) 是未知的,只知道它大于等于 \(W_i\)。
第二步:讲最小内核¶
本文的核心思路是:与其用残差的经验分位数来估计半长度 \(\zeta\),不如用模型提供的分布信息来直接估计它。这个想法的最简特例是没有删失的情况,即 \(P(\Delta = 1) = 1\),此时 \(W = X\)。
最简特例:无删失 (\(C \to \infty\))
-
设定:假设没有删失,我们观测到 \((Y_i, X_i, Z_i)\)。中心函数简化为 \(m_0(X, Z, \beta) = E[Y|X, Z, \beta]\)。残差为 \(r(O, \beta) = |Y - m_0(X, Z, \beta)|\)。目标半长度 \(\zeta\) 是 \(|Y - m_0(X, Z, \beta)|\) 的 \((1-\alpha)\)-分位数。
-
共形预测的做法:共形预测会先估计 \(\hat{\beta}\),然后计算样本残差 \(\{|Y_i - m_0(X_i, Z_i, \hat{\beta})|\}_{i=1}^n\),最后取这些残差的 \((1-\alpha)\) 样本分位数作为 \(\hat{\zeta}_{\text{CP}}\)。这个 \(\hat{\zeta}_{\text{CP}}\) 完全由这 \(n\) 个残差值决定,因此方差很大。
-
本文半参数方法的做法:作者注意到,\(\zeta\) 是由总体分布决定的。在无删失且结果模型正确的情况下,我们可以写出一个关于 \(\zeta\) 的总体矩条件:
\[E[ I\{ |Y - m_0(X, Z, \beta)| \le \zeta \} ] = 1 - \alpha.\]如果我们知道 \(Y|X, Z\) 的分布(例如,\(Y = m_0(X, Z, \beta) + \epsilon\),且 \(\epsilon \perp (X, Z)\)),那么上述条件就变成了 \(P(|\epsilon| \le \zeta) = 1 - \alpha\)。此时,\(\zeta\) 就是一个非随机的常数(即误差项 \(\epsilon\) 的 \((1-\alpha)\) 分位数),与样本无关! -
核心思路:在更一般的情况下,我们不知道 \(\epsilon\) 的分布,但我们可以利用模型来估计这个总体矩条件。作者推导了一个效率影响函数 \(\phi_{\text{eff}}\),使得基于它的估计方程 \(\sum_i \phi_{\text{eff}}(O_i, \zeta, \hat{\beta}) = 0\) 的解 \(\hat{\zeta}\) 具有最小渐近方差。这个估计量不是简单地取样本分位数,而是通过模型结构“平滑”了样本信息,从而降低了方差。
-
为什么方差更小:共形预测的 \(\hat{\zeta}_{\text{CP}}\) 只用了残差的秩信息(哪个残差是第 \((1-\alpha)\) 大的)。而半参数方法的 \(\hat{\zeta}\) 利用了残差的整个分布形状(通过模型和效率影响函数)。后者使用了更多信息,因此可以达到更小的方差。在无删失的线性模型特例中,如果误差是独立同分布的高斯噪声,那么 \(\hat{\zeta}\) 的方差将远小于样本分位数的方差。
总结:本文的最小内核是:将预测区间半长度的估计,从一个“分位数估计”问题,转化为一个“参数/半参数估计”问题。后者可以利用模型结构和效率理论,获得比前者(纯非参数的经验分位数)更稳定(方差更小)的估计量。右删失协变量的存在只是增加了问题的复杂性(需要处理缺失数据),但核心思想不变。
三、这篇论文做了什么¶
三句话¶
- 研究了什么问题:在时间-事件协变量 \(X\) 被右删失的队列研究中,如何构建一个区间长度稳定且覆盖率有效的预测区间。
- 核心工具/方法:将预测区间半长度 \(\zeta\) 的估计重新表述为一个半参数估计问题,推导了其效率影响函数(EIF),并基于此构建了一个双稳健的估计方程。
- 主要结论:所提出的半参数预测方法在估计半长度时是半参数有效的(达到最小渐近方差),并且是双稳健的(只要时间-事件模型或删失模型之一正确,估计量就一致)。其预测区间的预期覆盖率误差为 \(O(n^{-1})\),与共形预测同阶,但区间长度的变异性显著降低。
关键设定与假设¶
- 核心设定:右删失协变量设定,观测数据为 \(O = (Y, W, \Delta, Z)\)。
- 关键假设:
- 非信息删失:\(C \perp (X, Y) \mid Z\)。这是该领域标准假设,使得似然可分解,是识别的基础。
- 残差连续性:\(r(O, \beta)\) 是连续随机变量。这是为了确保分位数定义的唯一性,并简化理论推导。
- 正则条件 (A1)-(A7):这些是 M-估计和半参数理论的标准条件,包括参数空间的紧致性、矩条件、连续性、\(\hat{\beta}\) 的相合性和渐近线性等。它们保证了估计量的相合性和渐近正态性。
- 覆盖率分析的条件 (C1)-(C7):这些是推导预期覆盖率和有限样本误差界所需的额外条件,包括覆盖函数的平滑性、导数矩阵的可逆性、以及估计方程 \(\Phi\) 的子指数尾部条件。
- 相比已有文献的放宽/强化:
- 放宽:相比完全参数模型,本文不要求结果模型、时间-事件模型和删失模型全部正确。双稳健性允许其中一个 nuisance 模型被错误指定。
- 强化:相比共形预测,本文要求研究者指定结果模型和 nuisance 模型(即使可能是错误的)。这引入了模型风险,但换来了效率增益和区间长度稳定性。
主要结果¶
- 定理 2(双稳健性):如果时间-事件模型 \(\eta_1\) 或删失模型 \(\eta_2\) 中有一个被正确指定,那么半长度估计量 \(\hat{\zeta}\) 是相合的。这为研究者提供了建模的灵活性:他们可以专注于建模更有信心的那个 nuisance 模型。
- 定理 3(渐近正态性与半参数效率):在双稳健性条件下,\(\hat{\zeta}\) 是 \(\sqrt{n}\)-相合且渐近正态的。特别地,当两个 nuisance 模型都正确时,\(\hat{\zeta}\) 是半参数有效的,其渐近方差达到半参数效率界 \( \text{var}\{\phi_{\text{eff}}(O, \zeta, \beta)\} \)。这量化了利用分布信息带来的效率增益。
- 定理 4(预期覆盖率误差):由 \(\hat{\zeta}\) 构建的预测区间,其预期覆盖率与名义水平 \(1-\alpha\) 的偏差为 \(O(n^{-1})\)。这与共形预测的误差阶相同,说明在获得效率增益的同时,没有牺牲覆盖率的渐近有效性。
- 定理 5(有限样本覆盖率界):在更强的子指数尾部条件下,给出了覆盖率条件于 \((\hat{\zeta}, \hat{\beta})\) 的有限样本误差界,其主项为 \(O(n^{-1/2} (\log n)^{1/2})\)。
证明路线与技术技巧¶
- 整体路线:
- 问题转化:将预测区间构建问题转化为估计半长度 \(\zeta\) 的问题,\(\zeta\) 是残差 \(r(O, \beta)\) 的 \((1-\alpha)\)-分位数。
- 半参数框架建立:将 \(\zeta\) 视为一个由结果模型参数 \(\beta\) 和 nuisance 模型 \((\eta_1, \eta_2, \eta_3)\) 决定的泛函。推导观测数据似然的切线空间 \(T\),并将其分解为四个正交分量:\(\tilde{\Lambda}_\beta\)(结果模型)、\(\Lambda_1\)(时间-事件模型)、\(\Lambda_2\)(删失模型)、\(\Lambda_3\)(协变量模型)。关键跳跃点:与 Lee et al. (2026) 不同,本文的目标是 \(\zeta\) 而非 \(\beta\),因此 \(\tilde{\Lambda}_\beta\) 必须被包含在切线空间内,而不是被投影出去。这使得 EIF 必须同时考虑来自 \(\beta\) 和 nuisance 模型的不确定性。
- 效率影响函数推导:通过求解路径导数,得到 \(\zeta\) 的效率影响函数 \(\phi_{\text{eff}}\)(Proposition 2)。它由四个正交分量组成,分别对应切线空间的四个部分。推导过程涉及复杂的积分方程和条件期望。
- 双稳健估计量构建:基于 \(\phi_{\text{eff}}\) 构建估计方程 \(\sum_i \phi_{\text{eff}}(O_i, \zeta, \hat{\beta}) = 0\)。为了处理 nuisance 模型错误指定,引入工作模型 \(\eta_1^*\) 和 \(\eta_2^\star\),得到 \(\phi_{\text{eff}}^{*\star}\)。
- 理论性质证明:
- 双稳健性:证明当 \(\eta_1^* = \eta_1\) 或 \(\eta_2^\star = \eta_2\) 时,\(E[\phi_{\text{eff}}^{*\star}(O, \zeta, \beta)] = 0\)(Lemma A.1)。结合 M-估计的标准条件,得到 \(\hat{\zeta}\) 的相合性(Theorem 2)。
- 渐近正态性与效率:通过泰勒展开和 \(\hat{\beta}\) 的渐近线性表示,推导出 \(\hat{\zeta}\) 的渐近分布(Theorem 3)。当两个 nuisance 模型都正确时,方差简化为 \(\text{var}\{\phi_{\text{eff}}\}\),证明了效率。
- 覆盖率分析:将 \((\hat{\zeta}, \hat{\beta})\) 的估计方程联立,利用二阶泰勒展开和矩条件,证明预期覆盖率误差为 \(O(n^{-1})\)(Theorem 4)。进一步利用子指数集中不等式,得到有限样本误差界(Theorem 5)。
- 技术技巧点名:
- 效率影响函数 (EIF):核心工具,用于构造半参数有效估计量。
- 切线空间分解:用于正交化不同模型带来的影响,是推导 EIF 的标准技术。
- 双稳健估计:通过证明 EIF 在部分模型错误指定下仍具有零均值,实现稳健性。
- M-估计理论:用于证明估计量的相合性和渐近正态性(Newey & McFadden, 1994)。
- 子指数集中不等式:用于推导有限样本误差界(Wainwright, 2019)。
- 积分方程求解:在计算 EIF 的各个分量时,需要求解形如 (6) 和 (7) 的积分方程,这是实现算法的关键计算步骤。
真实例子与应用¶
- 数据:Enroll-HD 数据集,一个包含 30,511 名亨廷顿病患者的国际观察性队列研究。经过数据清洗,最终样本量为 \(n=2,809\),删失率高达 77.2%。
- 场景:预测患者在 HD-ISS Stage 0 时的临床结局(四个变量:三个认知测试分数 SC, SW, SI 和一个复合分数 cUHDRS)。关键的预测因子是“从 Stage 0 进展到 Stage 2 的时间” \(X\),但该变量对大多数患者是右删失的。
- 方法应用:作者将本文的半参数预测方法与三种共形预测方法(split CP, full CP, jackknife+)进行比较。他们使用了三个不同的中心函数 \(m_1, m_2, m_1^*\) 和三种 nuisance 模型规范(正确、仅 \(\eta_1\) 错误、仅 \(\eta_2\) 错误)。
- 结果:
- 半参数方法:在所有设定下,其预测区间的经验覆盖率都集中在名义水平 0.9 附近(0.889-0.909),且半长度 \(\hat{\zeta}\) 在不同 nuisance 模型规范下非常稳定(例如 SC 的 \(\hat{\zeta}\) 变化小于 1.4%)。这直接验证了其双稳健性和稳定性。
- 共形预测方法:表现出明显问题。Split CP 偶尔欠覆盖(SW 降至 0.878-0.880)。Jackknife+ 持续欠覆盖(cUHDRS 降至 0.748-0.761)。Full CP 要么欠覆盖,要么区间过长(cUHDRS 的半长度比半参数方法长 30-35%),过于保守。
- 这个例子想说明什么:在真实的高删失率场景下,本文的半参数方法能够兑现其理论承诺:提供可靠(覆盖率有效)且稳定(区间长度变异小) 的预测区间。相比之下,共形预测方法要么覆盖率不可靠,要么区间长度过长而失去信息价值。这证明了将预测问题重新表述为半参数估计问题的实际临床意义。
🔎 结论是否比证明窄¶
- Theorem 4 的 \(O(n^{-1})\) 误差:这个结论是在一系列正则条件 (C1)-(C5) 下严格证明的。作者在 Remark 中提到,通过一个额外的校准步骤,理论上可以将误差降至 \(O(n^{-3/2})\),但本文没有实现。因此,“\(O(n^{-1})\) 是本文方法能达到的最佳误差”这个结论是严格的,但作者暗示了改进空间。
- Theorem 5 的有限样本界:这个界的推导依赖于子指数尾部条件 (C7)。作者在 Remark 4 中仅验证了无删失线性模型下该条件成立。对于一般的右删失设定,该条件是否普遍成立,或者是否存在更弱的替代条件,论文没有给出一般性证明。因此,Theorem 5 的结论在一般右删失设定下的普适性,比其证明所覆盖的范围要窄。这是一个值得研究者去核实的点。
- 双稳健性:Theorem 2 证明 \(\hat{\zeta}\) 对 \(\eta_1\) 或 \(\eta_2\) 的错误指定是稳健的。但作者明确指出,\(\hat{\zeta}\) 对结果模型参数 \(\beta\) 的错误指定并不稳健。这是一个重要的局限性,但在论文的 framing 中可能被淡化。结论是“双稳健”,但实际上是“双稳健于两个 nuisance 模型,而非结果模型”。
四、开放问题¶
-
协变量依赖的半长度:本文估计的是一个边际半长度 \(\zeta\),即对所有患者使用相同的区间长度。作者在 Discussion 中提出,可以将其扩展为协变量依赖的半长度 \(\zeta(w, \delta, z)\),使得区间长度能根据患者的具体特征(如删失状态 \(\Delta\) 或协变量 \(Z\))进行调整。这需要重新推导 EIF 并处理函数型目标参数。扎根点:Section 7 最后一段:“Unlike this marginal prediction interval, a prediction interval whose length varies with clinically relevant characteristics... could be tailored to patient subgroups.”
-
其他估计量的半参数效率:本文只研究了半长度 \(\zeta\) 的效率。在右删失协变量设定下,是否存在其他有意义的预测区间相关估计量(如条件分位数、区间长度的某个泛函)也能通过类似的半参数框架获得效率增益?扎根点:Section 7 最后一句:“The same recasting that delivers these guarantees for the marginal interval length is what a covariate-varying interval length and other estimands in the right-censored covariate setting can now be built on.”
-
计算简化与积分方程求解:本文的算法(Algorithm 1)需要求解复杂的积分方程(6)和(7)。对于高维 \(Z\) 或更复杂的模型,这些方程的计算成本可能很高。是否存在更高效的数值方法或近似策略?或者能否找到 EIF 的解析形式,从而避免数值积分?扎根点:Section 4.4 描述了实现中的计算挑战,并提出了简化策略,但并未完全解决高维情况下的计算瓶颈。
-
与共形预测的更深层次比较:本文展示了半参数方法在区间长度稳定性上的优势。但共形预测的“分布自由”特性在某些场景下(如小样本、模型严重错误指定)可能仍有吸引力。是否存在一个理论上的权衡:在什么条件下,半参数方法的效率增益会超过其模型风险?能否推导出一个类似“minimax 风险”的界来刻画这种权衡?扎根点:本文的模拟和实证都显示半参数方法更优,但并未从理论上证明它总是优于共形预测。这是一个开放的理论问题。
Maintained by 陈星宇 · Homepage · Source on GitHub