In che modo i bambini riescono a riunire i genitori in una proiezione PCA di un set di dati GWAS?


9

Prendi 20 punti casuali in uno spazio di 10.000 dimensioni con ciascuna coordinata iid da . Dividili in 10 coppie ("coppie") e aggiungi la media di ciascuna coppia ("un figlio") al set di dati. Quindi esegui PCA sui 30 punti risultanti e traccia il PC1 contro il PC2.N(0,1)

Accade una cosa notevole: ogni "famiglia" forma una tripletta di punti che sono tutti vicini. Naturalmente ogni bambino è più vicino a ciascuno dei suoi genitori nello spazio originale di 10.000 dimensioni, quindi ci si potrebbe aspettare che sia vicino ai genitori anche nello spazio PCA. Tuttavia, nello spazio PCA ogni coppia di genitori è anche vicina, anche se nello spazio originale sono solo punti casuali!

In che modo i bambini riescono a riunire i genitori nella proiezione PCA?

inserisci qui la descrizione dell'immagine

Si potrebbe temere che ciò sia in qualche modo influenzato dal fatto che i bambini hanno una norma inferiore rispetto ai genitori. Questo non sembra avere importanza: se produco i bambini come dove ed sono i punti dei genitori, poi si avrà, in media, la stessa norma, come i genitori. Ma osservo ancora qualitativamente lo stesso fenomeno nello spazio PCA:(x+y)/2xy

inserisci qui la descrizione dell'immagine

Questa domanda utilizza un set di dati giocattolo, ma è motivata da ciò che ho osservato in un set di dati del mondo reale da uno studio di associazione sul genoma (GWAS) in cui le dimensioni sono polimorfismi a singolo nucleotide (SNP). Questo set di dati conteneva trii madre-padre-figlio.


Codice

%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
In una dimensione così elevata, tutti i punti di un dato casuale non correlato si trovano negli angoli dello spazio e le distanze tra i punti sono quasi le stesse. Se selezioni un punto e lo leghi a un altro punto creando un punto a metà (medio) tra loro, hai quindi creato un cluster: hai introdotto distanze nettamente inferiori alla distanza menzionata in precedenza.
ttnphns,

1
Sì, capisco che i 20 punti originali sono tutti più o meno equidistanti l'uno dall'altro. Ed è chiaro che i bambini sono più vicini ai genitori di quanto non lo siano due genitori. Quello che ancora non capisco, però, è il motivo per cui i genitori si avvicinano alla proiezione della PCA ...
Amoeba,

Hai provato a proiettare su due dimensioni casuali? Cosa hai preso?
ttnphns,

1
La mia intuizione sarebbe questa: le terzine dei punti sono proiettate come pile quasi perpendicolari al sottospazio PC1-2. Ecco come viene definita la posizione di questo piano per massimizzare la varianza . Vedi, hai dati multimodali con modalità per lo più lontane dal centro (perché i punti sono tutti periferici in 10K fiochi), tale nuvola, come un manubrio, tenderà a tirare i PC principali in modo che questi perforino le regioni pesanti e quindi perpendicolare alle terzine.
ttnphns,

1
La scoperta, tra l'altro, è istruttiva del problema che PCA (PCoA) non è molto buono come MDS perché proietta punti e non modella direttamente le distanze. Un MDS iterativo dovrebbe produrre tali "cluster" in misura molto minore.
ttnphns,

Risposte:


8

Durante la discussione con @ttnphns nei commenti sopra, mi sono reso conto che lo stesso fenomeno può essere osservato con molte meno di 10 famiglie. Tre famiglie ( n=3nel mio frammento di codice) appaiono approssimativamente agli angoli di un triangolo equilatero. In effetti, è sufficiente considerare solo due famiglie ( n=2): finiscono separate lungo PC1, con ogni famiglia proiettata approssimativamente su un punto.

Il caso di due famiglie può essere visualizzato direttamente. I quattro punti originali nello spazio di 10.000 dimensioni sono quasi ortogonali e risiedono in un sottospazio di 4 dimensioni. Quindi formano un 4-simplex. Dopo il centraggio, formeranno un tetraedro regolare che è una forma in 3D. Ecco come appare:

* inserisci qui la descrizione dell'immagine *

Prima di aggiungere i bambini, PC1 può puntare ovunque; non esiste una direzione preferita. Tuttavia, dopo che due bambini sono posizionati al centro di due bordi opposti, PC1 li attraverserà! Questa disposizione di sei punti è stata descritta da @ttnphns come un "manubrio":

tale nuvola, come un manubrio, tenderà a tirare i PC principali in modo che questi perforino le regioni pesanti

Si noti che i bordi opposti di un tetraedro regolare sono ortogonali tra loro e sono anche ortogonali alla linea che collega i loro centri. Ciò significa che ogni famiglia verrà proiettata su un unico punto su PC1.

Forse ancora meno intuitivamente, se i due bambini vengono ridimensionati in base al fattore per dare loro la stessa norma dei genitori, allora "sporgeranno" dal tetraedro, con conseguente proiezione PC1 con entrambi i genitori collassati insieme e il bambino si allontana ulteriormente. Questo può essere visto nella seconda figura della mia domanda: ogni famiglia ha i suoi genitori molto vicini sul piano PC1 / PC2 (anche se non sono relazionati!), E il loro bambino è un po 'più distante.2


3
Visualizzazione eccellente! Mom1-Child1-Dad1 è un disco o pancake e Mom2-Child2-Dad2 è l'altro, della nuvola bimodale. Attira il PC1, al fine di massimizzare la varianza della proiezione, per perforare entrambe le "famiglie" ortogonalmente alle loro linee mamma-bambino-papà. Di conseguenza, ogni famiglia proietta in un punto (un bambino, in questo caso) e abbiamo le due famiglie come due molto strette all'interno, distanti tra loro i cluster nella proiezione.
ttnphns,

1
Quale programma hai usato per disegnare l'immagine?
ttnphns,

4
Lavagna, pennarelli e una fotocamera per smartphone :-)
amoeba,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.