<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>data on Miao Yu | 于淼</title>
    <link>https://yufree.cn/tags/data/</link>
    <description>Recent content in data on Miao Yu | 于淼</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 23 Jun 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://yufree.cn/tags/data/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>闲聊层级模型</title>
      <link>https://yufree.cn/cn/2024/06/23/hierarchical-models/</link>
      <pubDate>Sun, 23 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2024/06/23/hierarchical-models/</guid>
      <description>&lt;p&gt;层级模型可能是面向普通人直观理解数据分析模型的天花板，往后的模型都需要至少简化到层级模型才具备一定的可解释性。那么什么是层级模型？最简单的理解就是数据内部不是均质的，例如你是一个刚到地球的外星人，随机大街上抓一百个人测量身高，想看看地球人能长多高。那最起码要区分下年龄层，未成年人身高跟成年人身高去搞平均，得到的数据相信自己看了也不信。也就是说人群身高这个变量天生要考虑年龄来进行分层，成年人几乎不变而未成年人每年都长高，在定义人群身高概念时就得考虑数据本身内部的分类，这种内生性分层在很多具体的学科概念里很常见。&lt;/p&gt;
&lt;p&gt;之所以引入层级模型，很大程度是因为多数学科知识构架都是从基本概念堆起来的，学科或某个议题本身就是个层级概念模型。例如讨论环境影响健康，首先环境因子得暴露给人群，人群被暴露后会有应激反应，生理上可阻挡大多数进化上已知的危害，但仍然有些污染物不被阻挡，进入人体后会干扰具体的代谢过程，当代谢紊乱后生理上出现病症。这一系列的步骤都要有观察或实验证据来证明才能形成一条完整的环境影响健康的层级机制模型，有些污染物也许能在环境中检出，但根本就不出现在人群生物样品里，那么就不具备进行讨论的价值。现在环境科学里流行的效应引导分析就是要先看到最终影响再去找具体污染物，前提就是层级模型要可验证，否则单纯因为环境有就说有危害是很容易被质疑的。&lt;/p&gt;
&lt;p&gt;除了机理上的层级模型，另一个很常见的预测性层级模型就是决策树。当你决定今天是否出门时，脑子里可能同时出现天气、心情、交通方式、家务劳动等变量，这些变量的优先级是不一样的，例如天气不好就不出门了，此时心情或交通方式根本就不需要考虑了，如果还有家务劳动，那可能也不用考虑天气了。当存在变量优先级时，数据也是要用层级模型来建模的。在很多具体场景下，有些变量在不同层级上可以反复出现，例如医疗资源紧张时，急诊室会首先按紧急与否预筛患者，哪些一时半会死不了的就得等等，然后按年龄，老人小孩有高优先级，然后可能又要细化评估紧急的严重程度，一个胳膊折断的哭闹熊孩子跟一个摔倒后昏厥的老年人哪个优先就要看具体医疗资源状态了。&lt;/p&gt;
&lt;p&gt;决策树模型在很多机器学习算法里都有体现，很多时候我们不知道变量的层级关系，就预设其存在层级关系然后用数据进行训练。每一层的节点代表一个分类标准或特征值的判断标准，树的枝叶代表最终给出的响应。在机器学习的预测模型y=f(x)中，y代表最终响应，x代表跟响应相关的特征或属性，f则代表一种模型算法。f的构建过程可以看作寻找一种让响应相对一致的特征分类或回归方法。决策树里每个枝叶的形成过程所经历的特征判断就是“寻找一种让响应相对一致”的过程。&lt;/p&gt;
&lt;p&gt;这个过程实现的具体过程大概要用到自上而下的贪心算法。具体而言就是首先找遍历所有不同的x，在每个特征x下找出最小化响应y的均值与实际y差的平方的一个特征x0，这样就实现了响应的第一层二分，也就构建了树的第一个主分支，这个过程在不同分支上递归进行就可以训练得到一棵回归树。分类树的构建与此类似，不同的是要引入分类错误率的概念或者说y分类的内在均一度作为训练目标。训练过程可以引入类似lasso或岭回归或弹性网络的惩罚项，最后当我们得到一颗训练好的决策树后就可以进行预测了。&lt;/p&gt;
&lt;p&gt;预测过程更加直观，我们用手头的x去对应节点上的判断标准进入不同的分支，递归进行，最后到枝叶上就是预测结果。值得说明的是这种层级结构有些变量基本用不到，因此决策树生成过程也可用来进行变量的筛选并对其重要性进行评价。&lt;/p&gt;
&lt;p&gt;除了机理跟预测，分层这个思路在具体研究中也很常用，例如组学数据里的小样品大维度场景。假定我有两组样品，一组样品6个样本，每个样品测代谢组测到上万个代谢物，此时你每组样品去做类似t检验的差异分析会面临两个问题。第一个问题就是错误发现率（FDR）得控制，因为随机做上万次t检验会有大量假阳性。第二个问题就是样本量带来的，虽然t检验用的分布属于厚尾分布，但在样品量少的情况下对单一代谢物的方差估计很可能非常不靠谱，这样也会引入大量假阳性。层级模型可以用到第二个问题上，基本假设就是代谢物之间虽然有差异但毕竟都来自于同一个样品，存在一个基于样品本身的代谢物间总方差，我们可以先估计出这个总方差。当计算具体代谢物的方差时，我们用总方差对代谢物原方差进行加权收敛，得到一个介于所有代谢物方差与单一代谢物之间的新方差进行差异分析。此处的层级模型在于除了对代谢物本身表达建模外还要考虑更高一层所有代谢组表达建模，这样在进行差异分析或统计推断时实际上考虑了代谢物跟代谢组两个层级的方差来源。这个思路经常被称为经验贝叶斯，本质上是借用了更高层级下其他数据的信息与本层级数据信息进行混合，进而得到一个和稀泥的推断，这对于小样品量的实验其实很有用，当然就算用了层级模型，一样还得进行错误发现率控制。这里类似进行了正则化，对方差进行了惩罚。经验贝叶斯收敛可以用mcmc方法做的更好。&lt;/p&gt;
&lt;p&gt;与这个思路类似的就是线性混合模型。在估计斜率固定效应时，可以假定每个样品的截距来自于一个随机分布，或者反过来固定截距，认为斜率来自于一个分布。甚至同时认为斜率与截距来自于一个分布，然后给出对其方差的估计。举个例子，人群中某污染物浓度随暴露时间而线性增加，此时斜率固定，但每个人本底不一样，也就是截距不一样，此时如果不预先对所有截距建模，那么对斜率的估计很可能也是错的或不显著的。实践中如果涉及对同一个体的反复测量，那么几乎一定要把不同个体间的随机效应参与建模。这里层级模型就体现在对于个体参数估计是构建在更高群体层次上，把群体存在的随机效应也放到模型构建里去，此时得到的模型的固定效应可能会更靠谱些。本质上很像先聚类再分析，但会考虑不同聚类间的信息共享。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/LMM.png&#34; alt=&#34;&#34;&gt;
不同部门间工资建模就是个层级模型。&lt;/p&gt;
&lt;p&gt;层级模型到了深度学习时代也有其地位。例如，多层感知机构架里如果各层之间的激活函数不是非线性的，那么这个构架可以看出一个多层线性模型。很多多层神经网络结构本质上也是在对数据进行降维简化与抽象，例如一个编码器构架可以把很高维度的数据进行降维然后再通过解码器重构，这一降一升实质上对于噪音消除效果不错。另外就是如果对图片分类的神经网络不同层可视化，可以看到前面的层感知到的更多是基本线条，越往后越接近人对图像模式的感知。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/Features-obtained-for-face-recognition-application-in-hidden-layers-of-CNN-9.png&#34; alt=&#34;&#34;&gt;
卷积神经网络各层的感知状况，图来自&lt;a href=&#34;https://dergipark.org.tr/en/pub/aita/issue/70791/1137977&#34;&gt;网络&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;关于层级模型这种建模思路可以聊的还有很多，例如随机森林就是层级模型的进阶变种，分析文献的荟萃分析本质上也是线性混合模型……虽然层级模型可以应用的场景很多，但形成这种程度对数据的理解可能需要实际项目的训练。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;推荐阅读&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nature.com/articles/nbt.1619&#34;&gt;Analyzing &amp;lsquo;omics data using hierarchical models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mfviz.com/hierarchical-models/&#34;&gt;层级模型可视化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>闲聊非线性</title>
      <link>https://yufree.cn/cn/2024/05/21/non-linear/</link>
      <pubDate>Tue, 21 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2024/05/21/non-linear/</guid>
      <description>&lt;p&gt;如果说线性模型是科研里用得最多的数据分析模型，那么非线性模型大概是科研忽悠用语里的常客了。理解线性模型一张XY散点图加上一条笔直的视觉引导线就足够讲清楚线性回归效应了，但前面加上个“非”字就是另一番风景了，这只说明两个变量间的关系没法用Y = aX+b来描述，但能用什么模型来描述就没法从名字里看出来了。那么，今天就来聊聊如何描述非线性。&lt;/p&gt;
&lt;p&gt;还是从实际问题出发，我测定了某种污染物甲在某区域不同采样点检出的浓度，本质上就是得到了表示浓度的一维向量。现在我怀疑这个浓度跟某个工厂有关系，如何描述这个关系，最直观就是计算所有采样点到工厂的距离，然后拟合一个模型：&lt;/p&gt;
&lt;p&gt;浓度 = f(距离)&lt;/p&gt;
&lt;p&gt;这里f代表描述这两个变量间关系的模型，最简单的模型就是浓度是不变的常数，那么方程可以写为：&lt;/p&gt;
&lt;p&gt;浓度 = 系数*距离^0 + 常数&lt;/p&gt;
&lt;p&gt;其实这里有没有距离都无所谓，反正0次方都是1，但考虑到就算是常数也会有测量误差，这个模型可以写成：&lt;/p&gt;
&lt;p&gt;浓度 = 系数*距离^0 + 常数 + 误差&lt;/p&gt;
&lt;p&gt;误差会符合正态分布，因此要验证这个模型是否靠谱，我们需要做的就是对测量的浓度进行拟合优度检验看是否符合正态分布，如果符合，那就说明我们提出的常数模型靠谱，这里跟距离可能没有关系。这个模型虽然最简单，但经常会被忽略，毕竟搞研究的总是在寻找变量间的关系而不是检验单变量的随机性。&lt;/p&gt;
&lt;p&gt;但是不是过了常数模型就一定没关系呢？不一定，单一变量正态分布更可能说明采样足够随机但不说明没有其他因素可以解释，这里我们让模型复杂一点：&lt;/p&gt;
&lt;p&gt;浓度 = 系数*距离^1+常数+误差&lt;/p&gt;
&lt;p&gt;这就是最常见的线性模型了，此时我们认为浓度被距离所影响，拟合这个模型后会得到系数及对这个系数的检验，此处的检验目的就是看这个系数与零有没有统计意义上的显著差异，如果有，那么这个模型很可能捕捉到了两个变量间的关系。如果没差异，那么距离前这个系数就可能是零，也就是退回常数模型。有差异时把拟合的线画出来就是一条描述两变量关系的直线，例如距离越远，浓度越低。&lt;/p&gt;
&lt;p&gt;然而，虽然线性模型捕捉到了两个变量间的关系，但不代表这个关系的描述就一定是最好的。例如，我们注意到当距离越远，浓度下降越快。从地理常识上这很容易解释，污染物在二维平面扩散一定是越远浓度下降越快，复杂点也就是所谓高斯扩散模型。注意这个模型是个指数模型，已经是非线性了，但不是说没法用线性模型来拟合。在没有物理机制模型的时候，线性模型总是探索分析的第一选择。&lt;/p&gt;
&lt;p&gt;此处可视化是很重要的，例如下图里的安斯库姆四重奏，其回归线都是一样的，R2也是一样的，单纯看数据分析的结果是无法识别数据本身的状态的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.github.io/blogcn/figure/anscombe.jpeg&#34; alt=&#34;安斯库姆四重奏&#34;&gt;&lt;/p&gt;
&lt;p&gt;现在我们可以继续让模型复杂一点，例如我们假设跟距离的平方成正比，也就是：&lt;/p&gt;
&lt;p&gt;浓度 = 系数*距离^2+常数+误差&lt;/p&gt;
&lt;p&gt;此时我们假设的就是一个非线性模型，具体来说就是多项式模型。如前所述，如果你知道两个变量间物理机制，那么机制模型是最准的。但如果不知道机制，多项式模型可以作为一种优先探索模型，原因是纯数学上的，任何函数理论上都可以用多项式模型来近似，也就是传说中的泰勒展开。然而，这个泰勒展开只是一种数值方法，不能用其直接反推数据背后的机理。&lt;/p&gt;
&lt;p&gt;此时，我们又发现，在距离近似相等的采样点上，温度越高浓度越低，也就是我们这里要考虑两个自变量：&lt;/p&gt;
&lt;p&gt;浓度 = 系数1*距离^2+系数2*温度 + 常数+误差&lt;/p&gt;
&lt;p&gt;这里就是单纯的加性模型，用来说明固定其余自变量时，某自变量对因变量的影响。这个模型最常见的就是在流行病学里对协变量的控制，例如当文章里说在控制了性别、年龄、BMI、是否抽烟后某个行为对疾病发病率的影响，其实质就是构建一个多元加性模型，把性别、年龄、BMI、抽烟与否等跟某个行为都作为自变量累加到一起来决定因变量，拟合后行为前的系数就是控制了其他因素后的影响。在这个加性模型里，自变量可以是连续变量，也可以是离散变量，当自变量是离散变量时，本质上就是拟合不同离散变量下的模型，因此如果你全是离散变量，很可能遇到维度诅咒，也就是某些自变量组合下数据不足，此时就要考虑换模型了，毕竟眼下这个模型理论上就会训练不足。当然，每一个自变量都可以进行多项式展开，但多项式越多，需要拟合的参数也越多，也就更可能训练不足，此时模型也会更复杂，微小变化就会产生很大影响。由于科研里寻找的模型都是尽量重现性高预测性好的，提高复杂度很可能降低模型对新数据的预测性，此时要谨慎判断，例如你可以加1/2次方而不是2次方，此时参数虽然也是多，但不容易累积微弱影响。另外，模型越简单越好解释，参数量要远小于数据量更可能给出靠谱结果（奥卡姆剃刀）。&lt;/p&gt;
&lt;p&gt;此时，我们需要考虑一个更复杂的场景，这个场景下距离跟温度存在交互作用，距离远了温度影响会变大，而近了污染源距离影响更大，此时模型就可以表述为：&lt;/p&gt;
&lt;p&gt;浓度 = 系数3*温度*距离 + 常数+误差&lt;/p&gt;
&lt;p&gt;这里我们可以用另一种表述方法来描述，也就是网络法：&lt;/p&gt;
&lt;p&gt;距离 -&amp;gt; 温度 -&amp;gt; 浓度&lt;/p&gt;
&lt;p&gt;在网络表示中，类似距离 -&amp;gt; 温度 -&amp;gt; 浓度这种表达在数学上的意义就是乘法法则，也就是距离跟温度的交互作用就是其单独影响的乘积。打比方距离增加1，温度减少2，而温度减少1，浓度提高3，此时距离增加1，浓度提高就是2*3，也就是6，因此我们在模型里会直接用两个自变量乘积表示交互作用，此时也在暗示自变量之间可能存在某种互相作用机制。当我们在一个线性模型里加入了自变量互相作用项时，本质上就是在说自变量间的信息会影响因变量。例如，我们发现就业二十年的收入跟原生家庭收入与入学考试分数的交互作用有关，当原生家庭收入碰上高分，收入会突然增高，此时我们就可以合理推测原生家庭收入本身可能就跟入学考试分数之间有关系，例如家庭收入高更可能请私教。当然，这是从解释性角度来讨论模型，如果你研究的现象机理模型已经很成熟了，那直接拟合就可以了。&lt;/p&gt;
&lt;p&gt;交互作用也属于非线性模型了，还有一些非线性则属于分段式函数。但实际科研里八成现象可以用线性模型解决，剩下的一成可以用多项式与乘法互相作用解决，用到其他数学表达的场景那一成大都是由学科理论支撑的公式。绝大多数情况下，科研里理解透了线性模型就够用了，大多数新发现都是用线性模型来描述与解释的。&lt;/p&gt;
&lt;p&gt;当然，我说的是机器学习模型出现之前的科研数据分析里的线性与非线性，下次聊一下另一个常见数据分析模型：层级模型。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>动态规划</title>
      <link>https://yufree.cn/cn/2024/05/12/dynamic-programming/</link>
      <pubDate>Sun, 12 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2024/05/12/dynamic-programming/</guid>
      <description>&lt;p&gt;最近属于过敏季，经过几次出门流泪打喷嚏，我还是放弃了非必要外出，宅家里整理我那永远整理不完的笔记。这次是关于动态规划的，这个笔记是给非计算背景的人（也包括我）整理的，主要目的是假设将来会遇到类似问题，此时可以去找计算背景的人或AI写算法解决。&lt;/p&gt;
&lt;p&gt;这里不去解释动态规划这个名字有多差劲，实际上这也是美国人为了忽悠国会议员搞出来的高大上词汇，动态规划本质就是个特定问题的寻优过程。这里的特定问题有两个限制条件，第一个是大问题可以拆成小问题，第二个是小问题的答案可以存起来方便快速计算，科研人员要知道怎么搞第一步，然后第二步就属于技术人员的工作了，目前实现方法与算法非常多，当前动态规划的最大应用瓶颈在于懂第一步的不懂计算，懂第二步的不知道能拿来解决啥具体问题。这里最重要是形成科学问题与计算问题的关联性思维，看到实际科学问题可以转换为可计算问题，这样可以提高解决问题的效率。&lt;/p&gt;
&lt;p&gt;这里我从具体的科学问题出发，这里有两段基因序列，现在我想进行序列比对该怎么做。不懂计算的科学家一般都是大力出奇迹，也就是我直接把所有可能的比对情况列出来，然后看哪种靠谱。这里面可计算的点有两个，第一个是穷举所有可能的比对，第二个是量化“靠谱”这个词。先说第二步，序列比对问题里的靠谱需要设计一个打分系统，例如两个碱基如果配对给5分，如果不配对给-2分，如果出现插入或删除给-6分，这里的分数设计需要科研人员按学科知识进行设计，例如你认为插入或删除对于你研究的某个进化上极端保守的序列不太可能出现，那么你可以给一个-10分。这块的知识加权关系到你对问题的认知水平，如果科研人员完全不了解算法，用一个奖励突变的比对算法研究进化保守的序列，比对出来的效果可能就跑偏了。&lt;/p&gt;
&lt;p&gt;回到第一步，这种大力出奇迹的思路不太适合21世纪的技术水平，对于简单问题穷举还有可能，当你去比对数据库时一个一个查就属于开玩笑了。这里要做的是把科学问题翻译成可计算的步骤，还是序列比对，每个序列都是ATGC的排列组合，例如两个序列是TTCATA跟TGCTCGTA，T跟T匹配上就给5分，插入或删除就-6分，下一个一边是T，另一边是G，如果我们认为这是错配就给-2分，这样加第一步5分总和就是3分，如果我们认为这里存在错位或删除就给-6分，这样加第一步5分总和就是-1分，如果我们认为第一步也是插入或删除，那此时总和就是-12分。此时我们需要构建一个比对矩阵，把两个序列逐步比对后的得分从左上到右下一直到比对完成全部算出来，矩阵里的分数就是比对到这里所有步骤的得分总和。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/dp.png&#34; alt=&#34;&#34;&gt;
&lt;em&gt;图解动态规划（https://doi.org/10.1038/nbt0704-909）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;到这一步完成，我们直接就找到了右下角的11分，这个分数最高，说明这个分数的形成路径就应该是所有比对中最有可能的那一条。此时我们要反推这个11分是怎么来的，因为每一步我们只可能通过5，-2与-6三种情况得到，此时我们从11分出发倒推回起点就能知道路径。也许你会问到了3分那个点为啥不走2分那个路径？很简单，这个路径需要1分，而你能走的路径只可能是5，-2与-6，而2分那个点只可能来源于0分走错配途径，这条路径到不了最高得分。这里要注意最优路径可能不止一条，得分可能相同，此时算法可能会进行随机选择或者按照具体研究需求来限定某种顺序可能性更高，也就是二次打分，这需要科研人员参与算法设计。&lt;/p&gt;
&lt;p&gt;同时，这个找到最优序列的过程本质上就是动态规划。从任务拆分上，我们先把全序列比对拆成了第一个碱基与后续序列比对的两个子问题，然后后续序列比对又拆成了第二个碱基与后续序列比对的子问题，以此类推到最后一个碱基比对的问题。你可能会说递归计算也是这个套路啊，没错，动态规划某种程度上跟递归相似，但我们回顾下计算过程，当我们拆分序列时，几乎一定会出现有些序列是相同的。我们第一次拆分有三种情况，情况1是匹配上了，情况2是没匹配上，跟第二个序列第一个碱基是删除，情况3也是没匹配上，但跟第二个序列第一个碱基是插入。这里我们不是讨论得分，单纯是任务拆分。从情况1往下走又会有这三种情况，其中一个是下一个是删除，而情况2往下走也是三种情况，其中一个是下一个匹配上了，而这两种下一步情况后续的计算是完全相同的，剩余比对的序列都是考虑一个删除的序列。在递归的思路下，你需要重复计算这两种情况，但动态规划寻优时会设计一个存储单元来存储所有计算子任务，如果两条路子任务相同，那么只计算一条子任务一遍就可以了，用空间换时间。对科研人员这属于技术细节，但你需要知道什么时候可以用这个算法以及如何把问题抽象成现有算法可解决的问题。&lt;/p&gt;
&lt;p&gt;上面这个属于生信，我再讲一个分析化学的案例。我这里用质谱测到一个物质的荷质比，但我想知道其元素组成，该怎么办？这属于比较经典的找零钱问题，打比方我有1元、5元、10元的零钱，你想要123元，问如何凑钞票最少。而我们的问题就是我知道一个质荷比是100，如何用不同单个原子凑出这个质荷比，此处还要设定其他限制条件，例如要保证碳原子数跟氢原子数比例符合某个范围，毕竟全用氢原子你啥都能凑出来，而且要考虑同位素丰度。这些信息都是需要科研人员转成计算问题的。&lt;/p&gt;
&lt;p&gt;那么我们能不能用动态规划来解决这个问题呢？当然可以，我们那个质量数可以分拆成一个碳原子跟其他的组合，最后递归到最后一个原子，这保证了动态规划问题的可分拆性。而我们分拆的过程是被化学规律也就是原子质量数限制了搜索空间，其中单个氢原子跟单个同位素剩余质量在计算上考虑不确定度可能是相同的，存在重复计算要素，因此可以设计对应算法来反推出元素组合。此时不同算法的优劣主要在于其考虑的化学限制条件，条件越多越贴近某种事实，这些也是科研人员需要了解的。&lt;/p&gt;
&lt;p&gt;其实对于科研人员，理解动态规划的关键不在于其技术上的实现，那是技术人员的饭碗，科研人员要更熟悉算法思想与应用范围，这样才能在碰上类似问题时触类旁通，知道找谁解决，但同时也没必要去抠太多技术细节，这碗饭不是你该吃的。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>模型参数知多少</title>
      <link>https://yufree.cn/cn/2023/11/27/number-of-model-parameters/</link>
      <pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2023/11/27/number-of-model-parameters/</guid>
      <description>&lt;p&gt;我的身体大概用了三周多才从指标上恢复正常，但我的脑子可能退烧后就自认为痊愈了，到底信生理指标还是个人感受其实是很奇妙的感觉。我自然信生理指标，不是因为这个准，而是这个借口可以给自己放松。我属于那种别人说啥都不听的货，所以外来压力很难直接影响我，但多数情况下是外在压力远小于我对自己的要求，别人能想到的我多数情况已经想过了，没想过的多半我本来也不感兴趣，毕竟年龄放在那里了，所以这种五六年病一次的机会自然就躺平了。我的个人意志只是这套生理系统的副产品，生理系统出问题了，我这边主观能动性没有任何讨价还价的余地。不过，现实情况确实是脑子更轻松了。身体上缓慢的恢复没妨碍到脑子的运转，因此也可以去思考一些荒唐的事，这里摘录其中一段关于对模型的思考。&lt;/p&gt;
&lt;p&gt;今年大语言模型特别火，但我总感觉人们在追热点时经常忘了常识。大语言模型并不是人工智能的巅峰，更像是拟人智能的起点。然而，拟人智能最大的问题就在于越是拟人，越没法脱离人语言的框架，而很多真实存在的难题并不是人类语言可以描述的，人与人间在解决具体事物上的交流里一多半都是冗余的，甚至都不具备明确的目的性。现在人们惊叹于大语言模型可以替代的那部分工作其实也带有冗余且目的不清晰的特点，例如公务员的公文，很多时候就是在车轱辘话说很简单的事，现在人工智能也会了这套，也许会体现公文专业性，但很难说能提高行政效率。&lt;/p&gt;
&lt;p&gt;这里隐含的问题就在大语言模型的“语言”二字上。自然语言是纯人类交流使用的，带有模糊性、多义性等各种缺点。因此，自然语言处理对于计算机而言就属于灾难，不过，当语料足够高质量后，一个复杂的模型也可以去模拟自然语言中的这些特性来实现跟人交流。这里跟人交流是一个没法优化的问题，人们日常交流本就存在压不下去的噪音与无处不在的误解与冗余，我们可以设计一个图灵测试来让对方感觉不出谈话的是人是机器，但这并不代表谈话能准确传达意义。而精准传达并执行本来就是计算机的强项，现在我们让计算机自费武功去理解人类语言，也许能替代很多工作，但很可能这些工作本来就不应该存在。人工智能里最拖后腿的其实是人的那部分，毕竟肉体凡胎的人很难脱离自然语言里的概念想象社会运转。因此，大语言模型的意义更多可能在于实现了更直接的人机对话，我们连碳基生物那点事都没搞清楚，别提复杂模型了。&lt;/p&gt;
&lt;p&gt;但我终究还是搞科研的，对于具体的科学问题，大语言模型是锦上添花的东西，但研究用的深度学习模型我认为不可走语言图像模型的老路，也就是不断提高算力并堆砌层数来大力出奇迹。原因很简单，具体的科学问题你能采集到的高质量数据远少于高质量语料数据。环境顶级期刊里涉及的研究很多样本量也就几十到几百这个量级，你去用迁移学习搞一个预训练的ResNet模型，里面有两千万个参数，我很难不认为会出现过拟合。&lt;/p&gt;
&lt;p&gt;这里我举个具体场景，人也就两万多个基因，如果你不是搞突变的，我们默认每个人体内都能测到两万个基因的表达。然而，基因跟基因之间很多是相关的，也就是不独立的，也就是人的基因组里独立变量不超过两万个。在具体的科学问题下，例如找特定疾病的标记基因，多数基因比较保守根本没差异，到最后可能只有四五个基因有差异。那么也就是说，对于这个疾病，我们只需要一个包含四五个参数的线性模型就可以描述了。那么此时你告诉我说要上变形金刚训练一个含有几十亿参数的模型来描述这种疾病，我会拿着奥卡姆剃刀追着砍你。&lt;/p&gt;
&lt;p&gt;语言的变化取决于语素的排列组合，图片的变化取决于红绿蓝三通道在平面上的排列组合，其排列组合后还有意义的计算空间是比较大的，因此大语言模型去卷参数量是有道理的。但相比语言或图像的变化，科学问题里涉及的单元可能是分子、细胞与组织，我很难相信你身上的葡萄糖跟我身上的有啥差异，那么这样的有生物意义的小分子有多少呢？大概在几万个这个水平，但具体到不同的科学问题，基本都会缩减到几百甚至几个小分子上。就这几块料做个凉拌菜，也值当上个太上老君的炼丹炉？&lt;/p&gt;
&lt;p&gt;不过话说回来，如果不考虑还没被发现的小分子，我们假定目前能测到的小分子里已经包含了解释大多数健康状态的信息，那么理论上我们的模型在构架构架合适的前提下并不需要很大。其验证方法也很简单，就是训练好后，无论我们怎么提高样本量，最后得到的预测效果都不会再有变化，此时这个模型在默认小分子信息量充足的前提下应该可以回答大多数相关科学问题，这其实就是各种组学的终极目标。那么问题来了，这样一个完美模型，在几十到几百的样品量限制下，会需要多少参数呢？&lt;/p&gt;
&lt;p&gt;ChatGPT大概是200亿的参数量就基本实现了人机对话，大语言模型似乎固定好了模型参数量不断往里送数据效果还会提升。这里我的理解是更多的数据量提高的是模型的解析度，类似从模糊到锐化的过程。而进一步提高参数量可能也会带来提高，但似乎存在一个飞跃式提高的参数量节点，对于自然语言自监督训练，这个量可能100亿这个量级上。自然语言里基本语素是单词，这个总量是3000亿，那么我大概估计数据量要是模型参数量的10倍以上才能训练出一个性能突飞猛进的模型。&lt;/p&gt;
&lt;p&gt;回到前面说的基因组的例子，假如我有100个样品，每个样品测1万个基因，那么就有总量一百万的数据，按照上面所说的估计，出现一个完美模型其参数量在10万这个量级应该就足够了。考虑到基因里共相关的比例很高，模型参数可能在几万这个水平就足够利用组学数据里的信息了。当然，前提是这里面真的有你关心的那一个问题。如果没有，考虑上突变，那么模型相应就要变大。&lt;/p&gt;
&lt;p&gt;那么什么样的模型有几万个参数？甚至都用不上深度学习，随机森林模型大一点都能有几万个参数。而深度学习有些模型构架例如图神经网络甚至可能只有几千个参数。只不过在深度学习里模型构架没法如随机森林一样直观描述出来，但也正是这个原因模型会在训练过程中提取出要被训练的参数，变化更多一些。&lt;/p&gt;
&lt;p&gt;我觉得在具体的科学领域里，最先要做的就是搞清楚自己能测到多少独立变量，然后可以利用独立变量的数目与实际可获取样本量估计出需要多大的模型，之后就可以写个脚本让电脑试错找出最佳的领域内通用模型，很可能对算力要求不高，但能解决八成的已知问题。当然，这都是我的幻想，但我查了下文献，很少看到这方面的讨论，隐约感觉这个思路比现在为了上模型而上模型要靠谱些。起码先圈出一个大概的方向，对不对要上仿真，我现在是没空，等有空了试一下，看看是不是领域内通用模型可以用这个思路来设计。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>差异分析与主成分分析悖论</title>
      <link>https://yufree.cn/cn/2023/10/07/da-pca-paradox/</link>
      <pubDate>Sat, 07 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2023/10/07/da-pca-paradox/</guid>
      <description>


&lt;p&gt;这是我最近研究工作中遇到的一个有趣现象：有一组含对照与控制样本的多维数据在主成分分析里没有看到差异，但进行差异分析时发现几乎所有维度上都有差异。这就会形成解释数据上的悖论：如果我用主成分分析来进行探索式数据分析，会认为对照组与控制组很难区分；但如果我用单一维度的差异分析去对比，即使经过错误发现率控制，在绝大多数维度上都能看到差异。这里的问题在于，因为你每个维度上都显示了差异，按说整体降维后可视化差异应该很明显才对。那么，这两组数据究竟算有差异还是没差异？&lt;/p&gt;
&lt;p&gt;这里我用模拟仿真来重现下这个问题。首先，我们模拟两组数据，对照组与控制组均有100维，都存在1.2倍均值差异，每组十万个点：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(genefilter)
# 100个维度
np &amp;lt;- rnorm(100,100,100)
z &amp;lt;- c()
for(i in 1:100){
  case &amp;lt;- rnorm(100000,mean = np[i],sd=abs(np[i])*0.1+1)
  control &amp;lt;- rnorm(100000,mean=np[i]*1.2,sd=abs(np[i])*0.1+1)
  zt &amp;lt;- c(case,control)
  z &amp;lt;- cbind(z,zt)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们来看下主成分分析结果：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;pca &amp;lt;- prcomp(z)
# 主成分贡献
summary(pca)$importance[,c(1:10)]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                             PC1      PC2      PC3      PC4      PC5      PC6
## Standard deviation     139.6394 32.62823 30.70480 29.50805 28.36421 26.82567
## Proportion of Variance   0.4811  0.02627  0.02326  0.02148  0.01985  0.01775
## Cumulative Proportion    0.4811  0.50736  0.53062  0.55211  0.57196  0.58971
##                             PC7      PC8      PC9     PC10
## Standard deviation     23.62678 23.19695 22.98213 22.70652
## Proportion of Variance  0.01377  0.01328  0.01303  0.01272
## Cumulative Proportion   0.60348  0.61676  0.62979  0.64251&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(pca$x[,1],pca$x[,2],pch=19,col=c(rep(1,100000),rep(2,100000)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2023/10/07/da-pca-paradox/index_files/figure-html/unnamed-chunk-2-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;colnames(z) &amp;lt;- 1:ncol(z)
re &amp;lt;- colttests(z,factor(c(rep(1,100000),rep(2,100000))))
re$adj &amp;lt;- p.adjust(re$p.value,&amp;#39;BH&amp;#39;)
sum(re$adj&amp;lt;0.05)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很明显差异。下面我们要做些变化：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;z &amp;lt;- c()
for(i in 1:100){
  case &amp;lt;- rnorm(100000,mean = np[i],sd=abs(np[i])*0.5+1)
  control &amp;lt;- rnorm(100000,mean=np[i]*1.2,sd=abs(np[i])*0.5+1)
  zt &amp;lt;- c(case,control)
  z &amp;lt;- cbind(z,zt)
}
pca &amp;lt;- prcomp(z)
# 主成分贡献
summary(pca)$importance[,c(1:10)]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                              PC1      PC2       PC3       PC4       PC5
## Standard deviation     181.57868 157.6794 148.89327 142.83580 135.81297
## Proportion of Variance   0.06511   0.0491   0.04378   0.04029   0.03643
## Cumulative Proportion    0.06511   0.1142   0.15799   0.19828   0.23471
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     127.20252 113.80253 111.40461 110.56104 109.33174
## Proportion of Variance   0.03195   0.02558   0.02451   0.02414   0.02361
## Cumulative Proportion    0.26666   0.29224   0.31674   0.34088   0.36449&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(pca$x[,1],pca$x[,2],pch=19,col=c(rep(1,100000),rep(2,100000)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2023/10/07/da-pca-paradox/index_files/figure-html/unnamed-chunk-3-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;colnames(z) &amp;lt;- 1:ncol(z)
re &amp;lt;- colttests(z,factor(c(rep(1,100000),rep(2,100000))))
re$adj &amp;lt;- p.adjust(re$p.value,&amp;#39;BH&amp;#39;)
sum(re$adj&amp;lt;0.05)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前差异已经开始互相融合了，好，进一步加大力度。&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;z &amp;lt;- c()
for(i in 1:100){
  case &amp;lt;- rnorm(100000,mean = np[i],sd=abs(np[i])*1.2+1)
  control &amp;lt;- rnorm(100000,mean=np[i]*1.2,sd=abs(np[i])*1.2+1)
  zt &amp;lt;- c(case,control)
  z &amp;lt;- cbind(z,zt)
}
pca &amp;lt;- prcomp(z)
# 主成分贡献
summary(pca)$importance[,c(1:10)]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                              PC1       PC2       PC3       PC4       PC5
## Standard deviation     385.92252 362.55544 349.08614 337.24936 318.92927
## Proportion of Variance   0.05343   0.04716   0.04372   0.04081   0.03649
## Cumulative Proportion    0.05343   0.10059   0.14431   0.18512   0.22161
##                              PC6      PC7       PC8       PC9      PC10
## Standard deviation     276.23167 269.7456 266.37922 264.53726 259.27925
## Proportion of Variance   0.02738   0.0261   0.02546   0.02511   0.02412
## Cumulative Proportion    0.24898   0.2751   0.30055   0.32565   0.34977&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(pca$x[,1],pca$x[,2],pch=19,col=c(rep(1,100000),rep(2,100000)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2023/10/07/da-pca-paradox/index_files/figure-html/unnamed-chunk-4-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;colnames(z) &amp;lt;- 1:ncol(z)
re &amp;lt;- colttests(z,factor(c(rep(1,100000),rep(2,100000))))
re$adj &amp;lt;- p.adjust(re$p.value,&amp;#39;BH&amp;#39;)
sum(re$adj&amp;lt;0.05)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前这两组差异数据在前两个主成分上已经看不出来了。&lt;/p&gt;
&lt;p&gt;其实这也算不上悖论，主要线索就是主成分的方差贡献，而我做的改动也在相对标准偏差上，第一个是10%，第二个是50%，第三个是120%。也就是说，当单一维度上方差已经大到均值水平时，前几个主成分展示的就不会是本来存在的均值差异。也就是说组内方差已经大于组间方差了，而主成分分析的前几个主成分展示的主要方差的方向，此时就很难看到差异了。&lt;/p&gt;
&lt;p&gt;另外一个问题就在为什么每个维度上做t检验都能看到差异？是不是这个检验太灵敏了？这里我们可以换下非参检验试一下：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;re &amp;lt;- apply(z, 2, function(x) wilcox.test(x~factor(c(rep(1,100000),rep(2,100000)))))
pv &amp;lt;- sapply(re, function(x) x$p.value)
table(pv)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## pv
##                     0 3.21613085397256e-306 6.73430585530844e-306 
##                     6                     1                     1 
## 5.95905672921984e-305 1.43146426990507e-304 2.88103524006124e-304 
##                     1                     1                     1 
## 3.54613251350956e-304 6.33668140462438e-304  2.5317836364043e-302 
##                     1                     1                     1 
## 4.93293987160011e-302 8.13835120208514e-302 1.36688105921063e-300 
##                     1                     1                     1 
## 3.87043506611894e-300 1.33933427039936e-299  6.1328705844548e-299 
##                     1                     1                     1 
## 6.76244564779203e-299 1.03222194605371e-298 1.51318088864007e-298 
##                     1                     1                     1 
## 2.11070341524332e-298 6.07875768603152e-297 3.22527514439914e-295 
##                     1                     1                     1 
## 1.34203144972226e-294 2.10795030613225e-294  8.3934741296955e-294 
##                     1                     1                     1 
## 1.13524790569676e-293 4.43328524302025e-293 1.13408275302277e-292 
##                     1                     1                     1 
## 3.21171301670077e-292 9.14432011768732e-292 1.41029103894936e-291 
##                     1                     1                     1 
## 1.95969386604631e-291 6.81159200573271e-291 9.53869471480568e-291 
##                     1                     1                     1 
##  3.9974313747202e-289 9.96580693176291e-289 1.18123817159962e-286 
##                     1                     1                     1 
## 2.91533699652798e-286 4.02616301892293e-286 1.96128094307977e-285 
##                     1                     1                     1 
## 5.79726146140566e-285 2.17379665526438e-284 8.27240941402517e-284 
##                     1                     1                     1 
## 1.02270502390125e-283  1.2015695984249e-283 1.27219996005653e-282 
##                     1                     1                     1 
## 1.33809861944993e-282 1.56263256355399e-282 2.10646448643389e-282 
##                     1                     1                     1 
## 5.58237541370083e-281 7.35623456436659e-281 2.39983102385879e-280 
##                     1                     1                     1 
## 4.22036195797059e-280 6.38057745284189e-280 2.59047690236053e-279 
##                     1                     1                     1 
## 3.85284194755047e-279 3.96545521530779e-279 7.08128308709271e-279 
##                     1                     1                     1 
## 2.01200858528937e-278 2.70315874477531e-278 2.52529024378762e-277 
##                     1                     1                     1 
## 2.98489612300307e-277 4.71151481650708e-277 2.71998519646619e-276 
##                     1                     1                     1 
## 6.89204108667979e-275 7.08424448613288e-275 9.69157985456159e-275 
##                     1                     1                     1 
## 4.90147598007698e-274 2.10122961611204e-273 5.41706107787206e-273 
##                     1                     1                     1 
## 1.48806677303251e-272 2.95470348988646e-272  7.0891056275253e-271 
##                     1                     1                     1 
## 1.19019161487132e-270 9.57399856665466e-270 3.25192278813096e-269 
##                     1                     1                     1 
## 4.27093134286106e-268 4.83603203666462e-268 1.14715674450228e-265 
##                     1                     1                     1 
## 2.32625856178469e-265 5.71328484169207e-265 1.03615279334537e-264 
##                     1                     1                     1 
## 1.32156277038824e-263 1.52458781012718e-262 1.23304701176652e-261 
##                     1                     1                     1 
## 1.39611670321905e-261 2.42026216418281e-261 4.09109495599137e-260 
##                     1                     1                     1 
## 2.05071609635835e-259 2.42145196897917e-259 2.20413402311652e-258 
##                     1                     1                     1 
## 3.43833152538818e-253 3.08137819181166e-252 2.05564214205184e-248 
##                     1                     1                     1 
## 6.88397114005715e-234 1.04517724949655e-227 
##                     1                     1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果很直观，依然全是差异。那么问题在哪里？其实就是差异本身的性质，这个差异太小，同时样品量又太大，结果这个客观存在的差异就会在大样本的情况下被检验出来。那么皮球就踢回来了，这个微弱但存在的差异有没有物理意义或科学意义？&lt;/p&gt;
&lt;p&gt;如果这个差异出现在无关紧要的地方，那么即使有差异可能也没多少意义。打比方我们对比了两个国家的人口拇指指甲宽度，发现其中一个国家的人口拇指指甲平均长度比另一个国家宽0.5毫米。从统计意义上存在显著差异，但实际意义上几乎为零。不过如果这个客观存在的差异有实际意义，那么想用探索式数据分析找到或者发现就不容易了。&lt;/p&gt;
&lt;p&gt;什么时候会出现这个问题呢？就是样本量特别大的时候，或者说现在。我们现在把样品量降下来看看：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# 不同样品
n &amp;lt;- c(50,100,1000,5000,10000,50000)
par(mfrow=c(2,3))
for(t in n){
        z &amp;lt;- c()
        for(i in 1:100){
                case &amp;lt;- rnorm(t,mean = np[i],sd=abs(np[i])*1.2+1)
                control &amp;lt;- rnorm(t,mean=np[i]*1.2,sd=abs(np[i])*1.2+1)
                zt &amp;lt;- c(case,control)
                z &amp;lt;- cbind(z,zt)
        }
        pca &amp;lt;- prcomp(z)
        # 主成分贡献
        print(summary(pca)$importance[,c(1:10)])
        plot(pca$x[,1],pca$x[,2],pch=19,col=c(rep(1,t),rep(2,t)),main=paste(t,&amp;#39;samples&amp;#39;))
        colnames(z) &amp;lt;- 1:ncol(z)
        re &amp;lt;- colttests(z,factor(c(rep(1,t),rep(2,t))))
        re$adj &amp;lt;- p.adjust(re$p.value,&amp;#39;BH&amp;#39;)
        print(sum(re$adj&amp;lt;0.05))
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                              PC1       PC2       PC3       PC4       PC5
## Standard deviation     463.20899 414.93325 390.06915 378.94284 366.74091
## Proportion of Variance   0.07606   0.06104   0.05394   0.05091   0.04768
## Cumulative Proportion    0.07606   0.13710   0.19104   0.24195   0.28963
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     354.55291 333.73123 327.22355 307.45633 294.46379
## Proportion of Variance   0.04456   0.03948   0.03796   0.03351   0.03074
## Cumulative Proportion    0.33419   0.37368   0.41164   0.44515   0.47589&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0
##                              PC1       PC2      PC3       PC4       PC5
## Standard deviation     414.95519 398.18752 383.1179 341.77149 333.77712
## Proportion of Variance   0.06112   0.05628   0.0521   0.04146   0.03954
## Cumulative Proportion    0.06112   0.11740   0.1695   0.21096   0.25050
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     330.07421 313.23118 295.19766 294.06532 283.41800
## Proportion of Variance   0.03867   0.03483   0.03093   0.03069   0.02851
## Cumulative Proportion    0.28918   0.32400   0.35493   0.38563   0.41414&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 3
##                              PC1       PC2       PC3       PC4       PC5
## Standard deviation     386.36628 372.46631 354.17324 343.27760 329.31797
## Proportion of Variance   0.05329   0.04953   0.04478   0.04207   0.03872
## Cumulative Proportion    0.05329   0.10282   0.14760   0.18967   0.22838
##                              PC6       PC7      PC8       PC9      PC10
## Standard deviation     286.83421 274.58396 270.4125 267.03231 265.61662
## Proportion of Variance   0.02937   0.02692   0.0261   0.02546   0.02519
## Cumulative Proportion    0.25775   0.28467   0.3108   0.33623   0.36142&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 93
##                              PC1       PC2       PC3       PC4       PC5
## Standard deviation     383.85506 365.76202 350.63025 335.54931 316.81354
## Proportion of Variance   0.05302   0.04814   0.04424   0.04052   0.03612
## Cumulative Proportion    0.05302   0.10117   0.14541   0.18593   0.22205
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     277.27065 269.78110 265.08180 262.41757 259.46220
## Proportion of Variance   0.02767   0.02619   0.02529   0.02478   0.02423
## Cumulative Proportion    0.24971   0.27591   0.30119   0.32597   0.35020&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100
##                              PC1       PC2       PC3       PC4       PC5
## Standard deviation     389.30440 364.63431 352.40207 334.78785 318.53566
## Proportion of Variance   0.05432   0.04766   0.04451   0.04017   0.03637
## Cumulative Proportion    0.05432   0.10198   0.14649   0.18666   0.22303
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     274.87045 269.58252 265.61018 264.65565 260.47349
## Proportion of Variance   0.02708   0.02605   0.02529   0.02511   0.02432
## Cumulative Proportion    0.25011   0.27616   0.30145   0.32655   0.35087&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100
##                              PC1      PC2       PC3       PC4      PC5
## Standard deviation     385.48948 362.6262 348.98546 335.73433 319.7928
## Proportion of Variance   0.05333   0.0472   0.04371   0.04046   0.0367
## Cumulative Proportion    0.05333   0.1005   0.14424   0.18470   0.2214
##                              PC6       PC7       PC8       PC9      PC10
## Standard deviation     276.36173 270.86175 266.40601 263.67463 259.84221
## Proportion of Variance   0.02741   0.02633   0.02547   0.02495   0.02423
## Cumulative Proportion    0.24881   0.27515   0.30062   0.32557   0.34980&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2023/10/07/da-pca-paradox/index_files/figure-html/unnamed-chunk-6-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## [1] 100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我们可以看到，在样品单一维度有差异但方差比较大的情况下，当样品数超过维度后，差异分析跟主成分分析就已经出现灵敏度差异了。也就是说，当样品数增加后，类似主成分分析这种探索式数据分析已经看不出预设差异了。同时我们又注意到，在样品量少于维度时，差异分析功效又是不足的，也就是根本测不到预设差异。&lt;/p&gt;
&lt;p&gt;这里有人可能觉得是不是主成分分析只考虑了维度间线性组合，如果我换一种非线性方法会不会还能看到差异？没问题，我们继续模拟：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(umap)
n &amp;lt;- c(50,100,1000,5000)
par(mfrow=c(2,2))
for(t in n){
        z &amp;lt;- c()
        for(i in 1:100){
                case &amp;lt;- rnorm(t,mean = np[i],sd=abs(np[i])*1.2+1)
                control &amp;lt;- rnorm(t,mean=np[i]*1.2,sd=abs(np[i])*1.2+1)
                zt &amp;lt;- c(case,control)
                z &amp;lt;- cbind(z,zt)
        }
        umap &amp;lt;- umap(z)
        plot(umap$layout,col=c(rep(1,t),rep(2,t)),pch=19,main=paste(t,&amp;#39;samples&amp;#39;))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2023/10/07/da-pca-paradox/index_files/figure-html/unnamed-chunk-7-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上面是用流形学习里的umap来进行的可视化，可以看出情况一致，毕竟我们模拟时差异并非是非线性的，所以流形学习也没法捕捉这种差异。&lt;/p&gt;
&lt;p&gt;此处我想说的是，如果我们过分依赖差异分析，在大数据量背景下，大概率会检测到一些客观存在但微弱的差异，这些差异只在均值水平才能发现，具体到个体差异里很难看出来，属于统计意义可能大于实际意义的范畴。&lt;/p&gt;
&lt;p&gt;这种情况不大可能发生在样品数小于维度数的场景下，那个场景里最大的问题是差异分析功效不足，增大样品量总是有益的。但却可以发生在维度远低于样品数，此时大数定律反而成了负面作用，因为我们总能发现差异或者说规律，但却缺少用专业知识来筛选差异实际意义的手段。&lt;/p&gt;
&lt;p&gt;很显然，此时主成分分析或聚类分析这些方法都没啥用，这些自上而下的方法根本就看不出数据中的异质性。不过，这倒可能帮我们过滤掉哪些微弱差异，只能暂时认为这些差异就是无关紧要的。但此时会遇到的问题就是我开头说的悖论，明明差异分析发现了大量差异，但整体就好像糊成一片，如果数据分析经验不足可能就不知道咋解释了。&lt;/p&gt;
&lt;p&gt;这种微弱的差异本质就是 type M 型错误，也就是如果效应比较弱，我们测到了也没实际意义。不仅仅是数据分析，在我们日常生活中这种错误也很常见，例如财经新闻在每天收市后的报道经常就是“受某某影响，今天大盘下降零点几个百分点”。零点几个百分点其实是属于随机过程，并不受某某影响，但即使是财经专家也要对着一堆噪音去找解释。更搞笑的是，这些专家的追随者在听了专家点拨后，马上也看到了潜在的规律性，然后带着优越感去跟其他人说你们能力不行，想不到这么远之类的。但问题是本来也没规律性啊，或者说这个所谓的规律本身的不确定性是大于确定性的。也就是当样本间方差足够大时，样本间均值差异的实际意义就很微弱了。好比两国人均GDP有显著差异，但两个国家内部贫富差异悬殊，此时与其比对人均GDP，不如把两国穷人划分成一类，富人划分成一类来进行对比，此时发现的问题可能更有实际意义。&lt;/p&gt;
&lt;p&gt;我一般不讨论社会科学规律，很大原因在于这些学科没有完成科学化改造，其规律性更像是一种自我实现的过程。也就是我首先构建一套逻辑自洽的理论，然后用理论指导实践，怎么做怎么对，用实际行动证明理论可行性。但如果同一个学科存在两种逻辑都自洽且都经过事实检验的理论，那你很难说哪种就是客观规律，或者说不存在最优路线，这就跟科学规律不一样了。自然科学规律是相对唯一的，做不到既同意理论A又同意理论B，最后一定会被更一般性的理论C统一起来。社会科学里的很多所谓规律其实是很主观的学术观点或认知体系，好一点的可以通过观察实验来证明，极端的就单纯讲逻辑自洽，在自己理论圈子里满地打滚抱团取暖，而他们眼中的金科玉律也许就像是上面我模拟的那样，客观存在但实际没意义，或者压根分类就不合理。&lt;/p&gt;
&lt;p&gt;要警惕那些大数据带来的发现。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>自定义大学排行榜</title>
      <link>https://yufree.cn/cn/2023/01/17/custom-ranking-us/</link>
      <pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2023/01/17/custom-ranking-us/</guid>
      <description>&lt;h2 id=&#34;比赛介绍&#34;&gt;比赛介绍&lt;/h2&gt;
&lt;p&gt;这是和鲸社区与 COS 统计之都联合举办的云讲堂实战系列活动第一场，本活动旨在从实际问题出发训练某综合性数据分析技能，优秀选手将通过统计之都&lt;a href=&#34;https://space.bilibili.com/22035559/channel/collectiondetail?sid=70922&amp;amp;ctype=0&#34;&gt;云讲堂&lt;/a&gt;报告展示自己的成果。第一场的实际任务是自定义大学排行榜，主要训练指标生成、可视化与可重复性报告的撰写等技能。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cosx.org/&#34;&gt;COS 统计之都&lt;/a&gt; 是一个旨在推广与应用统计学知识的网站和社区。由谢益辉创办，现任理事会主席为常象宇，现由世界各地的众多志愿者共同管理维护。&lt;/p&gt;
&lt;h2 id=&#34;背景介绍&#34;&gt;&lt;strong&gt;背景介绍&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;对数据科学社区而言，生成综合指标进行排名其实是经常会遇到的问题，例如什么样的文章要靠前推荐？什么商品更适合某类客户需求？而在研究工作中，很多时候也需要设计综合指标来辅助决策。例如，空气质量指数就是一个涵盖六种污染物浓度分指数的综合指标，而其公布的数值其实是对六个指标取最大值，也就是说，如果你看到空气质量指数同样是100的两个城市，一个可能是因为颗粒物超标，另一个可能是臭氧超标，这里的设计原则是木桶原理，取最差的那一个。社会科学中很多指标的生成往往也暗含了不同的选择标准或指标权重，例如消费者物价指数CPI的计算就会涉及多种商品的价格加权，美国CPI里食品比重不到8%而法国则在15%左右。&lt;strong&gt;这些加权或设计原理往往需要相关专业知识来背书，因此在常规的数据科学训练里很少被提及，但实战中却又特别需要&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要想训练综合指标的设计与生成，最简单的方法就是通过真实数据来研究一个通用主题。大学排行就是这样一个适合你练手的项目&lt;/strong&gt;，任何一所大学都能找到自己排名靠前的某个排行榜来作为招生的宣传，考生与家长也经常喜欢用排名来印证自己的选择是合理的。同时，好或者不好其实是一个很难定义的东西，国际上较为公认的大学排行有四个：QS、USNews、泰晤士报还有上海软科的世界大学排名，他们一般会构建一些量化子指标分别打分，最后算总和进行排名。&lt;/p&gt;
&lt;p&gt;但对个体而言，其实看重的点并不一样，例如大多数排名会算论文发表量，但如果学生不喜欢做学术，带这个指标的排名其实对他意义不大；从纯结果看，学生毕业后 10 年的年均收入对于大多数打工人可能很重要，但排名里可能完全不考虑。此外，大学排行里其实也掺杂了很多商业或可优化因素，例如泰晤士报排名很多年来都是牛津排第一，而 USNews 排名美国大学时会考虑录取率，这就搞的很多有钱的私校在申请季大量投广告来拉低录取率。&lt;/p&gt;
&lt;p&gt;在奥巴马时代，美国政府意识到排名的乱象已经形成了误导，于是教育部就出钱收集了大量的大学相关数据免费公开到网上，这样感兴趣的家长和学生可以根据自己对未来的规划来排名申请大学。这个项目运行到现在不说是大获成功吧，也可以说门可罗雀。虽然数据每年都更新且全部透明公开带 API 跟文档，但利用率其实不高。 因此，可以利用这部分数据来训练综合指标的设计与生成，打造一个你认为合理的美国大学排行榜。&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;a href=&#34;https://fivethirtyeight.com/&#34;&gt;538&lt;/a&gt;就针对这部分数据进行过&lt;a href=&#34;https://fivethirtyeight.com/features/the-economic-guide-to-picking-a-college-major/&#34;&gt;分析并撰写了报告&lt;/a&gt;，通过毕业后收入对不同专业进行了排名，发现很多有意思的结果：从收入看STEM（科学、技术、工程、数学）这个传统认为收入比较高的专业里S，也就是科学收入并不高；心理学很流行但其实工资并不高；精算行业收入很高，但失业率也很高等，这些结果都有助于你去构造一个大学排名指标，而且这篇文章的代码在GitHub上&lt;a href=&#34;https://github.com/fivethirtyeight/data/tree/master/college-majors&#34;&gt;有&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据读取示例&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;如果用R可使用&lt;a href=&#34;https://www.btskinner.io/rscorecard/index.html&#34;&gt;rscorecard&lt;/a&gt;包来通过API读取数据&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-R&#34; data-lang=&#34;R&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 在 https://api.data.gov/signup/ 注册API key&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;sc_key&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;YOUR_API_KEY_HERE&amp;#39;&lt;/span&gt;)
df &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sc_init&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;%&amp;gt;%&lt;/span&gt; 
    &lt;span style=&#34;color:#a6e22e&#34;&gt;sc_filter&lt;/span&gt;(region &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, ccbasic &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt;), locale &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;41&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;43&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;%&amp;gt;%&lt;/span&gt; 
    &lt;span style=&#34;color:#a6e22e&#34;&gt;sc_select&lt;/span&gt;(unitid, instnm, stabbr) &lt;span style=&#34;color:#f92672&#34;&gt;%&amp;gt;%&lt;/span&gt; 
    &lt;span style=&#34;color:#a6e22e&#34;&gt;sc_year&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;latest&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;%&amp;gt;%&lt;/span&gt; 
    &lt;span style=&#34;color:#a6e22e&#34;&gt;sc_get&lt;/span&gt;()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;时程安排&#34;&gt;&lt;strong&gt;时程安排&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;报名 ddl：1 月 27 号 23:59&lt;/li&gt;
&lt;li&gt;报告提交ddl：2 月 10 号 23:59&lt;/li&gt;
&lt;li&gt;作业汇报交流会：2 月 18 号 19:00（腾讯会议号请关注统计之都公众号或和鲸活动页面更新）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;奖项设置&#34;&gt;奖项设置&lt;/h2&gt;
&lt;p&gt;TOP1：优秀奖。将获得 800 元稿酬、电子证书、鲸奇徽章。
TOP2-4：创意奖。将获得 200 元稿酬、电子证书。
其他有效提交：参与奖。将获得《现代科研指北》纸质书 1 本、电子证书。&lt;/p&gt;
&lt;h2 id=&#34;报告要求&#34;&gt;&lt;strong&gt;报告要求&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这个竞赛没有标准答案与指标，你需要提交的是在线的 Jupyter Notebook 项目，需要包含从数据清洗到指标生成及可视化的全过程且包括理由。也就是说，你需要提交的是一份具有可读性的&lt;strong&gt;可重复性报告&lt;/strong&gt;，要说明指标设计的原因、有效性、灵敏度及延展性，并生成相关图表或可视化面板。&lt;/p&gt;
&lt;p&gt;当然，你也可以只针对一个或几个指标进行可视化与深入讨论，结合新闻与相关研究撰写挖掘其中隐含的例如歧视、冷热门专业、学费/收益比等现象，给出你认为值得关注的结论。&lt;/p&gt;
&lt;p&gt;祝玩得愉快！&lt;/p&gt;
&lt;h2 id=&#34;面向人群&#34;&gt;&lt;strong&gt;面向人群&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;想要提高数据分析实战能力的学生、老师等研究人员&lt;/li&gt;
&lt;li&gt;对指标设计感兴趣的数据分析从业者&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;主办方&#34;&gt;主办方&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;COS 统计之都&lt;/strong&gt;：专业、人本、正直的统计学服务平台。
&lt;strong&gt;主页&lt;/strong&gt;：https://cosx.org/&lt;/p&gt;
&lt;p&gt;活动链接：&lt;a href=&#34;https://www.heywhale.com/home/activity/detail/63b7ecd6555e5f7e505374af&#34;&gt;https://www.heywhale.com/home/activity/detail/63b7ecd6555e5f7e505374af&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>解卷积</title>
      <link>https://yufree.cn/cn/2022/05/21/deconvolution/</link>
      <pubDate>Sat, 21 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2022/05/21/deconvolution/</guid>
      <description>&lt;p&gt;解卷积本来是指反解卷积，但在色谱质谱联用里特指从多物质混合的色谱图里分离出单独物质的色谱。不用说，这跟卷积原始概念已经八杆子打不着了，就是个学科小领域里造词或者填词赋予新含义的案例。要搞清楚这个问题，得从卷积说起。&lt;/p&gt;
&lt;p&gt;卷积跟加减乘除一样，就是一种函数运算方法，定义上就是两个函数经过一通操作变成第三个函数。这个一通操作里涉及两个要点：1）要对其中一个函数要进行反转位移之后2）对两个函数的乘积求和或求积分。这个反转与位移发生在积分的方向上，先卷后积。&lt;/p&gt;
&lt;p&gt;估计很多人看到这个定义会感觉莫名其妙，因为这个定义似乎没啥实际意义，凭啥要卷？又凭啥要积？这就涉及具体学科知识了。不过数学上倒也有个方便的解释，那就是函数卷积的傅立叶变换是函数傅立叶变换的乘积。傅立叶变换可以理解为一种时域与频域的转换，这样时域上卷积就是频域乘积，进行卷积运算相当于在另一个域里做乘积，傅立叶变换是可逆的，只要你能在一个域里找到乘积的物理意义，那么卷积运算就不难理解了。同时这也给解卷积提供了思路，既然可以搞成乘积形式，那就可以对原始数据做变换求卷积就简单多了。&lt;/p&gt;
&lt;p&gt;可能有人又要问了，为啥我要对一个函数做变换？大概率还是因为计算上的方便，例如取对数后乘法就变加法了。又或者让你求正弦函数，你要是不做个泰勒展开那就只能查表了，别忘了我们基于逻辑门的计算机CPU也就能做个加法运算，其余数学运算都要还原成二进制逻辑运算才能进行。至于说傅立叶变换，可以理解为把一个线性函数转为不同频率正弦或余弦函数的叠加，这样做一个好处在于三角函数的导数与积分还是三角函数，然后关注相位变化就可以了。所以说我们并不是吃饱了撑的搞出一些数学变换或运算方法，很多时候是因为进行这些运算或变换能解决实际问题。不过，这是我学了高数很久之后才在实践中意识到的，感觉现在数学教育还是过于抽象了。&lt;/p&gt;
&lt;p&gt;不过卷积也可以用幂级数乘法来理解，两个幂级数相乘后同幂次的系数怎么算？打比方 &lt;code&gt;$x^2+2x+1$&lt;/code&gt; 与 &lt;code&gt;$x+1$&lt;/code&gt; 求乘积的一次方系数，这就要是前者的一次与后者的零次乘积与前者零次与后者一次的和，也就是3，计算对齐过程就是个卷积。其实在概率论里，两个独立变量的和的概率密度函数就是这两个独立变量的卷积，例如两个骰子掷出某个点数和的概率就是两个独立变量概率密度函数的卷积，当然我们固定了和，所以两个变量其实求卷积时并不独立了。到这里其实我们大概能感受到，卷积一定是要在两个函数自变量的特定和上的一个属性。&lt;/p&gt;
&lt;p&gt;到这里为止，我们只知道了卷积运算因为具备一些特性，可能会是一种有实际意义的运算，但实际中为啥要用还是还是要看具体问题。在信号处理里，我们固定信号输入函数跟这个信号自身在时间上的衰减函数，他们的卷积就是时间上输出的信号，这个信号既包含了输入的信号，也累积叠加了衰减效果，这个应该不难理解，时间点x上我们看到的输出信号就应该是前面t = 0时刻信号衰减到t=x时的信号累积上t=1时刻信号衰减到t=x的信号，以此类推。所以我们看到的输出本来就是个卷积后的结果。&lt;/p&gt;
&lt;p&gt;这里积不难理解，但卷在哪？卷在那个衰减函数上，因为你实际用的是输入t=0去乘了衰减函数t=x的数，如果我们把这两个函数对齐，就需要先对衰减函数在积分的时间轴t上做镜像反转，然后平移到t=x处对齐，这就是卷的过程。此处卷积连接的输入与衰减函数也是通过时间和恒定来连接的，也就是如果你能构筑两个函数，其自变量和在某个维度上是恒定的，那么他们就适合在这个维度上做卷积运算且应该有具体的物理意义，例如某种累积效应。不过卷积是翻转加平移的，如果只平移不反转，在乘积上求和或者积分也可能有意义，例如求相关性。这里的意义是需要看需求的，构建运算不难，但跟物理世界相联系是需要下功夫理解的。&lt;/p&gt;
&lt;p&gt;上面那个是一维卷积，如果输入输出都是个二维图像，那么卷积运算就相当于对图像做滤镜，跟输入做卷积的就是所谓的卷积核或滤镜。这个卷积核在卷积神经网络里其实就对应了图像的某个局部特征，或符合某种模式后可以穿过滤镜形成有效信号。当卷积核是3*3的矩阵，那么当图像是出现某种模式时，训练神经网络过程会找到这个对应的卷积核。一张图片可能有很多特征，那么也就可以训练出很多卷积核，当进行图片分类预测时，我们可以训练出一个基于卷积核的全连接层来输出预测分类。当然这里激活层池化层等技术或模型构架就不考虑了，但卷积运算确实是卷积神经网络的一个核心，专门用来抽数据中的特征。至于说为啥是卷积运算而不是其他运算，其实基于其他运算的也有，但本质上要处理的基本问题是图像抽特征的方法，否则1400万像素的图片你要训练的参数就是个天文数字，但训练几万个卷积核就容易多了，可以理解为一种降维的思路。&lt;/p&gt;
&lt;p&gt;说白了卷积运算就是一种特殊滤波器或放大器，但具体到分析化学里，问题就不一样了。分析化学的光谱分析里也涉及卷积，具体说就是我们仪器上测到的信号是真实信号跟某些卷积核做卷积出来的，当然这不是说噪音，而是诸如衍射过程这种仪器来源的有固定模式的信号，此时解卷积其实就是个模式识别过程。到这里卷积的概念还算是符合原有定义的，但具体到学科小领域就完全变味了。&lt;/p&gt;
&lt;p&gt;质谱色谱联用测到的数据是一个三维向量：一个维度是时间，一个维度是荷质比，一个维度是响应。早期可视化手段基本就是直接把荷质比这个维度上的所有响应求和形成总离子流图。但因为存在共流出现象，这种图上你数出来的色谱峰数目跟物质数目是对不上的，很多单独的峰其实是多个物质在不同荷质比上的响应叠加出来的，这导致总离子流图的峰形长得怎么说呢，比较畸形。&lt;/p&gt;
&lt;p&gt;时间来到1974年，Biller 跟 Biemann 发表了一篇题为 &lt;em&gt;Reconstructed mass spectra, a novel approach for the utilization of gas chromatograph&amp;mdash;mass spectrometer data&lt;/em&gt; 的论文，提出了一种重构出单独质谱峰的算法，这个算法受限于年代，非常简单，就是提出用每个扫描循环离子响应最大值来分离不同物质，然后合并对应的扫描得到比较干净的谱图。然后到了1976年，Dromey 等人搞出了一个非常复杂的利用相似峰形建模提取独立物质质谱的方法，这个方法效果不错，但因为计算上太复杂基本属于原汤化原食，就这批人在用。等到了1992年，Colby在JASMS上发表了题为&lt;em&gt;Spectral deconvolution for overlapping GC/MS components&lt;/em&gt;的文章，其实这篇文章的核心在于对1974年的方法进行改进，具体来说就是每个扫描循环里面只找十个峰，然后合并谱图重构出总离子流图，进而提高质谱分离的分辨率。因为这活是90年代做的，94年就有人将其程序化了，但很不幸同时也就把解卷积这个词给带到这个小领域里了。&lt;/p&gt;
&lt;p&gt;不过这里我们很清楚此处的信号根本就没有卷积，解卷积也无从谈起，但因为Colby这篇文章，后面三十年大家就都默认了解卷积等同于重构质谱峰的意义了。不过在蛋白质质谱领域，解卷积还有另外一个概念，就是把多电荷峰反解回分子量，此处最流行的是一种利用最大似然度求解的maxent算法，同样也跟卷积的原始概念毫无关系。在中文环境里，研究人员还有仪器厂商的销售尤其喜欢这个词，因为听上去高大上显专业，但我估计他们中的大多数可能都不知道这个概念本身其实是用错了，单纯以讹传讹，三人成虎。&lt;/p&gt;
&lt;p&gt;但更可悲的是其实错不错都不重要了，很多一线科研人员的数学功底基本上都归零了，傅立叶变换、卷积、二重积分、delta方法等概念全都谁教的还给谁了。论文里的数据分析都是对着其他论文照猫画虎，经常是驴唇不对马嘴，要是继续这么自己造词搞小圈子，那跟八股文写茴字也没啥区别了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>漫谈 base R 与 ggplot2 </title>
      <link>https://yufree.cn/cn/2021/12/18/base-r-ggplot2/</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2021/12/18/base-r-ggplot2/</guid>
      <description>


&lt;p&gt;这几天心里颇不宁静。纽约的单日新冠确诊数又出了新纪录，工作邮箱里好几封通知群聚感染的邮件，很多还是完全免疫甚至打了加强针的。感觉新变种可以自立山头看作新病毒了，而面世仅一年的疫苗似乎特异性已经不那么乐观了。不过更强的传染性倒不见得有更强的症状，但大概率这病毒是打算跟人类长期共存了，这就有点抗生素与致病菌的剧本了。我理解国内清零政策很大程度是因为放开后医疗系统会崩溃，不过长期清零对于一种不断变异增强传染性的病毒而言是否具有可持续性我想已经在被论证了，同样完全躺平现在看也不是什么好的应对策略，解决问题不能非此即彼，总是要根据实际情况动脑子的。说到这我就来填一个很早就想填的坑，是关于R绘图系统的。&lt;/p&gt;
&lt;p&gt;不知道从什么时候开始，tidyverse 跟六角贴纸开始满天飞了，在我看来工具是用来解决问题而不是创造问题的，围绕工具形成的文化现象或类似价值观的东西属于副产品，但推广价值观这类副产品显然要比推广软件容易，因此到一定程度总会出现一些反客为主的声音。我对此不置可否，只是想说工具一定要能解决问题才有意义，在解决问题上，将问题清楚描述出来要比直接问某某工具咋做某某图更重要。&lt;/p&gt;
&lt;p&gt;我接触 R 是在十年前，那个时候提到 R 的绘图系统，更多指的是 base R 与 grid/Lattice 这两套系统，前者强调的是最高程度的自定义自由度而后者侧重的则是一个函数给出想要的图形。显然，前者更适合原始意义的绘图比较适合开发者而后者更适合具体应用场景的用户，后者的一个显著优势是默认出图就足够漂亮而显著缺点则是自定义比较费劲。用户从来都是最难伺候的，总有用户既想要最大程度的默认好看又需要一定程度的自定义（说的就是科研狗），此时 ggplot 就出现了。&lt;/p&gt;
&lt;p&gt;ggplot 里面的 gg 代表的是图形语法，本来 ggplot 就是 Hadley 理论转实践的尝试，原始的包在08年就不更新了，现在 CRAN 上也没有了，后面 ggplot2 里的那个2就是致敬最原始的版本 ggplot 。ggplot2 最显著的优点就是用图形语法结合了 base R 与 grid 系统的理念，默认足够好看，自定义掌握了一套通用层层叠加语法后也很容易上手。不过，我也得替 grid/Lattice 说句话，他们也是支持自定义的，Lattice 到今天也处于活跃开发状态，并且跟 R 一起发布。不过他们的自定义显然没有上升到价值观层面，跟 base R 的逻辑更像，支持公式化的数据表达，支持对象化操作，也可以通过 &lt;code&gt;update&lt;/code&gt; 这个函数来有限调节自定义的细节。不过有句老话说“革命不彻底就是彻底不革命”，用户从来不会过多理会开发历史，基本都是颜狗。ggplot2 也是依赖 grid 包来构建的，包括了所有 Lattice 的优点但学起来更容易，所以很快用户就倒向了这套绘图系统。不过，我们现在常看到的 base R 与 ggplot 的对比很大程度是从可视化结果上来的，但别忘了 ggolot 也是 R 语言的产物，理论上研究清楚了 grid 包也可以搞出类似的东西，真正的区别是用户的使用逻辑。&lt;/p&gt;
&lt;p&gt;base R 的使用逻辑更像是白纸画图，从坐标轴到图像都是可以随意自定义的，与之对应的就是需要用户了解一大堆底层命令。base R需要用户对可视化有很具体的了解，例如先用纸笔草图画出雏形，然后通过排列组合基本的作图元素重现在绘图区里。举个最简单的例子，想在条形图上加个误差线，就需要分解为具体的两部分：1）误差线长度与起点坐标，2）然后从起点坐标平行y轴画一条线段，线段末端可以把原有箭头末端里箭头的角度从锐角改成90度垂直。然后我们就能看到误差线了。&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;data(&amp;quot;iris&amp;quot;)
mean &amp;lt;- by(iris$Sepal.Length,iris$Species,mean)
sd &amp;lt;- by(iris$Sepal.Length,iris$Species,sd)
temp &amp;lt;- barplot(mean,ylim=c(0,max(mean)+2*max(sd)))
arrows(temp,mean+sd, temp, mean-sd, angle=90, code=3, length=0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/12/18/base-r-ggplot2/index_files/figure-html/unnamed-chunk-1-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这个简单到不能再简单的功能偏巧默认的条形图 &lt;code&gt;barplot&lt;/code&gt; 里没有，函数文档里那个误差线又不是平头的，所以很多用户马上认为 base R 做不了。单就这个例子而言，其实条形图本来就不应该有误差线，真正需要表示不确定性范围应该用箱形图或提琴图来展示真实分布，但你要是去读学术论文会发现时至今日还是有大量图用条形图加误差线，有的还要加星号表示显著差异。这些从作图角度而言完全就是缝合怪，但始作俑者后人不断。很多用户只知道最终要看到什么样的图，但完全不关心图背后的统计学意义，然后就到处问哪个函数能做这样的图，追求形似。这是我认为现在还需要学 base R 作图的一个重要原因，那就是用户一定要有把图形元素拆解回原始数据的能力，知道自己再干什么而不是盲目追求炫酷，这太浮躁。&lt;/p&gt;
&lt;p&gt;在 ggplot 这套系统里，图片实际被拆解成了三个部分：数据、映射与可视化方式。数据最好是一个数据框，映射解决变量对应在图片上的维度例如哪个是x？哪个是y？哪个分组用颜色/大小/形状来表示，可视化方式就是指定出图的具体形式。其实这个逻辑在 base R 里也是成立的，只不过最后这个不同可视化方式会对应不同函数，然后里面参数一大堆名字还不一样。ggplot则是把这些都规范到一种形式里去了，而且可以通过加号这个函数层层叠加可视化方式，而各自可视化方式内部也可以重新进行坐标映射。此外，ggplot事实上也支持在作图过程中执行一定的计算，例如平滑或者汇总，这类计算都归到&lt;code&gt;stat_&lt;/code&gt;系列的函数里了。如果打算自定义某个维度，可以统一用 &lt;code&gt;scale_XXX_manual&lt;/code&gt; 来进行修改，这里&lt;code&gt;XXX&lt;/code&gt;对应的是你映射的维度，例如 &lt;code&gt;scale_fill_manual&lt;/code&gt; 对应的就是自定义填充颜色。注意，这里是映射后的图片里的维度，而映射则一般都是在可视化方式的 &lt;code&gt;aes&lt;/code&gt; 里定义的，用来把数据中的某个维度指定到图片里的维度里。此外，ggplot 自然也支持根据分组信息的多图可视化，这里就是&lt;code&gt;facet_grid&lt;/code&gt;函数来统一管理，这里 ggplot 的价值观是每一张图都要尽可能清楚展示数据，且一幅图讲一个故事，然后通过坐标对其进行比较。也就是说，ggplot里画双坐标轴这种图就不太推荐，虽然也可以自定义后来个形似，但其实双坐标轴图在可视化方式里面的地位大概跟饼图或3D柱形图差不多，属于人厌狗嫌那个组的。所有的双坐标轴图理论上都可以并应该拆成两幅图来描述两件不同的事，如果两件事相同，那么双坐标轴总可以转为单坐标轴。&lt;/p&gt;
&lt;p&gt;从我个人经验而言，如果你掌握了 base R 作图，转到 ggplot 作图非常轻松，会省掉一大堆需要自定义的东西，统一用他们的函数体系来画就行。反之，如果掌握了 ggplot 的语法，学 base R 应该也很轻松，因为base R绘图函数里的映射与可视化方式也都有现成的包或函数，只是可能参数名字乱一些。说 ggplot 对新手友好，一大部分指的是默认美观，还有一部分原因就是从设计上就阻止了很多类似3D柱形图或双坐标轴的存在。但搞笑的是在爆栈网上从来不缺人去问这类图如何在ggplot体系里实现，也不缺大神给出解决方法。因此，我一度认为限制一定的自由度其实也对培养良好的可视化习惯有帮助，但现实却是很多用户既没学到ggplot里的可视化原则，又产生了对 base R 莫名其妙的优越感，一抬手就是管道化教条式的层层叠加代码，一行代码能做到的非学习牛津大学贝利学院优秀毕业生、大英帝国爵级司令勋章获得者、大不列颠及北爱尔兰联合王国内阁常任秘书汉弗莱·阿普比的语言风格去卡形式，这就距离解决问题比较遥远了。&lt;/p&gt;
&lt;p&gt;其实 base R 与 ggplot 之争的背后存在一个代码风格统一的问题，如果选 ggplot ，确实代码更容易读，但问题是很多初学者的水平大概就在复制代码改变量名的水平，完全不知道代码的意义，这样层层堆出来的代码甚至会重复定义，也没啥可读性。究其原因，代码风格应该是初学者到了中级水平才应该考虑的问题，初学者最应该了解的是可视化的逻辑，然后结合自己具体的问题去练习并累积经验。不过，很多初学者都是excel打底的，脑子里全是哪个对话框画什么样的图这种思维，这种情况不论是转 base R 还是 ggplot ，他们脑子里的预期都是一个函数出图解决问题，根本不关心图是如何画出来的，这就很容易变成教条化的用户，记住步骤但不知道原因。实话说很多基于ggplot体系的作图包本质上就是把需要用户自定义的部分自己强制定义一遍然后就上线了，这种包完全迎合了某些领域的独特可视化品味，后面跟了一批教条化的用户，这样的默认可用的软件包我觉得并不利于数据分析人员理解自己的数据。&lt;/p&gt;
&lt;p&gt;但凡学用编程语言进行可视化，起码是要知道自己在做什么的。看到一张漂亮的图，可以尝试分析图片元素，然后尝试自己将其组合起来。有这种想法后，base R 也好，ggplot 也好，学明白一个就基本也会另一个了，甚至说迁移到 python 的 matplotlib 或其他交互式作图系统都不困难。但如果搞不清楚原理，那么换一个软件就只能继续到网上复制现成的代码。我倒不是鄙视从网上复制现成的代码，毕竟这事我也没少做，但总要有个学习的过程才能掌握。&lt;/p&gt;
&lt;p&gt;软件优劣之争在我看来很多都是鸡同鸭讲，很多比较都是在特殊应用场景下才有明显区别。但每个人的最终应用场景毕竟是不同的，解决问题的意义显著大于跟工具分高下的意义。显然编程语言绘图的能力范围更多受限于使用者的能力而非工具本身，因此这样的工具优劣争论还是少一些吧，争到最后大概率都成了人身攻击。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>辛普森悖论</title>
      <link>https://yufree.cn/cn/2021/08/27/simpson-paradox/</link>
      <pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2021/08/27/simpson-paradox/</guid>
      <description>&lt;p&gt;曾经有两本书伴我度过了无数漫漫长夜，毕竟每次鼓起勇气看不超过10页就会睡过去，一本是&lt;a href=&#34;https://yufree.cn/cn/2020/09/01/metaphor/&#34;&gt;前面&lt;/a&gt;写过的 &lt;strong&gt;metaphors we live by&lt;/strong&gt;，另一本就是《悖论简史》。这种书的一大特色就是读的时候如果不带脑子看不懂，带脑子就头疼，但可气的是写的还挺有趣。&lt;/p&gt;
&lt;p&gt;基础科研的很多突破都是来自于悖论或者说反例，不过这里的悖论属于理论悖论，大概率是理论本身有问题，需要新的理论来解释观察与实验。还有很多悖论属于错觉，本身不是悖论仅仅因为解释上的片面出现，其实魔术就可以化为这一类，很多魔术手法展示的现象完全是违背常理的，但了解手法后就会发现其实是利用了一些惯性思维产生的错误解释。真正的悖论是语义学上的，例如“这句话是错的”就是一个语义悖论，如果认为这句话是错的那就应该是对的，但如果认为这句话是对的其又描述了一个自己是错误的判断，这种带有自指的悖论属于无解。其实数学领域的第三次危机本质上也要通过语义学划定语义解释范围来凑合解决，这属于逻辑自身的漏洞。&lt;/p&gt;
&lt;p&gt;辛普森悖论属于某种程度上的错觉悖论。其本质就是说存在一种分组方法，让&lt;code&gt;$\frac{A_1+B_1}{C_1+D_1} &amp;gt; \frac{A_2+B_2}{C_2+D_2}$&lt;/code&gt;，然后&lt;code&gt;$\frac{A_1}{C_1}&amp;lt;\frac{A_2}{C_2}$&lt;/code&gt; 并且 &lt;code&gt;$\frac{B_1}{D_1}&amp;lt;\frac{B_2}{D_2}$&lt;/code&gt;，乍看之下会感觉莫名其妙，因为数学上找这么一组数太简单了（睡不着觉别数羊，就去构造辛普森悖论，比数羊效果好多了）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$\frac{1+3}{5+4} = \frac{4}{9} &amp;gt; \frac{4}{10} = \frac{2+2}{8+2}$&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$\frac{1}{5}&amp;lt;\frac{1}{4}$&lt;/code&gt; 并且 &lt;code&gt;$\frac{3}{4}&amp;lt;\frac{1}{1}$&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;从数学角度看完全不存在悖论，因为&lt;code&gt;$\frac{A}{B}+\frac{C}{D} \neq \frac{A+B}{C+D}$&lt;/code&gt;，所以&lt;code&gt;$\frac{A}{B}$&lt;/code&gt;与&lt;code&gt;$\frac{C}{D}$&lt;/code&gt;的数值比较关系无法传递到&lt;code&gt;$\frac{A+B}{C+D}$&lt;/code&gt; 的比较里。&lt;/p&gt;
&lt;p&gt;但我们要加个语境就完全不同了。例如，这里我们把上面的数扩大十倍，某种化学品暴露组一共90人患病40人，对照组一共100人患病40人，此时研究人员会得出暴露组发病率比对照组高的结论。然而，如果暴露组里有50名男性发病10人，对照组80名男性发病20人，我们会发现男性对照组发病率高于暴露组；而同时女性40人里发病30人，对照组里20人发病20人，还是暴露组低于对照组。&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;此时我们就不得不进入因果推断的领域了，我们必须对化学品、性别及疾病这三者关系建模，这也算某种三体问题了，考虑方向其实一共就23种关系：&lt;/p&gt;
&lt;h2 id=&#34;三者都没关系&#34;&gt;三者都没关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品 性别 疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里只有一组两两关系&#34;&gt;三者里只有一组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品-&amp;gt;性别 疾病&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别 疾病&lt;/li&gt;
&lt;li&gt;化学品 性别-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;化学品 性别&amp;lt;-疾病&lt;/li&gt;
&lt;li&gt;性别 化学品-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;性别 化学品&amp;lt;-疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里有两组两两关系&#34;&gt;三者里有两组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品-&amp;gt;性别-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;化学品-&amp;gt;性别&amp;lt;-疾病&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别&amp;lt;-疾病&lt;/li&gt;
&lt;li&gt;性别-&amp;gt;化学品-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;性别-&amp;gt;化学品&amp;lt;-疾病&lt;/li&gt;
&lt;li&gt;性别&amp;lt;-化学品-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;性别&amp;lt;-化学品&amp;lt;-疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里有三组两两关系&#34;&gt;三者里有三组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品&amp;lt;-性别&amp;lt;-疾病&amp;lt;-化学品&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别&amp;lt;-疾病-&amp;gt;化学品&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别-&amp;gt;疾病&amp;lt;-化学品&lt;/li&gt;
&lt;li&gt;化学品&amp;lt;-性别-&amp;gt;疾病-&amp;gt;化学品&lt;/li&gt;
&lt;li&gt;化学品-&amp;gt;性别&amp;lt;-疾病&amp;lt;-化学品&lt;/li&gt;
&lt;li&gt;化学品-&amp;gt;性别&amp;lt;-疾病-&amp;gt;化学品&lt;/li&gt;
&lt;li&gt;化学品-&amp;gt;性别-&amp;gt;疾病&amp;lt;-化学品&lt;/li&gt;
&lt;li&gt;化学品-&amp;gt;性别-&amp;gt;疾病-&amp;gt;化学品&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们的专业知识或者语义本身就可以缩小待检验的模型，例如性别是先天的，所以凡是有化学品决定性别的都可以排除掉，疾病也不可能决定性别跟化学品，此时我们就剩下六种模型了：&lt;/p&gt;
&lt;h2 id=&#34;三者都没关系-1&#34;&gt;三者都没关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品 性别 疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里只有一组两两关系-1&#34;&gt;三者里只有一组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品&amp;lt;-性别 疾病&lt;/li&gt;
&lt;li&gt;化学品 性别-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;性别 化学品-&amp;gt;疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里有两组两两关系-1&#34;&gt;三者里有两组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品&amp;lt;-性别-&amp;gt;疾病&lt;/li&gt;
&lt;li&gt;性别-&amp;gt;化学品-&amp;gt;疾病&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者里有三组两两关系-1&#34;&gt;三者里有三组两两关系&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;化学品&amp;lt;-性别-&amp;gt;疾病&amp;lt;-化学品&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里假如我们发现性别确实会同时影响化学品跟疾病，那么就必须考虑控制性别后的净效应。假如性别只影响化学品不影响疾病（例如女性喜欢用化妆品暴露量更大），那么那么我们则不需要控制性别可以直接考察化学品对疾病的影响。如果性别也不影响化学品，那么也可以直接考察化学品对疾病的影响。这就是三种化学品跟疾病有关系的模型。如果化学品跟疾病本就没关系，甚至性别也跟疾病没关系，例如这是一种细菌性传染病，那从一开始研究就没有因果关系支持，做出的结果就属于玄学了。但一定不要直接排除掉这些可能，不论常识还是专业知识都排除不了就需要逐一考察。&lt;/p&gt;
&lt;p&gt;通过分析这三种模型，我们会发现要首先检验性别跟疾病是不是有关系，确定了这一条，后面就知道是不是要考虑按性别分组了。此时辛普森悖论从实际意义上就解决了，靠的其实还是我们自己赋予的实际语义与专业知识，但别忘了专业知识可能本身就是错的，实际语义可能存在二义性，这些才是搞出悖论的根基。&lt;/p&gt;
&lt;p&gt;不过如果我们看回原始版辛普森悖论，里面的三体是性别、学院及录取率，要解决这个问题就还是要把23种可能性全列出来然后排除掉学院决定性别、录取率决定性别这些语义跟常识上不存在的可能性，然后就可以知道需要检验的是什么了，但这里可以看出辛普森原版悖论可排出的可能性要比我的例子少，因此需要检验的模型就更多，跟性别有关决定录取率的模型有关的有五个。我们来看下其中两个有三组两两关系的模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;性别-&amp;gt;学院&amp;lt;-录取率&amp;lt;-性别&lt;/li&gt;
&lt;li&gt;性别-&amp;gt;学院-&amp;gt;录取率&amp;lt;-性别&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学院决定录取率还是录取率决定学院这个是不太好说的，因为这两者可能并不是谁决定谁的，可能被学校同时控制，例如学校会决定学院规模与最低录取率之类，此时就不是三体问题，因为另一个变量学校又出现了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;性别-&amp;gt;学院&amp;lt;-学校-&amp;gt;录取率&amp;lt;-性别&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时因果图出现一个对撞结构，你要是需要控制学院就开了后门无法正确估计性别的作用，此时就不应控制任何变量直接看两者关系。但真实世界哪有这么简单，学校这个因素通常我们根本观察不到，所以也不好假设其与学院的关系，如果学院可以影响学校决策，此时就还是要控制学院。也就是说辛普森悖论是否有解其实完全要依赖实际存在的因果关系。&lt;/p&gt;
&lt;p&gt;Judea Pear 曾经写过一份辛普森悖论的技术&lt;a href=&#34;http://ftp.cs.ucla.edu/pub/stat_ser/r414.pdf&#34;&gt;报告&lt;/a&gt;，里面给出了一种无限层级的因果图，他起了名叫做辛普森悖论机。在那张图里，如果你顺次控制混杂因素与对撞因素，那么原因与结果就会反复出现需要控制变量与不需要控制变量的情况。也就是说，想解决悖论，重要的是解决背后的因果图，不同语境逻辑或因果图下对其他变量控制与否是可以完全不同的。我们最终只能接受一个相对语境下的正确答案，绝对语境下那个数学问题其实并没有意义。&lt;/p&gt;
&lt;p&gt;也就是说，辛普森悖论其实暗示了我们不同自洽逻辑下可以出现不唯一的正确解，而这个正确与否取决于你对其背后因果关系模型的假设，而这种假设可以不唯一。好消息是自然科学中检验假设很大一部分可以通过实验来证实或证伪，但坏消息却是我们日常交流用的语言与语义可能天然就无法将因果关系描述清晰，能量化的数值无物理意义而有物理意义的数值无法量化，这就导致我们只能看到模型下的真实而无法验证模型本身。这部分内容在科学哲学里就涉及实在论与非实在论了，也是催眠利器。&lt;/p&gt;
&lt;p&gt;或许我们所谓解决悖论的方法不过就是引入一套模型屏蔽掉会产生悖论的讨论，但这反而说明了悖论的无解与我们自然语义天然存在漏洞。至于说不同学科根据自己学科利益来报道结果倒也不用太担心，这类弱效应的成果最多搞出一堆保健品与智商税产品，基本上无害。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>平行世界的统计推断</title>
      <link>https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/</link>
      <pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/</guid>
      <description>


&lt;p&gt;最近重新看了下之前对p值的笔记，突然对零假设充满了陌生感。在p值的语境里，当我们看到数据D在零假设下发生的概率低就会做出数据D不支持零假设的判断，这是一个条件概率等价替换的问题：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$$p(H0|D) = p(D|H0)$$&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个当然是有问题的，我真正关心的是零假设是否成立而不应该是数据出现在零假设下概率。而这在假设检验的设计中转化成了零假设成立下出现观察数据的概率，这里最大的不对劲在于数据D不支持零假设依然无法判断零假设是否成立。对于实验科学，我们能收集数据D，但检验零假设似乎没什么道理，零假设是来自于随机过程，我们真正关心的从来都是产生差异的过程，现在却要用随机过程来检验产生差异与否，总感觉哪里不对。&lt;/p&gt;
&lt;p&gt;不过重读了丁鹏老师的&lt;a href=&#34;https://cosx.org/2019/05/recheck-the-lady-tasting-tea/&#34;&gt;文章&lt;/a&gt;后，我意识到当年Fisher搞出的统计推断的背景的女士品茶实验其实是穷举所有可能，因为品茶结果是离散的，所以穷举空间是有限的，此时发生各种情况的概率是离散的，这也就形成了Fisher精确检验的基础。这里面容易被忽视的点在于品茶实验中品茶顺序与结果是无关的，也就是形成正确答案的顺序与答案无关，也就是说如果数据D是真理，那么随机化过程不影响真理对错。&lt;/p&gt;
&lt;p&gt;那么回到前面的问题，Fisher这个p值设计实际上巧妙的规避了&lt;code&gt;$p(H0|D)$&lt;/code&gt;与&lt;code&gt;$p(D|H0)$&lt;/code&gt;的区别，因为在这个离散概率的语境下，空假设提供的实际是一个虚拟的有限平行宇宙，当某个假设成立时，数据一定会支持假设而不成立时数据在有限平行宇宙里只会以很低的概率出现，&lt;code&gt;$p(H0|D)$&lt;/code&gt;与&lt;code&gt;$p(D|H0)$&lt;/code&gt;的讨论在这里就没意义了，虚拟的有限平行宇宙实际是给出了所有可能性空间。也就是说，产生差异这件事被零假设转化成了虚拟的有限平行宇宙，其中有一个宇宙产生了差异，那么这个宇宙下待检验的假设就可以被认为是证实的。&lt;/p&gt;
&lt;p&gt;换句话说，Fisher的零假设是包含了所有假设在内的假设宇宙，在某些宇宙里出现某些数据是正常且合理的，但这些宇宙相比所有假设宇宙的空间非常小，那么在这些宇宙里数据背后对应的规律应该就是真实的。如果假设宇宙本来就不多（当然这个只会在离散结果的条件下出现），那么事实上就形成了统计功效不足的问题。前面我意识到的不对劲其实是误会，因为我脑子里还放着与零假设对应存在的备择假设这个东西，所以我会纠结是不是检验错了。但事实上，备择假设本就是零假设的一部分，其独特性是通过在可能性空间的低概率来表征的。从这个逻辑上看，Fisher的精确检验并不存在现在普遍使用的零假设备择假设这套体系里的问题，而且只要转化一下，Fisher精确检验一样可以用在更广的领域。&lt;/p&gt;
&lt;p&gt;这里最大的问题在于可能性空间的低概率跟数据存在规律性需要是一个东西，这也是Fisher精确检验的核心。现在很多对p值的质疑可能来自于对可能性空间认识的偏误，对于很多人而言，可能性空间是数学意义上的无限空间，但对实验结果而言，在一定观测精度下可能性空间其实是有限的而观测的数据又是一定存在于这个空间之内的，这就导致概率低下进而我们会认为规律存在。举个例子，如果观察我开门这个动作100次，那么我每次都用右手这个事件对比&lt;code&gt;$2^{100}$&lt;/code&gt;这个可能性空间而言概率很低但存在，这件事可能让观察者得出我是右利手的规律性结论。这里统计推断只负责告诉你概率，怎么解释是观察者自己决定的事，p值0.05就是个方便决策的阈值但统计学更关心概率怎么计算。&lt;/p&gt;
&lt;p&gt;也就是说现在对p值的质疑是集中在后面决策步骤上的，但这个决策标准其实本来应该各个学科根据自己的学科规律可能性空间来制定，不能简单把锅甩给统计学家，毕竟他们对不同学科规律可能性空间其实并不了解。很多时候重复性不好的本质是所谓规律性在可能性空间里并不稀有，随机过程就会发生，这个时候应该做的是对规律性给出更严格的定性定量要求与描述，还有种可能就是本来就是伪规律，是噪音被当成了规律，天知道科研人员为了混饭吃会不会把其实不稀有的偶发事件当成规律来报道，这时候应该被质疑的其实应该是实验者而不是统计学决策工具。&lt;/p&gt;
&lt;p&gt;我不太清楚后面是怎么把p值从离散分布推广到0到1之间的连续均匀分布的，但现在我倒是有兴趣看下p值本身在平行宇宙里的分布了。如果有规律的事实在实验限定的空间里发生，其p值的分布应该会与随机过程产生的p值不一样。这里我不打算采用多次随机抽样，因为此时分布事实上是已知的，此时进行随机实验其实是在假设分布存在且成立的条件下判断事实。相反，我会随机生成一组数据但保留这一组数据当成既成事实，但随机化分组过程来检验p值的分布，此时应该更符合事实存在后对假设的判断这个思路，这个应该更贴近Fisher精确检验的思想。这里我们考虑三种情况：&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;第一种情况是规律完全成立；第二种是完全无规律；第三种是可观察或可测量的数据。生成三组数据后我们对其分组（简单二分）进行10000次随机化操作，然后进行t检验，记录并观察p值。&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(1)
# 真实差异
x &amp;lt;- c(rep(100,260),rep(200,260))
# 随机差异
xr &amp;lt;- rnorm(520)
# 考虑误差的真实差异
xm &amp;lt;- c(rep(100,260),rep(200,260))+rnorm(520)
p &amp;lt;- pr &amp;lt;- pm &amp;lt;- c()
for(i in 1:10000){
        # 随机化分组
        g &amp;lt;- factor(sample(c(1,2),520,replace = T))
        p[i] &amp;lt;- t.test(x~g)$p.value
        pr[i] &amp;lt;- t.test(xr~g)$p.value
        pm[i] &amp;lt;- t.test(xm~g)$p.value
}
# 探索p值分布
sum(p&amp;lt;0.05)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.0481&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(p&amp;lt;0.5)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.5084&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(p&amp;lt;0.9)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.8978&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pr&amp;lt;0.05)/length(pr)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.0514&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pr&amp;lt;0.5)/length(pr)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.4994&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pr&amp;lt;0.9)/length(pr)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.9014&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pm&amp;lt;0.05)/length(pm)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.0493&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pm&amp;lt;0.5)/length(pm)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.5023&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(pm&amp;lt;0.9)/length(pm)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.8991&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;par(mfrow=c(3,2))
hist(p,breaks = 20)
hist(p,breaks = 100)
hist(pr,breaks = 20)
hist(pr,breaks = 100)
hist(pm,breaks = 20)
hist(pm,breaks = 100)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-1-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这个结果非常有意思，第一个能看到的现象是如果数据本身存在规律性，那么p值的分布是一个离散分布。这个分布介于0到1之间，越接近0的部分越密集，越接近1的的部分越稀疏，但是如果计算小于0.05，0.5，0.9的比例情况，会发现这种稀疏分布依旧符合均匀分布的概率分布特征。如果数据不存在规律性，那么p值的分布就是很均匀的。如果数据混合了规律性与噪音，依然会显示出这种离散分布特征。下面我用qq图来观察下这个分布跟均匀分布的区别：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(42)
ref &amp;lt;- runif(10000)
par(mfrow=c(1,1))
qqplot(ref,p)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-2-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qqplot(ref,pr)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-2-2.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qqplot(ref,pm)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-2-3.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到，如果数据本身存在规律性，其随机化分组后的p值虽然跟均匀分布很接近，但qq图上确实会表现出前密后舒的螺旋延伸状态。&lt;/p&gt;
&lt;p&gt;我虽然不清楚统计学上有没有对这个p值分布的研究，如果没有我先管它叫 MY Distribution ，谁让我名字缩写就是MY，这个“我的分布”可能对实验学科非常有意义。&lt;/p&gt;
&lt;p&gt;这里为了区别我再做一个仿真，这次我不是对分组随机而是对采样随机：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(1)
# 固定分组
g &amp;lt;- factor(c(rep(1,260),rep(2,260)))
p &amp;lt;- c()
for(i in 1:10000){
        # 随机化采样
        x &amp;lt;-  sample(c(rep(100,260),rep(200,260))+rnorm(520),520)
        p[i] &amp;lt;- t.test(x~g)$p.value
}
# 探索p值分布
sum(p&amp;lt;0.05)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.0406&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(p&amp;lt;0.5)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.5344&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;sum(p&amp;lt;0.9)/length(p)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 0.9356&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;hist(p,breaks = 20)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-3-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;hist(p,breaks = 100)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-3-2.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qqplot(ref,p)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-3-3.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这里我们同样能看到这种蛇形走位，而且似乎随机化样品看到的趋势更明显。但同样的，这里我的模拟逻辑还是保持数据不变，只是随机化过程。&lt;/p&gt;
&lt;p&gt;实验学科已经被多重检验问题困扰了很久了，通常演示p值分布很多人是喜欢从一个已知分布里反复抽样形成差异，此时的p值分布是有偏的：&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(1)
pvalue &amp;lt;- NULL
for (i in 1:10000){
  a &amp;lt;- rnorm(10,1)
  b &amp;lt;- a+1
  c &amp;lt;- t.test(a,b)
  pvalue[i] &amp;lt;- c$p.value
}
# 探索p值分布
hist(pvalue,breaks = 20)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-4-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;hist(pvalue,breaks = 100)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://yufree.cn/cn/2021/05/21/statistical-inference-in-parallel-world/index_files/figure-html/unnamed-chunk-4-2.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后因为随机抽样得到的是p值均匀分布，所以很多错误发现率的控制算法都是在想办法区分这两种分布。现在常用的BH矫正、Q值法或者Bonferroni法都依赖检验数量与前面说的分布差异来决定判断标准或者控制整体错误率。这个看上去很合理，因为你检验多了出现随机相关的可能性就是高了。然而这个过程又很不合理，因为我们测量时有时候并不知道测量的维度是不是跟分组有关系，只是顺手测了，这类测量浪费了大量的统计功效。这也是传统实验学科跟组学实验学科经常扯皮的地方，传统做一对一的控制实验，如果测到了一个有意义的信号就可以发表，但技术进步后，因为我同时测了其他其实无意义的信号，那些有意义的信号被掩盖在随机相关里了。前面所说的多重检验问题的处理思想通常是保留强信号，这样本身有规律的弱信号就被自动忽略了。也许我们可以认为效应比较弱的信号不如效应比较强的信号，但只要存在规律性，作为研究人员就一定要去搞清楚是咋回事而不是用统计学工具给自己做挡箭牌。&lt;/p&gt;
&lt;p&gt;这样，前面那个p值分布的意义就很明确了：如果规律会造成数据异质性而我们的分组过程就是试图发现这种规律性，那么不可避免的会在p值分布上造成离散分布的状态。相反，随机相关则不会呈现出这种p值的离散分布而是均匀分布。这个均匀与离散分布的差异如果能用一个统计量来描述，那么我们事实上就能根据这个统计量（暂且命名为统计量MY）区别出真实规律与随机相关。我现在能想到的构建方法非常原始，就是对直方图概率密度曲线的0.9到1这一段找最大值与最小值，如果比值超过一个阈值就认为有规律性，否则就认为是随机数据。但应该有更数学化的构建方法。&lt;/p&gt;
&lt;p&gt;在这个语境下，我们就不用搞这些p值的阈值矫正了，直接对每一次假设检验进行分组随机化模拟过程，然后生成p值分布。如果其MY值表示为离散均匀分布，那么这一组假设检验的规律性就是有保证的，如果指示为均匀分布，那么这组数据本身就可以判定为无法检测规律而排除。这样我们可以对数据在进行统计推断前做一个规律性测试，只有通过了规律性测试的数据才值得进行统计推断。而且，只要单次统计推断给出小于0.05的p值，我们就可以直接相信，因为那些可能出现随机相关的数据已经被我们排除掉了。&lt;/p&gt;
&lt;p&gt;不过，到这里我的知识水平已经到头了，因为这个MY值如何构建我是不知道的，现阶段我能想到的解决方案一个是直接用眼看，一个是动用图像识别的机器学习算法识别这类图像，也就是让机器看。不过这个思路应该问题不大，说白了就是利用模拟探索产生真实数据的可能性空间或平行宇宙而不是利用分布产生仿真数据，后者其实是先定在了某一种宇宙之中，这里基本延续了Fisher精确检验的思路，计算上也是可行的。&lt;/p&gt;
&lt;p&gt;其实我也不是凭空想思考这个问题，前两天中午有个报告里演讲者提到了Fisher精确检验跟因果分析的关心，我当时忙活着做午饭没听明白她到底讲了啥，但Fisher精确检验的思想确实听明白了。然后吃着午饭就想到了这个随机化分组是不是影响p值的问题，一开始我用的是直方图的默认输出，结果发现p值总是均匀分布感到很丧气，但因为在模拟中本来是1000次多输了一个0就打算看看更精细的直方图，这才看到了这个被掩盖的p值离散分布。我应该不是第一个看到这个分布的，但将其用到替换多重检验的错误率控制上应该是个比较有前景的应用，欢迎读者来给我拍砖，要是没人写过论文（不大可能）也可以拿去写论文，我知道的已经都写出来了，欢迎引用或合作。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
