"反正态分布算法"这个词在中文语境下通常指的是标准正态分布累积分布函数(CDF)的"反函数"算法。
在统计学和计算机科学中,它有一个更专业的名称:分位数函数 (Quantile Function) 或 Probit 函数。
简单来说,它的逻辑是反过来的:
-
正态分布 (Normal Distribution):给你一个数值(比如 Z分数),告诉你它落在某个范围的概率是多少。
-
反正态分布 (Inverse Normal):给你一个概率 (比如 95%),告诉你对应的数值(Z分数)是多少。
直观理解:从"排名"推"分数" 为了让你秒懂,我们拿考试打比方:
-
场景:全班考试成绩服从正态分布,平均分 60,标准差 10。
-
正态分布 (CDF):
-
问:"我考了 80 分,我打败了百分之多少的人?"
-
答:"算出 Z 分数是 2.0,查表得知你打败了 97.7% 的人。"
-
-
反正态分布 (Inverse CDF):
-
问:"我想排在前 5%(也就是打败 95% 的人),我至少要考多少分?"
-
答:"输入概率 0.95,通过算法算出 Z 分数是 1.645,换算回分数是 76.45 分。"
-
所以,"反正态分布算法"就是计算机用来回答第二个问题的数学工具。
反正态转换(Inverse Normal Transformation, INT)的过程示例
我们用一个简单的例子来说明反正态转换的过程。假设有 10 个样本的甲基化 β 值如下:
原始数据(甲基化 β 值):
0.1, 0.2, 0.4, 0.5, 0.3, 0.9, 0.7, 0.8, 0.6, 0.05
步骤 1:对 β 值进行排序
首先对这些 β 值进行升序排序,得到每个值的排序位置。
| 排序后的值 | 排序位置 |
|---|---|
| 0.05 | 1 |
| 0.1 | 2 |
| 0.2 | 3 |
| 0.3 | 4 |
| 0.4 | 5 |
| 0.5 | 6 |
| 0.6 | 7 |
| 0.7 | 8 |
| 0.8 | 9 |
| 0.9 | 10 |
步骤 2:计算分位数
接下来,计算每个排序位置的分位数。分位数可以通过以下公式计算:
分位数=排名总样本数+1 \text{分位数} = \frac{\text{排名}}{\text{总样本数} + 1} 分位数=总样本数+1排名
计算每个值的分位数:
| 排序位置 | 分位数 |
|---|---|
| 1 | 0.091 |
| 2 | 0.182 |
| 3 | 0.273 |
| 4 | 0.364 |
| 5 | 0.455 |
| 6 | 0.545 |
| 7 | 0.636 |
| 8 | 0.727 |
| 9 | 0.818 |
| 10 | 0.909 |
步骤 3:将分位数转换为标准正态分布下的 z 分数
使用正态分布的累积分布函数的反函数(qnorm),将分位数映射到标准正态分布下的 z 分数。标准正态分布的 z 分数表示每个分位数在标准正态分布中的位置。
通过 R 中的 qnorm() 函数,我们可以得到:
{r}
qnorm(c(0.091, 0.182, 0.273, 0.364, 0.455, 0.545, 0.636, 0.727, 0.818, 0.909))
步骤 4:映射到原始数据顺序
最后,将这些 z 分数映射回原始数据的顺序:
| 原始 β 值 | 排序位置 | 分位数 | 正态分布 z 分数 |
|---|---|---|---|
| 0.1 | 2 | 0.182 | -0.91 |
| 0.2 | 3 | 0.273 | -0.60 |
| 0.4 | 5 | 0.455 | -0.11 |
| 0.5 | 6 | 0.545 | 0.11 |
| 0.3 | 4 | 0.364 | -0.35 |
| 0.9 | 10 | 0.909 | 1.34 |
| 0.7 | 8 | 0.727 | 0.60 |
| 0.8 | 9 | 0.818 | 0.91 |
| 0.6 | 7 | 0.636 | 0.35 |
| 0.05 | 1 | 0.091 | -1.34 |