<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>2024s on TouchingFish.top</title><link>https://touchingfish.top/2024/</link><description>Recent content in 2024s on TouchingFish.top</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 18 Dec 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://touchingfish.top/2024/index.xml" rel="self" type="application/rss+xml"/><item><title>Odds Ratio, Risk Ratio, and Risk Difference</title><link>https://touchingfish.top/2024/odds-ratio-risk-ratio-risk-difference/</link><pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/odds-ratio-risk-ratio-risk-difference/</guid><description>&lt;p&gt;一切从一张 2×2 表开始。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Event&lt;/th&gt;
 &lt;th&gt;No Event&lt;/th&gt;
 &lt;th&gt;Total&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Treated&lt;/td&gt;
 &lt;td&gt;a&lt;/td&gt;
 &lt;td&gt;b&lt;/td&gt;
 &lt;td&gt;a+b&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Control&lt;/td&gt;
 &lt;td&gt;c&lt;/td&gt;
 &lt;td&gt;d&lt;/td&gt;
 &lt;td&gt;c+d&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;你做了一个 RCT，收了三百个人。一百五在治疗组，一百五在对照组。治疗组发生事件的人数是 a，对照组是 c。&lt;/p&gt;
&lt;p&gt;你对着这张表算出了三个数。它们趴在同一个数据的背上，长得像三胞胎，但其实是三种完全不同的语言。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RD: Risk Difference&lt;/strong&gt; = $p_1 - p_0 = \frac{a}{a+b} - \frac{c}{c+d}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RR: Risk Ratio&lt;/strong&gt; (或 Relative Risk) = $\frac{p_1}{p_0} = \frac{a/(a+b)}{c/(c+d)}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OR: Odds Ratio&lt;/strong&gt; = $\frac{p_1/(1-p_1)}{p_0/(1-p_0)} = \frac{ad}{bc}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三个数都从四个格子里长出来。但它们讲的故事不一样。选错了，你的结论就可能从&amp;quot;有效&amp;quot;变成&amp;quot;无效&amp;quot;——或者反过来，把一个小效应吹成一个中药丸子的神话。&lt;/p&gt;
&lt;h2 id="rd最直观也最不老实"&gt;RD：最直观，也最不老实&lt;/h2&gt;
&lt;p&gt;RD 是治疗组和对照组在事件发生率上的绝对差距。加性尺度（additive scale）。很直白：每治疗 100 人，多救（或多伤）几个。&lt;/p&gt;
&lt;p&gt;RD = 0.05 意味着治疗组比对照组多 5 个百分点的人发生了（或避免了）事件。&lt;/p&gt;
&lt;p&gt;它和 NNT（Number Needed to Treat，需治疗人数）有一条简洁的通道：&lt;/p&gt;
$$NNT = \frac{1}{|RD|}$$&lt;p&gt;RD = 0.10 → NNT = 10。每治疗 10 个人，多避免 1 次事件。临床医生爱 NNT，因为它是唯一一个可以像钱一样直接&amp;quot;花&amp;quot;的数字——给多少人用药，换多少获益。&lt;/p&gt;</description></item><item><title>人会犯错，分组不会</title><link>https://touchingfish.top/2024/intention-to-treat-vs-per-protocol/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/intention-to-treat-vs-per-protocol/</guid><description>&lt;p&gt;设想一个场景。&lt;/p&gt;
&lt;p&gt;你是一个统计师，面前摆着一份 RCT 的 CRF（Case Report Form，病例报告表）。受试者编号 017，按随机表被分到了治疗组。方案说每天一片药，吃六个月。你在随访记录里看到：第二个月开始，017 的依从性（compliance）断崖式下降。药片计数显示他大概只吃了一半。第六个月的时候，他人还在，药已经不怎么碰了。&lt;/p&gt;
&lt;p&gt;然后你翻到他的主要终点数据。他的血压降了 15 mmHg。对照组的平均降幅是 8 mmHg。&lt;/p&gt;
&lt;p&gt;你怎么办？把他扔进分析里，还是不扔？&lt;/p&gt;
&lt;p&gt;这个问题看起来像一道统计题，但它不是。它是一个关于&amp;quot;你到底想说什么&amp;quot;的问题——而你在这一刻的选择，决定了你的结论是一个政策建议，还是一个生物学论断。&lt;/p&gt;
&lt;h2 id="itt一旦随机永远分析"&gt;ITT：一旦随机，永远分析&lt;/h2&gt;
&lt;p&gt;ITT 的全称是 Intention-to-Treat。它的定义硬到没有商量余地：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Once randomized, always analyzed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有被随机化的受试者，都按他们被分配到的组别进行分析——不管他们有没有接受分配的治疗、有没有违反方案（protocol deviation）、有没有中途退出（withdrawal）。哪怕 017 一颗药都没吃，他在分析中仍然是&amp;quot;治疗组&amp;quot;的一员。&lt;/p&gt;
&lt;p&gt;这个原则的完整英文表述值得全文引用：All randomized subjects are analyzed according to the group to which they were randomly assigned, regardless of whether they received the allocated treatment, deviated from the protocol, or withdrew from the study.&lt;/p&gt;
&lt;p&gt;翻译成人话：你当初把他随机分到哪一组，数据分析的时候就把他放在哪一组。后面发生的一切——吃不吃药、跑不跑路——都不能改变这个归属。&lt;/p&gt;
&lt;p&gt;听起来有点不讲道理。&lt;/p&gt;
&lt;p&gt;但它背后有一条统计学的脊梁：随机化（randomization）是推断的根基。ITT 保护的正是随机化所创造的组间可比性（comparability）。把那些不依从的人扔掉，你就打破了随机化——因为不依从（non-adherence）不是随机发生的。扔掉的人不是随机样本，而是有共同特征的一群人。&lt;/p&gt;
&lt;p&gt;这个逻辑并不复杂，但它的后果很深。&lt;/p&gt;
&lt;h2 id="为什么-itt-对-superiority-trial-是金标准"&gt;为什么 ITT 对 superiority trial 是金标准&lt;/h2&gt;
&lt;p&gt;ITT 对于优效性试验（superiority trial）有一个被广泛接受的定性判断：它是保守的（conservative）。&lt;/p&gt;</description></item><item><title>你用 N 赌一个 p 值 / Sample Size Estimation</title><link>https://touchingfish.top/2024/sample-size-estimation/</link><pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/sample-size-estimation/</guid><description>&lt;p&gt;一个临床医生和一个统计师在走廊里相遇。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这个试验需要多少人？&amp;rdquo; 医生问。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;那要看你想证明什么。&amp;rdquo; 统计师说。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;证明药有效啊。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;多少算有效？&amp;rdquo;&lt;/p&gt;
&lt;p&gt;医生想了三秒，给了一个数字。统计师在脑子里跑了一遍公式，又给了一个数字。&lt;/p&gt;
&lt;p&gt;这场对话每天都在发生。但它底下藏着的逻辑，远比一句&amp;quot;样本量不够&amp;quot;要复杂。样本量估计（sample size estimation）不是在报表里填一个数字，而是把整个试验设计写成一个等式——然后把你的预算、你的野心、你愿意承担的犯错概率，全部扔进这个等式的一边，看另一边跳出多少 N。&lt;/p&gt;
&lt;p&gt;你手里的钱（N），去赌一个可以承受的错误概率（α 和 β）。问题是，这场交易里有太多人想偷你的 N：脱落率（dropout rate）、多重比较（multiplicity）——你每防住一个，就得加点钱。&lt;/p&gt;
&lt;h2 id="四种关系四种方程"&gt;四种关系，四种方程&lt;/h2&gt;
&lt;p&gt;在开始之前，先搞清楚我们到底想证明什么。&lt;/p&gt;
&lt;p&gt;临床上常见的比较设计有四种，英文标准名称写在这里，因为中文翻译常常混用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Superiority trial&lt;/strong&gt;（优效性试验）：证明 A 比 B 好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-inferiority trial&lt;/strong&gt;（非劣效性试验）：证明 A 不比 B 差太多，差在可接受范围内。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Equivalence trial&lt;/strong&gt;（等效性试验）：证明 A 和 B 在某个范围内等效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bioequivalence study&lt;/strong&gt;（生物等效性研究）：证明仿制药和原研药在药代动力学参数上等价。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;四种关系的数学表达各不相同，公式也因此不一样。&lt;/p&gt;
&lt;p&gt;先讲最常见的 superiority trial。另外三种的逻辑差异主要在界值（margin）的设定上，原理相通，本文不展开。&lt;/p&gt;
&lt;h2 id="两类错误你可以犯错但不能白犯错"&gt;两类错误：你可以犯错，但不能白犯错&lt;/h2&gt;
&lt;p&gt;这是整个样本量估计的理论地基。如果这块没理解，后面的公式就是一堆符号。&lt;/p&gt;
&lt;h3 id="type-i-error-α"&gt;Type I error (α)&lt;/h3&gt;
&lt;p&gt;也叫 significance level（显著性水平）。&lt;/p&gt;
&lt;p&gt;定义：$H_0$ 为真时，你错误地拒绝了 $H_0$。&lt;/p&gt;
&lt;p&gt;翻译成人话：药其实没用，但你的数据&amp;quot;看起来&amp;quot;像是有用。你被数据骗了。&lt;/p&gt;
&lt;p&gt;典型值是 0.05（双侧，two-sided）。也就是说，你愿意接受在 20 次试验里被数据骗 1 次的概率。&lt;/p&gt;
&lt;p&gt;（我自己学到这里的时候，总觉得 0.05 是个任意的数字——为什么不是 0.04 或 0.06？后来才明白，它确实是任意的。Fisher 当年说&amp;quot;it is convenient to take this point as a limit&amp;quot;，翻译过来就是&amp;quot;我觉得这个数字挺方便&amp;quot;。方便而已。）&lt;/p&gt;</description></item><item><title>树—数据—假设</title><link>https://touchingfish.top/2024/tree-data-and-hypothesis/</link><pubDate>Tue, 10 Dec 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/tree-data-and-hypothesis/</guid><description>&lt;p&gt;PGLS 最像一面镜子：它不一定告诉你新东西，但它很擅长把你原来不愿意看的细节照出来。&lt;/p&gt;
&lt;p&gt;比如这些：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你的物种名到底有没有对齐&lt;/li&gt;
&lt;li&gt;你的分支长度代表什么&lt;/li&gt;
&lt;li&gt;你有没有在无意中让几条异常点替你&amp;quot;完成论证&amp;quot;&lt;/li&gt;
&lt;li&gt;你拿到的是一棵树，还是一堆不确定的树&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我不是在吓人。我只是说：PGLS 的麻烦，大部分不在数学里，在整理里。&lt;/p&gt;
&lt;p&gt;这篇我想写成一个&amp;quot;用前自检 + 用后诊断&amp;quot;的清单，但还是按随笔的方式写：因为真正的坑，往往不是你不会做，是你没想到它会坑你。&lt;/p&gt;
&lt;h2 id="先把树和数据对齐"&gt;先把树和数据对齐&lt;/h2&gt;
&lt;p&gt;这一步没做好，后面都是幻觉。&lt;/p&gt;
&lt;h3 id="别信你的眼睛"&gt;别信你的眼睛&lt;/h3&gt;
&lt;p&gt;最常见的错误是：树里叫 &lt;code&gt;Homo_sapiens&lt;/code&gt;，表里叫 &lt;code&gt;Homo sapiens&lt;/code&gt;。&lt;br&gt;
你以为只是一个空格，代码会很礼貌地替你处理。&lt;br&gt;
但它经常不会，它只会很安静地把样本丢掉。&lt;/p&gt;
&lt;p&gt;我建议你在任何拟合之前，强制做三件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;显式列出：树里有哪些 tip label，数据里有哪些 species&lt;/li&gt;
&lt;li&gt;计算交集与差集，并把差集打印出来&lt;/li&gt;
&lt;li&gt;最终拟合使用的物种数写进结果里（别让它悄悄变化）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="时间还是替换数"&gt;时间，还是替换数&lt;/h3&gt;
&lt;p&gt;你当然可以说&amp;quot;我用的就是这棵树&amp;quot;。&lt;br&gt;
但 PGLS 会追问：你这棵树的分支长度是什么意思？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时间树（ultrametric）更直观：共享历史 = 共享时间&lt;/li&gt;
&lt;li&gt;替换数树有时也能用，但解释要更谨慎：共享历史更像&amp;quot;共享变化量&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（你不写清楚，读者很难判断你 $\Sigma$ 的意义是什么。）&lt;/p&gt;
&lt;h3 id="一棵树还是一堆树"&gt;一棵树，还是一堆树&lt;/h3&gt;
&lt;p&gt;很多时候我们只有一棵&amp;quot;最佳树&amp;quot;，于是就拿它当唯一真相。&lt;/p&gt;
&lt;p&gt;但如果你的树来自贝叶斯后验或 bootstrap，你其实已经有一堆树了。&lt;br&gt;
那你至少可以做一件很便宜的事：在多棵树上重复拟合，看看结论是否稳定。&lt;/p&gt;
&lt;p&gt;结论不稳定并不可耻。可耻的是你明明可以检查，却假装不知道。&lt;/p&gt;
&lt;h2 id="残差里藏了什么"&gt;残差里藏了什么&lt;/h2&gt;
&lt;p&gt;PGLS 的核心假设，是误差结构与树一致（或经 $\lambda$ 调过后足够一致）。&lt;br&gt;
所以你需要看的不是只有系数和 p 值，还有残差。&lt;/p&gt;
&lt;p&gt;我通常会做这几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;残差 vs 拟合值：有没有明显模式（非线性、异方差）&lt;/li&gt;
&lt;li&gt;影响点：有没有某个物种把斜率拽得太狠&lt;/li&gt;
&lt;li&gt;系统发育信号：残差里是否仍有明显系统发育结构（意味着模型没吃掉你以为它能吃掉的那部分）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步的心态很重要：诊断不是为了证明你对，而是为了找出你错在哪儿。&lt;/p&gt;
&lt;h3 id="残差诊断的统计学基础"&gt;残差诊断的统计学基础&lt;/h3&gt;
&lt;h4 id="残差的定义"&gt;残差的定义&lt;/h4&gt;
&lt;p&gt;在 GLS/PGLS 下，残差定义为：&lt;/p&gt;
$$e = y - X\hat{\beta}_{GLS}$$&lt;p&gt;在 OLS 下，残差方差是常数（$\sigma^2$）；但在 GLS 下，由于 $\Sigma$ 不是对角矩阵，原始残差 $e$ 的方差不是常数——离根越近的物种的残差，通常方差更大。&lt;/p&gt;</description></item><item><title>不爱解释的人 / Phylogenetic GLS</title><link>https://touchingfish.top/2024/phylogenetic-generalized-least-square/</link><pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/phylogenetic-generalized-least-square/</guid><description>&lt;p&gt;同一份数据，同一个自变量，同一个因变量。&lt;/p&gt;
&lt;p&gt;OLS 说：显著。&lt;/p&gt;
&lt;p&gt;PGLS 说：不显著。&lt;/p&gt;
&lt;p&gt;很想把锅甩给树：是不是树不对？是不是分支长度乱了？&lt;/p&gt;
&lt;p&gt;还是哪里写错了代码？&lt;/p&gt;
&lt;p&gt;PGLS 只是站在那儿，像一个不爱解释的人。&lt;/p&gt;
&lt;p&gt;这篇我想用一种不那么&amp;quot;公式&amp;quot;的方式，讲清楚 PGLS 到底在做什么。&lt;/p&gt;
&lt;p&gt;你只需要抓住一个中心句：&lt;/p&gt;
&lt;p&gt;PGLS 不是换了一个更玄的回归，它只是承认误差有相关结构。&lt;/p&gt;
&lt;h2 id="误差像一盘散沙"&gt;误差像一盘散沙&lt;/h2&gt;
&lt;p&gt;普通线性回归（OLS，Ordinary Least Squares，普通最小二乘法）通常默认：&lt;/p&gt;
$$\epsilon \sim N(0, \sigma^2 I)$$&lt;p&gt;这里 $I$ 的意思很朴素：误差之间互不相关，方差还都一样。&lt;/p&gt;
&lt;p&gt;你可以把它理解成：每个物种的&amp;quot;解释不掉的那部分&amp;quot;，互相之间不应该传染。&lt;/p&gt;
&lt;p&gt;但系统发育数据里，这个默认经常站不住脚：近缘物种共享历史，解释不掉的那部分会一起漂。&lt;/p&gt;
&lt;p&gt;于是你进入另一个世界。&lt;/p&gt;
&lt;h3 id="ols-估计量的完整推导"&gt;OLS 估计量的完整推导&lt;/h3&gt;
&lt;p&gt;$y$ 是因变量的向量（每个物种一个值），$X$ 是设计矩阵（每行一个物种，每列一个自变量，第一列通常是全 1，代表截距），$\beta$ 是我们要估计的系数向量。符号 $'$ 表示转置。&lt;/p&gt;
&lt;p&gt;OLS 想做的事情很简单：找一组 $\beta$，让预测值 $X\beta$ 和观测值 $y$ 之间的残差平方和最小。目标函数写成矩阵形式就是：&lt;/p&gt;
$$S(\beta) = (y - X\beta)'(y - X\beta)$$&lt;p&gt;把它展开，是为了后面能对 $\beta$ 求导：&lt;/p&gt;
$$S(\beta) = y'y - y'X\beta - \beta'X'y + \beta'X'X\beta$$&lt;p&gt;中间两项看起来不一样，其实 $y'X\beta$ 是一个标量（1×1 的数），标量的转置等于自己，所以 $\beta'X'y = (y'X\beta)' = y'X\beta$。合并之后：&lt;/p&gt;</description></item><item><title>一棵树，怎么长出一个协方差矩阵</title><link>https://touchingfish.top/2024/pagels-lambda/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/pagels-lambda/</guid><description>&lt;p&gt;我以前对&amp;quot;在树上做统计&amp;quot;最大的抵触，不是我不信树，而是我不信那句很随意的话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;我们假设性状沿着树做 Brownian motion。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;听起来像一句推脱。像你问一个人为什么迟到，他说：&amp;ldquo;路上有点堵。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;堵在哪儿？怎么堵的？堵到什么程度？有没有备选路线？——你越问越像在吵架。&lt;/p&gt;
&lt;p&gt;但后来我发现，Brownian motion（BM）在这里的意义，和&amp;quot;世界真的在做随机游走&amp;quot;没什么关系。它更像是一种最小的诚实：你承认性状会变、承认变化会积累、承认近缘会更像，然后你就能把&amp;quot;历史&amp;quot;写成一张可以计算的表。&lt;/p&gt;
&lt;p&gt;那张表就是协方差矩阵：$\Sigma$。&lt;/p&gt;
&lt;p&gt;这篇我想把三件事讲清楚：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BM 在系统发育语境下到底是什么（别把它当玄学）&lt;/li&gt;
&lt;li&gt;为什么 $\Sigma_{ij}$ 只和&amp;quot;共享祖先到根的那段路&amp;quot;有关&lt;/li&gt;
&lt;li&gt;Pagel&amp;rsquo;s $\lambda$ 到底在调什么：不是调&amp;quot;模型拟合&amp;quot;，而是在调&amp;quot;你愿意相信多少历史&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="先把-brownian-motion-说成一句人话"&gt;先把 Brownian motion 说成一句人话&lt;/h2&gt;
&lt;p&gt;BM 在这里可以理解成：&lt;/p&gt;
&lt;p&gt;性状的增量（变化）在每一小段时间里都是随机的，方向不固定；但变化会累计，所以时间越长，方差越大。&lt;/p&gt;
&lt;p&gt;你不必把它当作宇宙真理。你只要把它当作一个&amp;quot;最低成本&amp;quot;的默认假设：它不要求你知道选择压力、也不要求你知道适应峰值在哪里；它只是说——不解释的东西，就先当成随机漂移。&lt;/p&gt;
&lt;p&gt;于是你立刻得到一个很实用的结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沿着分支走得越久，性状的不确定性越大&lt;/li&gt;
&lt;li&gt;两个物种如果共享一段历史，它们那段历史里累积的&amp;quot;漂移&amp;quot;是同一份，所以它们会相关&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关性在这里不是&amp;quot;统计技巧&amp;quot;，是&amp;quot;共享账本&amp;quot;。&lt;/p&gt;
&lt;h3 id="brownian-motion-的严格定义"&gt;Brownian Motion 的严格定义&lt;/h3&gt;
&lt;p&gt;上面的人话版够用了，但如果你想完全理解后面的推导，这里有一份不走捷径的版本。&lt;/p&gt;
&lt;p&gt;一维标准 Brownian Motion $W(t)$ 是一个随机过程，满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;初始条件：$W(0) = 0$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独立增量：对任意 $0 \leq s &lt; t$，增量 $W(t) - W(s)$ 与 $\{W(u): u \leq s\}$ 独立&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正态增量：$W(t) - W(s) \sim N(0, \sigma^2(t - s))$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;连续路径：$W(t)$ 关于 $t$ 几乎必然连续&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第 3 条是核心：增量服从正态分布，方差随时间线性增长。这直接导致&amp;quot;走得越久，方差越大&amp;quot;这个结论。&lt;/p&gt;</description></item><item><title>亲缘关系到底哪里不讲道理 / Phylogeny</title><link>https://touchingfish.top/2024/phylogenetic-relationships/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/phylogenetic-relationships/</guid><description>&lt;p&gt;第一次认真看系统发育树的时候——一堆分叉的线条，像冬天窗户上的霜花。然后有人指着它说：这代表亲缘关系。接着就很自然地推出一句更狠的话：你的数据不独立。&lt;/p&gt;
&lt;p&gt;（我当时的反应大概是：我怎么就不独立了？我每个物种都只记录了一行数据啊。很独立，很孤独，甚至。）&lt;/p&gt;
&lt;p&gt;但这句话——&amp;ldquo;不独立&amp;rdquo;——其实是整套 phylogenetic comparative methods（系统发育比较方法）的门把手。你要进去，得先承认门在那儿。&lt;/p&gt;
&lt;p&gt;今天我想把这件事说得朴素一点：树不是装饰，它在记账；而相关性这东西，会从历史里长出来。&lt;/p&gt;
&lt;h2 id="树在用什么货币记账"&gt;树在用什么货币记账&lt;/h2&gt;
&lt;p&gt;系统发育树最核心的两件东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拓扑（topology）：谁和谁更近，分叉顺序是什么&lt;/li&gt;
&lt;li&gt;分支长度（branch length）：每条边&amp;quot;有多长&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;拓扑像族谱：你是我表弟还是堂弟，这种事不关心你长多高。&lt;br&gt;
分支长度像时间或变化量：这才开始关心&amp;quot;隔了多久&amp;quot;&amp;ldquo;变了多少&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;问题是：分支长度到底是什么？&lt;/p&gt;
&lt;p&gt;常见两种含义：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按时间计：单位可能是百万年（Myr）。这类树往往是 ultrametric（所有叶子到根的距离相同），因为&amp;quot;都活到今天&amp;quot;。&lt;/li&gt;
&lt;li&gt;按替换数计：单位更像&amp;quot;每位点多少替换&amp;quot;。这类树不一定 ultrametric。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我更愿意把这件事叫做：树在用两种货币记账。你拿时间树去算替换、拿替换树去当时间，都会&amp;quot;余额不对&amp;quot;。&lt;/p&gt;
&lt;p&gt;后面做 PGLS（Phylogenetic Generalized Least Squares，系统发育广义最小二乘）的时候，这个&amp;quot;货币单位&amp;quot;会悄悄进入协方差矩阵里，影响你认为&amp;quot;相关性该有多强&amp;quot;。所以它不是细节，是地基。&lt;/p&gt;
&lt;h2 id="根外群以及方向感"&gt;根、外群，以及方向感&lt;/h2&gt;
&lt;p&gt;没有根的树（unrooted tree）只告诉你&amp;quot;相对关系&amp;quot;，不告诉你&amp;quot;谁先谁后&amp;quot;。&lt;br&gt;
有根的树（rooted tree）才有方向：从祖先走到后代。&lt;/p&gt;
&lt;p&gt;现实里我们常用外群（outgroup）来定根：找一个确定在研究对象之外的物种（或类群），把根放在它和其他物种之间。&lt;/p&gt;
&lt;p&gt;这里的直觉是：根不是为了更好看，是为了让时间的箭头出现。&lt;br&gt;
而一旦时间出现，很多事情就不再是统计上的巧合，而是历史造成的相似。&lt;/p&gt;
&lt;h2 id="别站队先说实话"&gt;别站队，先说实话&lt;/h2&gt;
&lt;p&gt;这两者的矛盾，很多时候不是理论问题，是现实问题：你手里有什么，就用什么，然后你就会担心自己是不是在骗人。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基因树（gene tree）：用某个基因或某段序列推出来的树&lt;/li&gt;
&lt;li&gt;物种树（species tree）：物种分化历史的更理想描述（通常需要多基因、多信息整合）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们不一致很常见：不完全谱系排序（ILS，Incomplete Lineage Sorting）、基因流、水平转移……这些词你以后会越来越熟，熟到有点麻木。&lt;/p&gt;
&lt;p&gt;我先给一个&amp;quot;写作上的诚实原则&amp;quot;（也算一种自我保护）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你用什么树都可以，但你必须写清楚你用的是什么树，以及你为什么这么做。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PGLS 对&amp;quot;树代表相关结构&amp;quot;非常认真。你用错树，它不会骂你，它只会很安静地给你一个看起来很像真的 p 值。&lt;/p&gt;
&lt;p&gt;（这就是我最怕的那种错：它不痛，只是悄悄偏离。）&lt;/p&gt;
&lt;h2 id="走过同一条路而已"&gt;走过同一条路而已&lt;/h2&gt;
&lt;p&gt;在普通线性回归（OLS，Ordinary Least Squares，普通最小二乘法）里，你经常默认：每个样本的误差互不相关。&lt;br&gt;
翻译成人话：你这个物种的&amp;quot;偏差&amp;quot;，不应该能预测另一个物种的&amp;quot;偏差&amp;quot;。&lt;/p&gt;
&lt;p&gt;但如果两个物种共享很长一段进化历史，它们的性状（或者更准确地说：性状里那些你没解释掉的部分）就可能一起漂。&lt;/p&gt;
&lt;p&gt;你可以把它想成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两个人从同一个起点出发走路&lt;/li&gt;
&lt;li&gt;走到某个路口才分开&lt;/li&gt;
&lt;li&gt;分开之前，他们走过的路完全一样&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你说他们最后的位置会不会更像？会的。&lt;br&gt;
不是因为他们商量过，是因为他们共同经历过。&lt;/p&gt;
&lt;p&gt;这就是系统发育相关性最朴素的来源：共享祖先的时间越长，性状越相关（在某些模型假设下，比如 Brownian motion，我们下一篇会讲）。&lt;/p&gt;
&lt;p&gt;所以&amp;quot;非独立&amp;quot;不是一句道德指控，它只是你对世界的一种承认：历史会留下惯性。&lt;/p&gt;
&lt;h2 id="先偷看一眼-pgls-在修什么"&gt;先偷看一眼 PGLS 在修什么&lt;/h2&gt;
&lt;p&gt;先不讲公式，只讲一句话：&lt;/p&gt;</description></item><item><title>为了追剧（Binge on My Own Terms）</title><link>https://touchingfish.top/2024/binge-on-my-own-terms/</link><pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/binge-on-my-own-terms/</guid><description>&lt;p&gt;答辩那天，同届学生其他人都是委员会全票通过，只有我拿到一张弃权票。老板跳槽后没有出席，倒也省了看他脸色的麻烦。&lt;/p&gt;
&lt;p&gt;没有什么仪式感。打包，退宿舍，回家。&lt;/p&gt;
&lt;p&gt;汕头六月的太阳毒得很，晒得人无处可逃。毕业前没找到工作，金三银四投出去的简历像石沉大海。&lt;/p&gt;
&lt;p&gt;总得做点什么。&lt;/p&gt;
&lt;p&gt;摆摊卖红豆冰，跟朋友一起买了辆&amp;quot;倒骑驴&amp;quot;，批发了一大袋红豆和一次性杯子。我妈听说我要去摆摊，沉默了几秒钟，说，也好，总比在家里躺着强。&lt;/p&gt;
&lt;p&gt;理想很丰满：烈日炎炎，路人挥汗如雨，来一杯冰镇红豆冰，透心凉。现实很骨感：我这个人太i了，有人走近摊位的时候，恨不得把头埋进冰桶里。眼神对上就开始紧张，话到嘴边变成含糊不清的几个音节。每天就是找个树荫坐下，手机打开，一边投简历一边乘凉。红豆冰自己喝掉了大半。&lt;/p&gt;
&lt;p&gt;朋友问摆摊怎么样，我说挺好，就是有点热。他没追问，我也没多说。&lt;/p&gt;
&lt;p&gt;可能难以融入社会是在逃避创伤。三年下来，老板是自由的，我们是自由的奴隶。导师的责任心差一点，但至少是个好人——这种评价本身就很荒谬。知识结构合理成为永远实现不了的目标。学院教授们一味施压，美其名曰为论文盲审着想，却没人愿意听我怎么答怎么辩。&lt;/p&gt;
&lt;p&gt;倒也不是一无所获。学会了伪装。&lt;/p&gt;
&lt;p&gt;我需要一个缓冲期。一个不用说话、不用见人、不用解释自己为什么还找不到工作的空间。&lt;/p&gt;
&lt;p&gt;追剧。&lt;/p&gt;
&lt;p&gt;最近为入手一年的电视盒子升级一个新系统，试了两三个固件，总算把安卓TV升级到满意的版本。可能是WiFi模块不太兼容，网速一直有点慢。微妙的是，每一次改动路由器的设置，机顶盒就自动关机重启。&lt;/p&gt;
&lt;p&gt;于是，还没怎么追剧，盒子就因为一次次“断开”和“连接”崩溃了。不会焊板，只能默默承受。&lt;/p&gt;
&lt;p&gt;昨晚，拿着手机开始逛京东和淘宝。没错，我准备干脆物色一台新的智能电视。一直对市面上的智能电视没信心——广电备案过的能有什么好产品。家里一直是一部日货外接机顶盒的组合，十年依旧扛打。如今才知道，40寸以上的品牌电视，已经找不到一台非智能的机器了。&lt;/p&gt;
&lt;p&gt;失业多年没有收入，实在是难下剁手决心。&lt;/p&gt;
&lt;p&gt;翻墙倒柜，掏出了去年刚刚换掉的前任机顶盒，却因为卡得无法忍受，而又将其收起。&lt;/p&gt;
&lt;p&gt;今日，学习事毕，对着平板上播放的综艺节目，索然无味。感慨畅享大屏之体验一去不返。又是拿起手机，浏览起了智能电视论坛，寻觅一部物美价廉的替补机顶盒。技术傍身（有一点点动手能力），只要是重新烧录后可以开机的，大抵会考虑低价购入，将就使用。&lt;/p&gt;
&lt;p&gt;意外之喜，看到号称系统老顽固的前任机顶盒，竟然也有可以使用的自制固件。&lt;/p&gt;
&lt;p&gt;工具齐全，开始实操。初次试验，莽莽撞撞。错选版本，中途重置。重振旗鼓，慎之又慎。&lt;/p&gt;
&lt;p&gt;终于，功夫不负有心人。&lt;/p&gt;
&lt;p&gt;在这个晚上，前任机顶盒的不离不弃，为我重新实现了在电视机上收看节目的小确幸。&lt;/p&gt;
&lt;p&gt;感恩美好生活。&lt;/p&gt;</description></item><item><title>一个点的代价 / 读 Owen(2020)</title><link>https://touchingfish.top/2024/dropping-first-sobol-point/</link><pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/dropping-first-sobol-point/</guid><description>&lt;p&gt;Sobol&amp;rsquo; 序列的第一个点永远是原点——$(0, 0, \dots, 0)$。&lt;/p&gt;
&lt;p&gt;很多人觉得这个点不对劲。它刚好落在单位超立方体的角落里。如果你要用 Sobol&amp;rsquo; 点做 Gaussian 分布的变换，逆正态 CDF 会把原点映射到 $-\infty$。这显然没法用。于是大家很自然地把第一个点丢掉，从第二个点开始取 $n$ 个。&lt;/p&gt;
&lt;p&gt;这个操作叫 burn-in，在 MCMC 里是标准动作。问题是——Sobol&amp;rsquo; 序列不是 Markov chain。&lt;/p&gt;
&lt;p&gt;Art B. Owen 在 2020 年写了一篇短文，标题干脆利落：&lt;em&gt;On dropping the first Sobol&amp;rsquo; point&lt;/em&gt;。结论也干脆利落：&lt;strong&gt;别丢。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;丢掉第一个点，你的 QMC 估计的均方根误差（RMSE）可能从 $O(n^{-3/2})$ 退化到 $O(n^{-1})$——在 $n$ 很大的时候，差别大约是 $\sqrt{n}$ 倍。&lt;/p&gt;
&lt;h2 id="qmc-为什么比-mc-好"&gt;QMC 为什么比 MC 好&lt;/h2&gt;
&lt;p&gt;先回顾一下基本设定。&lt;/p&gt;
&lt;p&gt;Monte Carlo（MC）的 RMSE 是 $O(n^{-1/2})$，对任何 $f \in L^2$ 都成立。这个收敛速度稳如老狗，但慢。&lt;/p&gt;
&lt;p&gt;Quasi-Monte Carlo（QMC）试图做得更好。它不随机抽样，而是用精心构造的&lt;strong&gt;低差异序列&lt;/strong&gt;（low-discrepancy sequence）来填满 $[0,1]^d$。Sobol&amp;rsquo; 序列是最常用的一种。&lt;/p&gt;
&lt;p&gt;Sobol&amp;rsquo; 序列在 base 2 下是一个 $(t,d)$-sequence。这意味着它的前 $2^m$ 个点构成一个 $(t,m,d)$-net——对于某些被称为 elementary interval 的特殊长方体，里面的点数恰好和体积成正比。&lt;/p&gt;</description></item><item><title>学术自由，但我们是自由的奴隶</title><link>https://touchingfish.top/2024/free-from-graduate-school/</link><pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/free-from-graduate-school/</guid><description>&lt;p&gt;终于有时间写一下这段悲伤的故事。&lt;/p&gt;
&lt;p&gt;时间回到2021年，研究生复试后的下午，就直接被拉进了课题组的群聊。&lt;/p&gt;
&lt;p&gt;天崩开局。线上开组会，发现组里出现了全学院第一例延毕。&lt;/p&gt;
&lt;p&gt;（万幸的是，不是重蹈覆辙，只是路稍微难走一点。导师虽然不是一个好导师——责任心稍差一点儿——但至少是个好人。）&lt;/p&gt;
&lt;p&gt;每个学生汇报的内容，都是一个独立的项目。课题组没有任何&amp;quot;垂直经验&amp;quot;的沉淀。研究方向的多样性暗示难以想象的&amp;quot;学术自由&amp;quot;。&lt;/p&gt;
&lt;p&gt;事实上，
导师才是自由的，我们只是自由的奴隶。&lt;/p&gt;
&lt;p&gt;于是，&amp;ldquo;知识结构合理&amp;quot;成为了很难实现的目标。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;知识结构合理，具有一定敏锐洞察力、创新能力和学术研究能力，善于将生物学、统计学理论与实践相结合，能独立提出、分析和解决问题，适应于社会需要的生物信息与生物统计学专门人才。（引自院系培养目标）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;又一届学生延毕半年答辩。大家也都看懂了老板的指导方式。只有做他懂的研究才能保证按时毕业。&lt;/p&gt;
&lt;p&gt;还是那句名言，&amp;ldquo;世界上除了导师和自己，没人会认真看你的论文&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;但有一种情况更糟糕，就是导师也不看你的论文。起初以为他只是不愿意花时间去读，并提出修改意见。后来觉得，他，可能不懂，所以不看。&lt;/p&gt;
&lt;p&gt;大疫三年，春暖花开。老板宣布了跳槽消息。&lt;/p&gt;
&lt;p&gt;回校旁听上一届师兄师姐的毕业答辩——&lt;/p&gt;
&lt;p&gt;答辩之前，他们的论文（导师）是绝对没看过。直到盲审成绩下来，一位师姐拿到了一份标记为不及格的报告，被老板提出延毕意见和冷暴力处理。费了一番周折，最终她为自己辩护成功，在第二次送审时拿到了及格成绩，才有机会站上答辩的讲台。&lt;/p&gt;
&lt;p&gt;她的另外两份盲审分数，是那一届最高的，帮助她获得我们专业那一届的论文评优资格。这样的事情，有些荒谬，但略显普通。&lt;/p&gt;
&lt;p&gt;我也在中期汇报的时候开始吃瘪。开题时三缄其口的教授们突然开始发难，并建议我跟导师商量换个课题。老板跳槽之后没有出席，场面真是难堪。&lt;/p&gt;
&lt;p&gt;重新开题意味着直接延毕半年。唯一的救命稻草，可能就是论文被SCI期刊接收吧。&lt;/p&gt;
&lt;p&gt;陆续投了2、3个月的论文，老板还是没看过一眼。&lt;/p&gt;
&lt;p&gt;他隐藏得再好，也无法避免我们在审稿意见上出现分歧时，所暴露出来对这个研究方向的无知，但他是自由的。&lt;/p&gt;
&lt;p&gt;已经习惯了直接发邮件向陌生教授讨教，虽然错过了实习的入职时机，至少拿到了最后一轮投稿返修意见。&lt;/p&gt;
&lt;p&gt;时间来到预答辩阶段，学院的教授们只是一味地施压，美其名曰为我的论文盲审着想。&lt;/p&gt;
&lt;p&gt;都说现在学生答辩是&amp;quot;只答不辩&amp;rdquo;，实际上教授也完全没打算理解你&amp;quot;如何答辩&amp;quot;。&lt;/p&gt;
&lt;p&gt;我只是一个被剥夺发言权的小丑，像前两年在网络上经历的一样。&lt;/p&gt;
&lt;p&gt;战战兢兢的半年，想对自己有信心，却没有任何参考系。写完真正的毕业论文，也只是跟那位一起参加竞赛的同学一起互相校对之后就提交盲审了。&lt;/p&gt;
&lt;p&gt;在答辩前两天才最终拿到了盲审成绩，平平无奇，听说也就第二。答辩还是没有好脸色，甚至在同届学生其他人都是委员会全票通过答辩的情况下，只有我拿到一张弃权票。BTW，老板在我们专业带的另一个同学早在半年前就确定延毕了。&lt;/p&gt;
&lt;p&gt;荒谬的研究生生活画上句号。&lt;/p&gt;
&lt;p&gt;两个月后，论文才正式接收之际，已经因为审稿方意见以及前导师的建议改得面目全非，让我不想承认是自己写的。&lt;/p&gt;
&lt;p&gt;Publish or perish，我理解但不接受。&lt;/p&gt;
&lt;p&gt;前导师作为通讯作者，在确认最后一版稿件时，连附录的图片错放了正文的图片都没有发现——我发誓责任绝不在我。（至少我的电脑上每个版本的稿件都不存在这类低级错误。）&lt;/p&gt;
&lt;p&gt;直到现在，期刊中收录的依然是这个出错的版本，我还在考虑要不要什么时候发邮件过去提出更正意见。&lt;/p&gt;
&lt;p&gt;这是我的自由。&lt;/p&gt;</description></item><item><title>生物模型的参数迷局拆解</title><link>https://touchingfish.top/2024/sobol-sensitivity-analysis/</link><pubDate>Sun, 21 Jul 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/sobol-sensitivity-analysis/</guid><description>&lt;p&gt;一个生物模型有多少个参数？少则三五个，多则几十上百。&lt;/p&gt;
&lt;p&gt;捕食者怎么繁殖，猎物怎么被捕食；蛋白质怎么磷酸化，mRNA 怎么降解；感染者怎么传播疾病，康复者怎么获得免疫——每个环节都要用一个数字来描述。这些数字从哪里来？文献里翻的，实验里测的，或者干脆猜的。&lt;/p&gt;
&lt;p&gt;问题来了：哪个参数最重要？&lt;/p&gt;
&lt;p&gt;直觉上大概会说&amp;quot;都很重要啊&amp;quot;。但计算资源不是无限的，实验经费更不是。如果只有精力精确测定三个参数，你选哪三个？如果模型结果对某个参数的变化毫无反应——花一个月测的那个数字，是不是根本无所谓？&lt;/p&gt;
&lt;p&gt;这就是 Sobol&amp;rsquo; 敏感性分析要解决的问题。&lt;/p&gt;
&lt;h2 id="不只是敏感"&gt;不只是&amp;quot;敏感&amp;quot;&lt;/h2&gt;
&lt;p&gt;敏感性分析（Sensitivity Analysis, SA）这个概念不新鲜。最朴素的做法是局部敏感性分析（Local SA）：把每个参数调高 1%，看输出变化多大。听上去很合理，问题在于——你只在一个点上做了测试。换个初始值，排名可能完全颠倒。对于非线性系统，这种局部视角约等于管中窥豹。&lt;/p&gt;
&lt;p&gt;Sobol&amp;rsquo; 指数属于全局敏感性分析（Global SA）。它不问你&amp;quot;在这个点上谁敏感&amp;quot;，而是问——&lt;strong&gt;在整个参数空间里，谁在操控输出的方差？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它的做法很直接：把模型输出 $Y$ 的总方差按来源拆开。&lt;/p&gt;
$$Y = \mathcal{M}(X_1, X_2, \dots, X_m)$$&lt;p&gt;$\mathcal{M}$ 是你的模型，$X_i$ 是输入参数。Sobol&amp;rsquo; 分解告诉你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$S_i$：$X_i$ 自己贡献了多少方差（first-order index）&lt;/li&gt;
&lt;li&gt;$S_{ij}$：$X_i$ 和 $X_j$ 的交互贡献了多少（second-order index）&lt;/li&gt;
&lt;li&gt;$S_{Ti}$：$X_i$ 的总贡献——包括它自己，加上和所有其他参数的两两交互、三三交互……一直加到 $m$ 阶（total-order index）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果 $S_{Ti} \approx 0$，恭喜你，这个参数可以当成常数，模型对它几乎不敏感。如果 $S_i$ 大但 $S_{Ti} - S_i$ 小，说明这个参数是独狼，自己就很能打。如果 $S_i$ 小但 $S_{Ti}$ 大——这就很有意思了：它自己不重要，但和别人搞在一起就很关键。&lt;/p&gt;
&lt;p&gt;这种参数的微妙之处，局部方法永远抓不到。&lt;/p&gt;
&lt;h2 id="计算上的麻烦"&gt;计算上的麻烦&lt;/h2&gt;
&lt;p&gt;Sobol&amp;rsquo; 指数好看，但不好算。&lt;/p&gt;
&lt;p&gt;理论上，你可以用 Monte Carlo（MC）来估算所有方差。问题是，对于 $m$ 个参数，要算到第 $k$ 阶交互，需要的模型评估次数是指数级的。如果你的模型求解一次就要几十分钟——比如一个 stiff ODE 系统——那 MC 的时间成本会让人想关电脑。&lt;/p&gt;</description></item><item><title>抽卡与测序的秘诀 / 超几何分布</title><link>https://touchingfish.top/2024/hypergeometric-distribution-yugioh/</link><pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/hypergeometric-distribution-yugioh/</guid><description>&lt;h2 id="从一个游戏说起"&gt;从一个游戏说起&lt;/h2&gt;
&lt;p&gt;二十年前，我还是个小学生。每天放学都急着回家看上一集游戏王（Yu-Gi-Oh!）。&lt;/p&gt;
&lt;p&gt;这套卡牌游戏有一张传说中的卡——黑暗大法师（Exodia the Forbidden One）。这张卡必须同时集齐五个部件才能生效：右脚、左脚、右手、左手、头部。只要凑齐这五张，直接获胜。&lt;/p&gt;
&lt;p&gt;每副卡组四十张。由于规则限制，同一张卡最多只能放三张（某些特卡只能放一张），所以这五个部件在卡组里至多各有一张。&lt;/p&gt;
&lt;p&gt;问题来了：开局起手五张牌，恰好集齐全部五个部件的概率是多少？&lt;/p&gt;
&lt;p&gt;这是一个经典的&amp;quot;不放回抽样&amp;quot;问题。我们从一副有限的牌堆里抽出若干张，每抽一张，牌堆就少一张，不会重复抽到同一张。（&lt;strong&gt;暂时不考虑类似于特殊效果放回牌堆的骚操作&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;超几何分布（Hypergeometric Distribution）正是为这类场景设计的。&lt;/p&gt;
&lt;h2 id="超几何分布的定义"&gt;超几何分布的定义&lt;/h2&gt;
&lt;p&gt;假设一个有限总体共有 $N$ 个单位，其中成功状态（我们感兴趣的类型）有 $K$ 个，失败状态有 $N-K$ 个。我们从这个总体中不放回地抽取 $n$ 个单位，令 $X$ 表示抽到的成功状态的数量，则 $X$ 服从超几何分布：&lt;/p&gt;
$$
X \sim \text{Hypergeometric}(N, K, n)
$$&lt;p&gt;其概率质量函数为：&lt;/p&gt;
$$
P(X = k) = \frac{\binom{K}{k} \binom{N-K}{n-k}}{\binom{N}{n}}, \quad k = \max(0, n - (N-K)), \ldots, \min(n, K)
$$&lt;p&gt;这个公式的逻辑很清晰：分子是&amp;quot;从 $K$ 个成功中抽到 $k$ 个&amp;quot;与&amp;quot;从 $N-K$ 个失败中抽到 $n-k$ 个&amp;quot;的组合数之积；分母是&amp;quot;从全部 $N$ 个中抽到 $n$ 个&amp;quot;的总组合数。&lt;/p&gt;
&lt;p&gt;三个核心参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$N$：总体大小&lt;/li&gt;
&lt;li&gt;$K$：总体中的成功单位数&lt;/li&gt;
&lt;li&gt;$n$：抽样数量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;没有放回，没有重复，每一张牌的抽取都改变了下一次抽取的概率。&lt;/p&gt;
&lt;h2 id="回到游戏王"&gt;回到游戏王&lt;/h2&gt;
&lt;p&gt;现在计算开局集齐黑暗大法师的概率。&lt;/p&gt;
&lt;p&gt;卡组 $N = 40$，五个部件 $K = 5$，起手抽牌 $n = 5$，我们想知道抽到全部五张部件的概率，即 $k = 5$。&lt;/p&gt;</description></item><item><title>从头解析 Sobol 全局敏感性分析</title><link>https://touchingfish.top/2024/sobol-global-sa-from-scratch/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/sobol-global-sa-from-scratch/</guid><description>&lt;p&gt;面对一个模型时，你在做什么？&lt;/p&gt;
&lt;p&gt;调参数。翻文献。看哪个数字不确定，然后想办法让它确定一点。道理上都懂——模型是对现实的压缩，参数是对这个压缩过程的描述。一个有十个参数的模型，意味着有十个地方可能出错、十种不确定性同时存在。&lt;/p&gt;
&lt;p&gt;问题在于：当模型跑出来的结果和你预期不符时，你该怀疑哪个参数？&lt;/p&gt;
&lt;p&gt;拍脑袋是一种方法。文献里查是另一种。但直觉会骗人，文献也不一定靠谱——有些参数是&amp;quot;纸老虎&amp;quot;，看起来重要其实无关紧要；有些参数是&amp;quot;幕后玩家&amp;quot;，自己不动声色地操纵整个系统。&lt;/p&gt;
&lt;p&gt;这就是 Sobol&amp;rsquo; 敏感性分析要回答的问题——不是&amp;quot;这个参数敏感吗&amp;quot;，而是&amp;quot;在参数的整个运动范围内，谁在决定输出的命运&amp;quot;。&lt;/p&gt;
&lt;h2 id="从局部到全局"&gt;从局部到全局&lt;/h2&gt;
&lt;p&gt;最直接的想法是这样的：找一个基准点，把每个参数稍微动一动，看看输出变多少。变幅大的就是&amp;quot;敏感&amp;quot;的参数，变幅小的就是&amp;quot;不敏感&amp;quot;的。实际操作中常见做法是固定所有参数在某个基准值上，然后逐个扰动——比如每个参数调高 1%，看输出变化多少。&lt;/p&gt;
&lt;p&gt;这就是局部敏感性分析（Local Sensitivity Analysis，Local SA）。对线性模型来说，这个方法够用——导数在哪里都一样，在一点上试过就知道全局。&lt;/p&gt;
&lt;p&gt;但现实中的模型大多是非线性的。参数 A 在基准点附近可能无关紧要，换一个区域就成了主导因素；参数 B 恰恰相反。局部 SA 给你的是一张从锁孔里拍的全景照片——理论上是全景，实际上你只看到了一条缝。&lt;/p&gt;
&lt;p&gt;全局敏感性分析（Global Sensitivity Analysis，Global SA）的思路完全不同。它不再执着于&amp;quot;在这个点谁敏感&amp;quot;这个局部问题，而是把目光投向参数的整个运动范围——&lt;strong&gt;谁的波动能掀起最大的风浪？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;具体来说，假设模型为&lt;/p&gt;
$$Y = \mathcal{M}(X_1, X_2, \ldots, X_m)$$&lt;p&gt;其中 $X_i \sim F_i$ 是相互独立的随机变量，分布 $F_i$ 反映了你对第 $i$ 个参数的不确定性认知。Sobol&amp;rsquo; 方法要做的，是把 $\text{Var}(Y)$ 这个数字拆成一堆加起来等于它的分量，每个分量对应一组参数的贡献。&lt;/p&gt;
&lt;p&gt;关键在于怎么拆。&lt;/p&gt;
&lt;h2 id="anova-分解方差的乐高"&gt;ANOVA 分解：方差的乐高&lt;/h2&gt;
&lt;p&gt;Sobol&amp;rsquo; 方法的数学基础是 ANOVA（Analysis of Variance）分解，也叫 Hoeffding–Sobol 分解。这个名字听起来吓人，直觉却很友好。&lt;/p&gt;
&lt;h3 id="一个类比"&gt;一个类比&lt;/h3&gt;
&lt;p&gt;想象你在做一道菜。最终的味道（输出 $Y$）取决于盐、糖、醋、酱油……每种调料（输入 $X_i$）。你每次做菜时各调料的用量都有一点随机波动，所以每次做出来的味道也略有不同。&lt;/p&gt;
&lt;p&gt;现在你想知道：味道的变化，多大程度上是因为盐用量的波动？多大程度上是糖和醋的配合出了问题？&lt;/p&gt;
&lt;p&gt;ANOVA 分解做的事情就是：把&amp;quot;味道的总波动&amp;quot;拆成&amp;quot;盐独自贡献的部分&amp;quot;、&amp;ldquo;糖独自贡献的部分&amp;rdquo;、&amp;ldquo;盐和糖交互贡献的部分&amp;rdquo;……一直拆到所有可能的组合。&lt;/p&gt;
&lt;h3 id="数学形式"&gt;数学形式&lt;/h3&gt;
&lt;p&gt;严格来说，Hoeffding–Sobol 分解说的是：任何一个平方可积函数 $f(X_1, \ldots, X_m)$ 都可以唯一地分解为&lt;/p&gt;
$$f(X) = f_0 + \sum_{i} f_i(X_i) + \sum_{i\lt j} f_{ij}(X_i, X_j) + \cdots + f_{1\ldots m}(X_1, \ldots, X_m)$$&lt;p&gt;其中每一项满足两个条件：&lt;/p&gt;</description></item><item><title>撒豆子的人和砌砖的工匠</title><link>https://touchingfish.top/2024/mcmc-vs-qmc-basics/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2024/mcmc-vs-qmc-basics/</guid><description>&lt;p&gt;积分是数值方法里的老问题了。&lt;/p&gt;
$$\int_{[0,1]^d} f(\boldsymbol{x}) d\boldsymbol{x} \approx \frac{1}{n}\sum_{i=1}^n f(\boldsymbol{x}_i)$$&lt;p&gt;找 $n$ 个点，算函数值，取平均——听起来简单到无聊。但稍微想一步就会碰到一个根本问题：&lt;strong&gt;点从哪里来？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个问题把世界分成两半。&lt;/p&gt;
&lt;p&gt;一个撒豆子的人，闭着眼睛往方格里扔，相信大数定律会替他摆平一切。
一个砌砖的工匠，拿着图纸往方格里填，相信结构本身就是均匀。&lt;/p&gt;
&lt;p&gt;前者叫 Monte Carlo，后者叫 Quasi-Monte Carlo。&lt;/p&gt;
&lt;h2 id="monte-carlo随机的智慧"&gt;Monte Carlo：随机的智慧&lt;/h2&gt;
&lt;p&gt;Monte Carlo 的哲学就一句话：我不知道怎么均匀地填满空间，但我知道随机撒点&amp;quot;大概率&amp;quot;会均匀。&lt;/p&gt;
&lt;p&gt;大数定律担保了这件事。弱大数定律、强大数定律、中心极限定理——这些定理说，只要你样本量够大，样本均值会收拢到期望值附近。管它怎么撒的，反正够多就行。&lt;/p&gt;
&lt;p&gt;所以 MC 的 RMSE 是 $O(n^{-1/2})$。这个收敛速度稳如老狗——不管你的函数多复杂、维度多高，永远是这个速度。&lt;/p&gt;
&lt;p&gt;但&amp;quot;稳&amp;quot;有时候是夸奖，有时候是批评。$O(n^{-1/2})$ 意味着什么？意味着你想把误差压一半，样本量要翻四倍。$n=1000$ 不够，换 $n=4000$。还不够？$n=16000$。这是一条没有尽头的高速公路，每往前开一倍，只能缩短一半的距离。&lt;/p&gt;
&lt;p&gt;说到底，MC 的均匀是逼出来的——你不知道怎么设计均匀，就只好赌概率够大时运气会好。&lt;/p&gt;
&lt;h3 id="当独立采样太贵"&gt;当独立采样太贵&lt;/h3&gt;
&lt;p&gt;标准 MC 假设样本是独立的。这有时候太奢侈了。&lt;/p&gt;
&lt;p&gt;比如你要做 Bayesian inference。后验分布 $\pi(\theta \mid x) \propto L(x \mid \theta)\pi(\theta)$ 里那个配分函数 $Z = \int L(x \mid \theta)\pi(\theta) d\theta$，在高维空间里根本算不出来。拒绝采样更是灾难——高维空间里大部分随机点都会被拒绝，效率低到让人想转行。&lt;/p&gt;
&lt;p&gt;MCMC（Markov Chain Monte Carlo）就是来解决这个问题的。&lt;/p&gt;
&lt;p&gt;思路是：不追求独立，追求&lt;strong&gt;平稳&lt;/strong&gt;。构造一个 Markov chain，让它的平稳分布刚好是你想要的分布。然后让 chain 跑起来，跑久了，样本就&amp;quot;像是&amp;quot;从目标分布来的。&lt;/p&gt;
&lt;p&gt;Metropolis-Hastings、Gibbs sampling、Hamiltonian Monte Carlo——这些名字在统计圈里如雷贯耳。它们不是去挑战大数定律，而是去利用 Markov chain 的遍历定理。&lt;/p&gt;</description></item></channel></rss>