2011-10-18 16 views
9

(Prefazione: non sono né uno statistico né un programmatore, lavoro nelle discipline umanistiche, abbi pietà della mia anima).I calcoli della distanza euclidea in R non hanno senso

Ho bisogno di calcolare la distanza euclidea tra una serie di punti a R. ho usato dist(), come segue:

> x <- c(0,0) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 10 

Fin qui, tutto bene. Ma quando guardavo i miei risultati (con numeri reali), erano orribilmente off. Tanto che ho capito che il mio script R stava acquisendo dati dalle colonne sbagliate. Ma ho controllato, e non lo è.

Così ho iniziato a giocare con numeri di giocattoli, e mi ha sorpreso. L'esempio precedente (una linea verticale) funziona correttamente, come fa la seguente (una linea orizzontale):

> x <- c(0,10) 
> y <- c(0,0) 
> dist(rbind(x,y)) 
    x 
y 10 

Ma quando la linea forma due punti è diagonale, singolarità ne consegue:

> x <- c(0,10) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 0 

A distanza di 0? Eh? Non può essere giusto.

E quando i punti sono identici (che è del tutto possibile nei miei dati), si va nella tana del coniglio:

> x <- c(0,0) 
> y <- c(10,10) 
> dist(rbind(x,y)) 
    x 
y 14.14214 

Se ciò non fosse 0? I punti sono identici, dopotutto, quindi non ci può essere distanza tra loro.

Nel caso ci fosse qualcosa di sbagliato in dist(), ho provato ad implementare la formula manualmente, passando da Wikipedia. Stessi risultati:

> sqrt(sum((x - y)^2)) 
[1] 14.14214 

come ho detto sopra, la mia matematica sfondo è minimo, quindi mi aspetto che l'errore qui è mio. Se è così, per favore spiega di cosa si tratta e come correggerlo. Ma da dove mi trovo in questo momento, sembra che qualcosa sia molto sbagliato.

E, peggio di tutto, non posso analizzare i miei dati.

+3

+1 per un primo post chiaro che ha seguito le linee guida della documentazione. –

risposta

14

Sembra che tu voglia dist(cbind(x, y)), non dist(rbind(x, y)).

+0

Questo sembra davvero fare il trucco - dal momento che il mio vettore x ha tutte le coordinate xe il mio vettore y ha tutte quelle y, ho bisogno di legare per colonna, non per riga. Grazie! –

9

dist calcola una distanza tra ogni coppia di righe dell'argomento. Se le tue file sono identiche, come nel tuo primo esempio 'strano', allora la distanza sarà effettivamente 0. Se le tue righe sono costanti 0 e costante 10, come nel tuo secondo esempio, allora la distanza sarà effettivamente sqrt ((10- 0)^2 + (10-0)^2) = 14.142 ...

+0

A-ha! Tutto chiaro. Apprezzo l'aiuto. –

7

Cosa ne pensi che stai facendo quando si esegue questo:

x <- c(0,10) 
y <- c(0,0) 
dist(rbind(x,y)) 

è che avete definito due punti, (0,0) e (10,0), e ha chiesto R per calcolare la distanza tra questi due punti.

Ma non hai, in effetti, chiesto a R di farlo affatto!

Quando rbind i vettori x e y insieme, si finisce con la matrice:

rbind(c(0,10),c(0,0)) 
    [,1] [,2] 
[1,] 0 10 
[2,] 0 0 

Quando si chiama dist, è calcolata la distanza tra le righe di questa matrice. Quindi, la distanza tra loro è 10.

Speriamo che abbia senso ora!

+0

Grazie mille! Ha davvero senso ora. –

Problemi correlati