Design-Based Uncertainty for Quasi-Experiments¶
作者: Ashesh Rambachan, Jonathan Roth
来源: Journal of the American Statistical Association
主题: 因果推断
相关性: 8/10
链接: 期刊页 · arXiv
一、领域脉络与小综述¶
这个方向是什么: 这个子方向要解决的根本统计问题是:在缺乏严格随机化实验的“准实验”(quasi-experimental)设定下(如工具变量 IV、双重差分 DID、断点回归 RDD),如何为因果效应估计量提供一个既严格又贴合实证研究者直觉的推断基础。当前,该方向的成熟度处于“框架成型、正从经典随机化推断向异质性选择偏倚扩展”的阶段:经典设计推断(design-based inference)在完全随机化或条件随机化下已有完备的有限总体理论,但一旦允许单位在处理概率上存在异质性(即存在未观测的选择偏倚),现有框架要么退回超总体假设,要么对估计量的目标参数失去因果解释力。
发展脉络(history): - 奠基工作:Neyman (1923) 与 Rubin (1980) 建立了有限总体下完全随机化实验的设计推断框架,将处理分配视为唯一随机源,目标参数为有限总体平均处理效应(ATE)。这一路线的核心是“处理分配随机、单位潜在结果固定”。Abadie et al. (2020) 将此框架扩展到匹配与回归估计量,但依然依赖条件随机化假设。 - 主要进展:在准实验侧,Heckman et al. (1998) 与 Angrist & Pischke (2009) 等为 IV、DID 等提供了局部平均处理效应(LATE)等超总体解释;Aronow & Miller (2016) 与 Ding & Miratrix (2017) 开始尝试在有限总体下放松等概率假设,引入倾向得分加权,但往往需要倾向得分已知或可估,且未系统处理“倾向得分异质性导致选择偏倚”时的估计量目标参数偏移问题。 - 当前 frontier:如何在处理分配随机但单位处理概率异质(即存在未观测选择)的有限总体设定下,1)给出准实验估计量目标参数的因果解释;2)刻画选择偏倚导致的偏倚与推断扭曲;3)提供可操作的敏感性分析。Roth & Rambachan 近年的系列工作(如 Rambachan & Roth 2021 对 DID 迏背平行趋势的敏感性分析)正推进这一 frontier。 - 本文的位置:本文在上述 frontier 上,首次系统构建了一个“处理分配随机但允许异质性选择”的有限总体设计推断框架,填补了“严格随机化推断”与“超总体因果解释”之间的缺口——作者原话称:“existing design-based frameworks … are not well-suited for analyzing quasi-experimental settings … in which there is concern about unobserved selection into treatment”。
子线索聚类: 1. 经典设计推断(完全/条件随机化):Neyman (1923), Rubin (1980), Abadie et al. (2020)。这一簇在有限总体下将处理分配视为唯一随机源,但要求处理概率已知且(条件)等概率,无法容纳未观测选择偏倚。 2. 超总体因果解释(LATE 等):Angrist & Pischke (2009), Heckman et al. (1998)。这一簇为准实验估计量提供因果解释,但依赖超总体与独立同分布假设,与实证研究者常谈论的“有限总体中的特定变异”脱节。 3. 放松等概率的有限总体推断:Aronow & Miller (2016), Ding & Miratrix (2017)。这一簇尝试在有限总体下引入异质性处理概率,但主要关注倾向得分已知/可估时的加权估计量,未系统处理“倾向得分不可观测/不可估”时的偏倚与推断扭曲。
这个方向在追问的核心问题: 1. Estimand 的因果解释:当处理概率异质且不可观测时,IV/DID/RDD 等准实验估计量的目标参数在有限总体下还能否对应于某个可解释的因果参数(如 ATE、LATE、加权平均效应)?条件是什么? 2. 偏倚与推断扭曲的刻画:当上述条件被违反时,偏倚的方向与量级如何?置信区间的覆盖概率如何扭曲? 3. 敏感性分析的可操作性:能否将偏倚与推断扭曲的刻画转化为对选择偏倚强度的敏感性分析,使实证研究者可以定量评估结论对未观测选择的稳健性?
⚠️ 作者的 framing(这是作者的说法): - 作者将缺口 frame 为:现有设计推断框架“不适合分析准实验设定,因为它们不允许未观测的选择偏倚”,而超总体框架“与实证研究者讨论数据变异的方式不一致”。这使得本文的“处理分配随机但允许异质性选择”的有限总体框架成为“显然的下一步”。 - 被淡化或回避的竞争路线:超总体下的敏感性分析(如 Masten & Poirier 2020, Oster 2019)被引用但未深入对比其与本文有限总体框架的优劣;半参数效率界与 HOIF 路线(如 Robins et al. 2000 系列)完全未出现——这可能是作者刻意聚焦有限总体设定,但也可能留下“有限总体下是否存在类似效率界”的缺口。 - 明显该被引/该存在却未出现的:半参数敏感性分析框架(如 Robins et al. 2000 的 unmeasured confounding bias bounds)、近期关于有限总体下效率界的工作(如 Li & Ding 2017)——这些与本文的 estimand 刻画与偏倚界直接相关,却未在 intro 中出现。值得研究者去查:是技术路线不兼容,还是作者有意回避?
张力: 未见明显对立引用。但存在隐含张力:超总体路线(Angrist & Pischke 2009)认为准实验估计量的因果解释必须依赖超总体 LATE,而本文试图在有限总体下给出替代解释——两者在“何种随机化假设更贴合实证”上存在立场分歧,而非数学矛盾。
二、最核心、最简单的例子 / 数学问题¶
第一步:符号、模型、可观测数据交代清楚
- 有限总体:包含 \(N\) 个单位,索引为 \(i = 1, \dots, N\)。
- 潜在结果:\(Y_i(1), Y_i(0)\) 分别为单位 \(i\) 在处理和控制下的潜在结果(固定常数,非随机变量)。
- 处理分配:\(D_i \in \{0, 1\}\) 为单位 \(i\) 的处理指示变量,是随机变量(唯一随机源)。
- 可观测结果:\(Y_i = Y_i(D_i) = D_i Y_i(1) + (1 - D_i) Y_i(0)\)(由 SUTVA 保证)。
- 处理概率(倾向得分):\(\pi_i := P(D_i = 1)\),单位 \(i\) 的边际处理概率。关键:\(\pi_i\) 可以跨单位异质,且可能不可观测/不可估。
- 协变量:\(X_i\) 为可观测协变量(固定常数),条件处理概率 \(\pi_i(x) := P(D_i = 1 | X_i = x)\)。
- 目标参数:有限总体平均处理效应 \(\tau := \frac{1}{N} \sum_{i=1}^N (Y_i(1) - Y_i(0))\),或其他加权平均因果参数。
- 估计量:常见准实验估计量,如 OLS 回归系数 \(\hat{\tau}_{OLS}\)、IV 估计量 \(\hat{\tau}_{IV}\)、DID 估计量 \(\hat{\tau}_{DID}\) 等。
- 选择偏倚:当 \(\pi_i\) 与潜在结果 \(Y_i(d)\) 相关时,存在未观测选择偏倚。本文用 \(\Delta_i := Y_i(1) - Y_i(0) - \tau\)(个体效应偏离总体均值)与 \(\pi_i - \bar{\pi}\)(倾向得分偏离总体均值)的协方差或相关结构来量化选择偏倚。
模型: 数据生成机制为:潜在结果 \((Y_i(1), Y_i(0))\) 与协变量 \(X_i\) 视为固定;处理分配 \(D_i\) 由某随机过程生成,边际概率为 \(\pi_i\)(可异质),允许 \(\pi_i\) 与潜在结果相关(即允许选择偏倚)。研究者观测到 \((Y_i, D_i, X_i)\) 的全样本。
可观测数据 vs. 想要但观测不到: - 可观测:\((Y_i, D_i, X_i)\) 对所有 \(i\)。 - 想要但观测不到:潜在结果 \((Y_i(1), Y_i(0))\) 对所有 \(i\)(只能观测到 \(Y_i(D_i)\));倾向得分 \(\pi_i\)(若不可估或无模型则不可观测)。
第二步:最小内核——最简特例(OLS 回归估计量在异质性 \(\pi_i\) 下的 estimand 与偏倚)
剥掉所有准实验的复杂设定(IV、DID、协变量调整),考虑最简情形:无协变量、纯 OLS 回归系数 \(\hat{\tau}_{OLS}\) 在有限总体下的 estimand。
-
设定:\(N\) 个单位,无协变量 \(X_i\),处理分配 \(D_i\) 独立(跨单位)但边际概率 \(\pi_i\) 异质。OLS 估计量为 \(\hat{\tau}_{OLS} = \frac{\sum_i D_i Y_i}{\sum_i D_i} - \frac{\sum_i (1-D_i) Y_i}{\sum_i (1-D_i)}\)(处理组均值 - 控制组均值)。
-
经典设计推断下的 estimand:若 \(\pi_i = p\) 对所有 \(i\) 相等(完全随机化),则 \(\hat{\tau}_{OLS}\) 的条件期望(对 \(D_i\) 取期望)为 \(\tau = \frac{1}{N} \sum_i (Y_i(1) - Y_i(0))\)——无偏估计有限总体 ATE。
-
本文最小内核:当 \(\pi_i\) 异质时,\(\hat{\tau}_{OLS}\) 的 estimand(对 \(D_i\) 取期望)退化为:
\[E_D[\hat{\tau}_{OLS}] \approx \tau + \frac{1}{N} \sum_i \frac{(\pi_i - \bar{\pi})}{\bar{\pi}(1-\bar{\pi})} (Y_i(1) - Y_i(0) - \tau)\]其中 \(\bar{\pi} = \frac{1}{N} \sum_i \pi_i\)。第二项即选择偏倚项:它是倾向得分偏离均值 \((\pi_i - \bar{\pi})\) 与个体效应偏离均值 \((Y_i(1)-Y_i(0)-\tau)\) 的加权协方差。当 \(\pi_i\) 与个体效应相关时,OLS estimand 偏离 \(\tau\)。 -
核心思路:
- Estimand 分解:将准实验估计量的 estimand 分解为“目标因果参数 \(\tau\)(或其加权变体)”+“选择偏倚项”。偏倚项的结构由 \(\pi_i\) 与潜在结果的协方差决定。
- 条件化给出因果解释:若存在某条件(如 \(\pi_i\) 与个体效应在给定某可观测变量后无关,或 \(\pi_i\) 满足某约束),偏倚项为零,estimand 回归因果参数——这给出了“estimand 可解释的条件”。
- 偏倚与推断扭曲刻画:当条件违反时,偏倚项的量级由 \(\pi_i\) 与潜在结果的关联强度决定;推断扭曲(置信区间覆盖概率下降)由偏倚与估计量方差的比例决定。
-
敏感性分析:将偏倚项中的不可观测关联(\(\pi_i\) 与潜在结果的相关)参数化(如设为某有界区间),计算偏倚与推断扭曲的范围,从而评估结论对选择偏倚的稳健性。
-
为什么成立:整个框架的数学基础是有限总体下对处理分配 \(D_i\) 取期望——所有分解与偏倚刻画都通过 \(E_D[\cdot]\) 展开,潜在结果固定,随机性仅来自 \(D_i\)。这避免了超总体假设,且偏倚项的结构直接反映“处理概率异质性如何与潜在结果关联”——这正是实证研究者关心的“选择偏倚”的数学化。
三、这篇论文做了什么¶
三句话: ① 研究了准实验设定下(IV、DID、RDD 等)有限总体因果估计量的 estimand 解释、选择偏倚导致的偏倚与推断扭曲问题; ② 核心工具是有限总体设计推断框架(处理分配随机但允许倾向得分异质)+ estimand 分解 + 偏倚-推断扭曲的参数化敏感性分析; ③ 主要结论:给出了常见准实验估计量 estimand 对应可解释因果参数的条件,刻画了条件违反时的偏倚与推断扭曲,并提供了可操作的敏感性分析框架。
关键设定与假设:
在第二节最小记号基础上补全:
- 有限总体与潜在结果:\(N\) 个单位,潜在结果 \(Y_i(d)\),可观测协变量 \(X_i\),处理 \(D_i\)。
- 处理分配机制:
- 假设 1(随机分配):\(D_i\) 独立(跨单位)或满足某聚类/面板结构下的独立约束(如 DID 下时间维度的独立冲击)。这是设计推断的核心——将 \(D_i\) 视为随机源。
- 假设 2(异质性倾向得分):\(\pi_i := P(D_i = 1)\) 可跨单位异质,且可与潜在结果相关——这是本文对经典设计推断的关键放松,允许未观测选择偏倚。
- 假设 3(条件独立/无选择偏倚的条件版本):在某些条件下(如给定 \(X_i\) 后 \(\pi_i(X_i)\) 与潜在结果无关,或 \(\pi_i\) 满足某参数约束),选择偏倚项为零——这是 estimand 可解释的必要条件。
- 准实验估计量:本文覆盖 IV(\(\hat{\tau}_{IV}\))、DID(\(\hat{\tau}_{DID}\))、RDD 等的具体设定,各自有额外的工具变量/时间/断点结构,但核心数学处理同最小内核:对 \(D_i\)(或工具变量 \(Z_i\))取期望,分解 estimand。
统计含义与文献对比: - 假设 1-2 的组合(随机分配但异质倾向得分)对应实证研究者常说的“处理分配有随机变异,但单位可能自选进入处理”——这比经典设计推断的“等概率随机化”更贴合准实验现实,比超总体假设更贴合有限总体语言。 - 假设 3 的条件版本(如条件无选择偏倚)对应经典因果推断的 ignorability / unconfoundedness,但本文在有限总体下重新表述,且明确指出当其违反时的偏倚结构——这比超总体下的敏感性分析(如 Rosenbaum 2002)更直接地连接到估计量的 estimand 分解。
主要结果:
结果 1:Estimand 的因果解释条件(对应定理 1 / 命题 1 系列) - 陈述:对于 OLS、IV、DID 等准实验估计量,其 estimand(对处理分配取期望)可分解为 \(E_D[\hat{\tau}] = \tau_{\text{target}} + \text{Bias}_{\text{selection}}\),其中 \(\tau_{\text{target}}\) 是某可解释的有限总体因果参数(如 ATE、LATE、加权 ATE),\(\text{Bias}_{\text{selection}}\) 是倾向得分异质性与潜在结果关联导致的偏倚项。当满足某条件(如 \(\pi_i\) 与个体效应无关,或给定 \(X_i\) 后无关)时,\(\text{Bias}_{\text{selection}} = 0\),estimand 等于 \(\tau_{\text{target}}\)。 - 直觉:估计量目标参数的因果解释力,取决于“处理概率的异质性是否与潜在结果异质性相关”——若无关,则随机分配消除了选择偏倚,estimand 回归因果参数;若相关,则 estimand 偏离。 - 必要条件:对 OLS,需要 \(\pi_i\) 与 \(Y_i(1)-Y_i(0)\) 无关(或给定 \(X_i\) 后无关);对 IV,需要工具变量倾向得分与潜在结果无关(且满足单调性等标准 IV 条件);对 DID,需要处理概率的时间变化与个体效应无关(平行趋势的设计推断版本)。 - 解决的技术难点:在有限总体下,将 OLS/IV/DID 估计量的非线性 estimand(涉及 \(\sum D_i / \sum Y_i\) 等比率)展开为偏倚项的显式表达——这需要精确的 Taylor 展开/线性近似,且偏倚项的系数结构必须反映 \(\pi_i\) 与潜在结果的协方差。
结果 2:偏倚与推断扭曲的刻画(对应定理 2 / 命题 2 系列) - 陈述:当 estimand 可解释条件违反时,偏倚项 \(\text{Bias}_{\text{selection}}\) 的量级由 \(\pi_i\) 与潜在结果的关联强度决定(如协方差 \(\text{Cov}(\pi_i, Y_i(1)-Y_i(0))\) 或其条件版本)。推断扭曲(置信区间覆盖概率偏离名义水平)由偏倚与估计量标准误的比例决定:\(\text{Distortion} \approx \frac{\text{Bias}_{\text{selection}}}{\text{SE}(\hat{\tau})}\)。 - 直觉:偏倚相对于标准误越大,置信区间越不可能覆盖真实因果参数——这给出了“推断失效的定量阈值”。 - 必要条件:需要估计量方差在有限总体下的精确/近似表达(本文沿用 Neyman 式方差估计,并修正异质性倾向得分的影响)。
结果 3:敏感性分析框架(对应第 4 节 / 命题 3 系列) - 陈述:将不可观测的关联参数化(如设 \(\text{Cov}(\pi_i, Y_i(1)-Y_i(0)) \in [-\delta, \delta]\) 或 \(\text{Corr}(\pi_i, Y_i(1)-Y_i(0)) \in [-\rho, \rho]\)),计算偏倚与推断扭曲的范围,得到“对选择偏倚强度 \(\delta\) 或 \(\rho\) 的稳健性区间”。 - 直觉:实证研究者可以问:“我的结论在多大程度的未观测选择偏倚下仍然成立?”——本文框架直接回答这个问题,给出偏倚与覆盖概率的定量范围。 - 与已有文献对比:相比 Rosenbaum (2002) 的超总体敏感性分析(基于符号检验),本文框架在有限总体下直接操作估计量的 estimand 分解,更贴合 OLS/IV/DID 的点估计与置信区间语言;相比 Masten & Poirier (2020) 的超总体参数化敏感性分析,本文避免了超总体假设,且偏倚项的结构更直接。
证明路线与技术技巧:
整体路线(以 OLS 为例,IV/DID 结构类似): 1. Estimand 展开:对 \(\hat{\tau}_{OLS}\) 在有限总体下对 \(D_i\) 取期望,利用 \(E_D[D_i] = \pi_i\) 与 \(E_D[D_i Y_i] = \pi_i Y_i(1)\),将 estimand 展开为 \(\tau + \text{Bias}_{\text{selection}}\) 的显式表达。关键步骤是处理比率估计量(\(\sum D_i / \sum Y_i\))的非线性——用 Taylor 展开近似到一阶/二阶。 2. 偏倚项结构化:将 \(\text{Bias}_{\text{selection}}\) 重写为 \(\frac{1}{N} \sum_i w_i (\pi_i - \bar{\pi}) (Y_i(1)-Y_i(0)-\tau)\),其中 \(w_i\) 是已知权重(由 \(\bar{\pi}\) 决定)。这直接显示偏倚由 \(\pi_i\) 与个体效应的协方差驱动。 3. 条件化消偏:引入条件(如 \(\pi_i\) 与个体效应无关),证明偏倚项为零,estimand 等于 \(\tau\)。 4. 方差与推断扭曲:计算 \(\hat{\tau}_{OLS}\) 在有限总体下的方差(沿用 Neyman 式但修正异质 \(\pi_i\)),将偏倚与标准误的比值量化推断扭曲。 5. 敏感性参数化:将不可观测的 \(\text{Cov}(\pi_i, Y_i(1)-Y_i(0))\) 参数化为 \(\delta\) 或 \(\rho\),计算偏倚与推断扭曲的范围,得到稳健性区间。
关键跳跃点: - 比率估计量的 estimand 展开:\(\hat{\tau}_{OLS}\) 是比率估计量(涉及 \(\sum D_i\) 的随机分母),其精确期望难以计算。作者用 Taylor 展开近似,并在大 \(N\) 下证明近似误差可忽略——这是技术上的关键跳跃,需要控制近似误差与异质 \(\pi_i\) 的交互。 - IV/DID 的 estimand 分解:IV 估计量涉及工具变量 \(Z_i\) 的两阶段结构,DID 涉及时间维度的差分——这些设定下的 estimand 分解比 OLS 更复杂,需要额外处理 \(Z_i\) 的随机性与时间冲击的独立结构。作者的核心技巧是“将 IV/DID 的估计量统一视为对某随机分配(\(Z_i\) 或时间冲击)取期望的比率估计量,然后用类似的 Taylor 展开与偏倚分解处理”。
技术技巧点名: - Taylor 展开 / 比率估计量近似:用于处理 \(\hat{\tau}_{OLS}\) 等比率估计量的非线性 estimand,将期望近似为线性偏倚项 + 可忽略的高阶误差。 - 有限总体方差分析(Neyman 式):用于计算异质 \(\pi_i\) 下估计量的方差,修正经典 Neyman 方差公式以容纳倾向得分异质性。 - 参数化敏感性分析:将不可观测关联(\(\text{Cov}(\pi_i, Y_i(1)-Y_i(0))\))参数化为有界区间,计算偏倚与推断扭曲的范围——这是本文敏感性框架的核心操作,类似 Rosenbaum 但在有限总体 estimand 分解下执行。 - 条件期望与协方差分解:用于在给定 \(X_i\) 后将偏倚项分解为条件版本,从而给出“条件无选择偏倚”的 estimand 可解释条件。
真实例子与应用:
本文包含真实数据例子:
- 场景与数据:使用 Card (1993) 的经典 IV 数据集——研究教育对工资的因果效应,工具变量为是否靠近四年制大学(距离指标)。数据为有限总体(某地区个体),处理为教育年限(二值化或连续),结果为工资。
- 如何应用本文方法:
- 计算 IV 估计量 \(\hat{\tau}_{IV}\) 的点估计与标准误。
- 用本文框架分解 IV estimand:在“工具变量分配与潜在结果无关”条件下,estimand 对应有限总体 LATE;当条件违反时,偏倚项由距离指标倾向得分与潜在工资的关联决定。
- 进行敏感性分析:将不可观测的关联参数化(如设 \(\text{Cov}(\pi_i(Z_i), Y_i(1)-Y_i(0)) \in [-\delta, \delta]\)),计算偏倚范围与置信区间覆盖概率的扭曲范围。
- 得到的结果:展示了在 Card (1993) 数据上,IV 结论对未观测选择偏倚的稳健性——例如,在多大程度的 \(\delta\) 下,教育对工资的正效应仍然显著(置信区间仍覆盖正值)。
- 例子想说明什么:验证本文敏感性分析框架的可操作性,展示实证研究者如何用它定量评估准实验结论对选择偏倚的稳健性——这是对纯理论结果的实证落地。
🔎 结论是否比证明窄: - 本文的 estimand 分解与偏倚刻画在大 \(N\) 下依赖 Taylor 展开近似,精确期望与近似期望的误差在定理中被证明为 \(O(1/N)\) 或可忽略——但作者在正文中有时泛泛 claim“estimand 等于 \(\tau + \text{Bias}\)”,未每次强调这是近似结果。研究者需注意:严格结论是“近似 estimand = \(\tau + \text{Bias}\)”,精确 estimand 有高阶修正项。 - 敏感性分析框架的参数化(\(\delta\) 或 \(\rho\) 的有界区间)是假设而非结论——作者 claim 这提供了“稳健性评估”,但稳健性区间的有效性依赖于参数化假设是否合理,这一点在文中被承认但未深入讨论。
四、开放问题(点到为止,扎根具体语句)¶
-
有限总体下的效率界与最优估计量:本文给出了 estimand 可解释的条件与偏倚刻画,但未讨论“在异质 \(\pi_i\) 且条件无选择偏倚下,是否存在有限总体版本的半参数效率界?最优估计量是否仍是 OLS/IV/DID,还是需要倾向得分加权/双重稳健估计量?”——扎根在本文第 2 节对 estimand 条件的讨论,以及 intro 中未引用的 Li & Ding (2017) 等有限总体效率工作。
-
高阶偏倚修正与 HOIF 的连接:本文的偏倚项是 \(\pi_i\) 与潜在结果的一阶协方差;当条件违反时,是否存在高阶偏倚项(涉及 \(\pi_i\) 的高阶矩与潜在结果的高阶交互)?能否用 Higher-Order Influence Functions(HOIF)在有限总体下做偏倚校正?——扎根在本文定理 2 的偏倚刻画仅到一阶,以及研究者熟悉的 HOIF 框架(Robins et al. 2000 系列)。
-
超总体与有限总体框架的定量对比:本文 claim 有限总体框架更贴合实证研究者直觉,但未定量对比“同一估计量在超总体 vs. 有限总体下的 estimand 与偏倚差异”——扎根在 intro 对超总体路线的批评(“与实证研究者讨论数据变异的方式不一致”),以及未引用的 Masten & Poirier (2020) 等超总体敏感性分析。
-
连续处理与多维工具变量下的 estimand 分解:本文主要覆盖二值处理与单一工具变量;连续处理(如教育年限)与多维工具变量下的 estimand 分解是否仍可操作?偏倚项的结构是否更复杂?——扎根在本文对 Card (1993) 的应用中教育年限被二值化处理,而原始数据为连续处理,文中未讨论连续情形的推广。
提醒:要确认某条是不是真 gap,去读同子领域近期约 5 篇的 intro——若都指向“有限总体效率界/高阶偏倚修正/连续处理推广”,则为共识真 gap;若互相打架(如有人认为超总体足够、有限总体无额外信息),则为机会。
Maintained by 陈星宇 · Homepage · Source on GitHub