在 GWAS 数据集的 PCA 投影中,孩子们如何设法将他们的父母拉到一起?

机器算法验证 主成分分析 Python 高维 遗传学 瓜斯
2022-03-21 06:34:58

在 10,000 维空间中取 20 个随机点,每个坐标 iid 来自ñ(0,1). 将它们分成 10 对(“情侣”)并将每对(“孩子”)的平均值添加到数据集中。然后对得到的 30 个点进行 PCA 并绘制 PC1 与 PC2。

发生了一件了不起的事情:每个“家庭”都形成了一个三元组,这些点都靠得很近。当然,在最初的 10,000 维空间中,每个孩子都更接近其父母,因此人们可以期望它在 PCA 空间中也接近父母。然而,在 PCA 空间中,每对父母也很接近,尽管在原始空间中它们只是随机点!

在 PCA 投影中,孩子们如何设法将父母拉到一起?

在此处输入图像描述

人们可能会担心,这在某种程度上受到了孩子的标准低于父母这一事实的影响。这似乎无关紧要:如果我将孩子培养成(X+是的)/2在哪里X是的是父母点,那么他们的平均标准与父母相同。但我仍然在 PCA 领域观察到同样的定性现象:

在此处输入图像描述

这个问题使用的是一个玩具数据集,但它是由我在全基因组关联研究(GWAS) 的真实数据集中观察到的,其中维度是单核苷酸多态性(SNP)。该数据集包含母亲-父亲-孩子三人组。


代码

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)

def generate_families(n = 10, p = 10000, divide_by = 2):
    X1 = np.random.randn(n,p)    # mothers
    X2 = np.random.randn(n,p)    # fathers
    X3 = (X1+X2)/divide_by       # children
    X = []
    for i in range(X1.shape[0]):
        X.extend((X1[i], X2[i], X3[i]))
    X = np.array(X)

    X = X - np.mean(X, axis=0)
    U,s,V = np.linalg.svd(X, full_matrices=False)
    X = U @ np.diag(s)
    return X

n = 10
plt.figure(figsize=(4,4))
X = generate_families(n, divide_by = 2)
for i in range(n):
    plt.scatter(X[i*3:(i+1)*3,0], X[i*3:(i+1)*3,1])
plt.tight_layout()
plt.savefig('families1.png')

plt.figure(figsize=(4,4))
X = generate_families(n, divide_by = np.sqrt(2))
for i in range(n):
    plt.scatter(X[i*3:(i+1)*3,0], X[i*3:(i+1)*3,1])
plt.tight_layout()
plt.savefig('families2.png')
1个回答

在与上述评论中的@ttnphns 讨论期间,我意识到可以在不到 10 个家庭中观察到相同的现象。三个系列(n=3在我的代码片段中)大致出现在等边三角形的角上。事实上,只考虑两个族 ( n=2) 就足够了:它们最终沿着 PC1 分开,每个族大致投影到一个点上。

两个家庭的情况可以直接可视化。10,000 维空间中的原始四个点几乎是正交的,并且位于 4 维子空间中。所以它们形成了一个 4-单纯形。居中后,它们将形成一个正四面体,这是一个 3D 形状。这是它的样子:

*在此处输入图片描述*

在添加孩子之前,PC1 可以指向任意位置;没有首选方向。但是,当两个孩子位于两个相对边缘的中心后,PC1 将直接穿过它们!@ttnphns 将这种六点排列描述为“哑铃”:

这样的云,就像哑铃一样,会拉动主要的 PC,使它们穿透沉重的区域

请注意,正四面体的相对边缘彼此正交,并且也正交于连接它们中心的线。这意味着每个族都将投影到 PC1 上的一个点。

也许更不直观,如果这两个孩子按比例缩放2因素给他们与父母相同的规范,那么他们将“伸出”四面体,导致 PC1 投影,父母双方倒塌在一起,孩子离得更远。这可以从我的问题的第二个图中看出:每个家庭的父母在 PC1/PC2 平面上都非常接近(即使他们不相关!),而他们的孩子则相距更远。