Comment les enfants parviennent-ils à rassembler leurs parents dans une projection PCA d'un ensemble de données GWAS?

9

Prenez 20 points aléatoires dans un espace de 10 000 dimensions avec chaque coordonnée iid de . Répartissez-les en 10 paires («couples») et ajoutez la moyenne de chaque paire («un enfant») à l'ensemble de données. Ensuite, faites PCA sur les 30 points résultants et tracez PC1 vs PC2.N(0,1)

Une chose remarquable se produit: chaque "famille" forme un triplet de points qui sont tous proches les uns des autres. Bien sûr, chaque enfant est plus proche de chacun de ses parents dans l'espace d'origine de 10 000 dimensions, on peut donc s'attendre à ce qu'il soit proche des parents également dans l'espace PCA. Cependant, dans l'espace PCA, chaque paire de parents est également proche, même si dans l'espace d'origine ce ne sont que des points aléatoires!

Comment les enfants parviennent-ils à rassembler les parents dans la projection PCA?

entrez la description de l'image ici

On peut craindre que cela soit en quelque sorte influencé par le fait que les enfants ont une norme inférieure à celle des parents. Cela ne semble pas avoir d'importance: si je produis les enfants comme où et sont des points parentaux, alors ils auront en moyenne la même norme que les parents. Mais j'observe toujours qualitativement le même phénomène dans l'espace PCA:(x+y)/2xy

entrez la description de l'image ici

Cette question utilise un ensemble de données sur les jouets, mais elle est motivée par ce que j'ai observé dans un ensemble de données réelles issues d'une étude d'association à l'échelle du génome (GWAS) où les dimensions sont des polymorphismes mononucléotidiques (SNP). Cet ensemble de données contenait des trios mère-père-enfant.


Code

%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')
amibe
la source
1
Dans une dimension si élevée, tous les points de données d'une donnée aléatoire non corrélée sont situés dans les coins de l'espace et les distances entre les points sont presque les mêmes. Si vous sélectionnez un point et le liez à un autre des points en créant un point à mi-chemin (moyenne) entre eux, vous avez donc créé un cluster: vous avez introduit des distances nettement plus petites que la distance mentionnée précédemment.
ttnphns
1
Oui, je comprends que les 20 points originaux sont tous plus ou moins équidistants les uns des autres. Et il est clair que les enfants sont plus proches de leurs parents que deux parents l'un de l'autre. Ce que je ne comprends toujours pas, c'est pourquoi les parents deviennent proches dans la projection PCA ...
amoeba
Avez-vous essayé de projeter sur deux dimensions aléatoires? Qu'est-ce que vous obtenez?
ttnphns
1
Mon intuition serait la suivante: les triplets des points sont projetés sous forme de piles presque perpendiculaires au sous-espace PC1-2. C'est ainsi que la position de ce plan est définie pour maximiser la variance . Vous voyez, vous avez des données multimodales avec des modes principalement éloignés du centre (parce que les points sont tous périféraux en 10K dim), un tel nuage, comme un haltère, aura tendance à tirer les PC principaux pour que ceux-ci percent les régions lourdes , et donc perpendiculaire aux triplets.
ttnphns
1
Le constat, btw est instructif au problème que PCA (PCoA) n'est pas très bon en tant que MDS car il projette des points et ne modélise pas directement les distances. Un MDS itératif devrait produire ces «grappes» dans une bien moindre mesure.
ttnphns

Réponses:

8

Au cours de la discussion avec @ttnphns dans les commentaires ci-dessus, j'ai réalisé que le même phénomène peut être observé avec beaucoup moins de 10 familles. Trois familles ( n=3dans mon extrait de code) apparaissent à peu près dans les coins d'un triangle équilatéral. En fait, il suffit de ne considérer que deux familles ( n=2): elles se retrouvent séparées le long de PC1, chaque famille étant projetée grossièrement sur un point.

Le cas de deux familles peut être visualisé directement. Les quatre points d'origine dans l'espace à 10 000 dimensions sont presque orthogonaux et résident dans un sous-espace à 4 dimensions. Ils forment donc un 4-simplex. Après centrage, ils formeront un tétraèdre régulier qui est une forme en 3D. Voici à quoi ça ressemble:

* entrez la description de l'image ici *

Avant d'ajouter les enfants, PC1 peut pointer n'importe où; il n'y a pas de direction préférée. Cependant, après que deux enfants soient positionnés au centre de deux bords opposés, PC1 les traversera! Cet arrangement de six points a été décrit par @ttnphns comme un "haltère":

un tel nuage, comme un haltère, aura tendance à tirer les principaux PC pour que ceux-ci percent les régions lourdes

Notez que les bords opposés d'un tétraèdre régulier sont orthogonaux entre eux et sont également orthogonaux à la ligne reliant leurs centres. Cela signifie que chaque famille sera projetée sur un seul point sur PC1.

Peut-être encore moins intuitivement, si les deux enfants sont mis à l'échelle par le facteur pour leur donner la même norme que les parents, alors ils "ressortiront" du tétraèdre, résultant en une projection PC1 avec les deux parents effondrés ensemble et l'enfant étant plus éloigné. Cela peut être vu dans la deuxième figure de ma question: chaque famille a ses parents très proches sur le plan PC1 / PC2 (MÊME SI ILS NE SONT PAS RELIÉS!), Et leur enfant est un peu plus éloigné.2

amibe
la source
3
Excellente visualisation! Mom1-Child1-Dad1 est un disque ou une crêpe, et Mom2-Child2-Dad2 est l'autre, du nuage bimodal. Il attire le PC1, afin de maximiser la variance de la projection, pour percer les deux "familles" orthogonalement à leurs lignes maman-enfant-papa. Par conséquent, chaque famille se projette en un point (un enfant, dans ce cas) et nous avons les deux familles comme deux très serrées à l'intérieur, éloignées l'une de l'autre des grappes dans la projection.
ttnphns
1
Quel programme avez-vous utilisé pour dessiner la photo?
ttnphns
4
Tableau blanc, marqueurs de tableau blanc et appareil photo pour smartphone :-)
amoeba