2011-10-18 52 views
9

(前言:我既不是統計學家也不是程序員,我在人文科學工作,所以憐憫我的靈魂)。在歐幾里德距離計算R沒有意義

我需要計算一系列R.點我一直在使用DIST(之間的歐氏距離),具體如下:

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

到目前爲止,一切都很好。但是當我看着我的結果(用實際數字)時,他們很可怕。太多以至於我認爲我的R腳本從錯誤的列中獲取數據。但我檢查過,事實並非如此。

所以我開始玩弄玩具號碼,我很驚喜。上面的例子中(垂直線)正確工作,象以下(水平線):

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

但是,當線的兩個點的形式是對角的,奇異隨之而來:

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

甲距離0?咦?這是不對的。

而當點是相同的(在我的數據很有可能),我們往下走了兔子洞:

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

如果此事爲0?畢竟,這些觀點是相同的,所以它們之間沒有距離。

爲防萬一dist()有問題,我嘗試手動實現公式,由維基百科進行。同樣的結果:

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

正如我前面所說,我的數學背景是最小的,所以我完全相信,這裏的錯誤是我的。如果是這樣,請解釋它是什麼以及如何糾正它。但從我現在的立場來看,似乎有些錯誤。

而最糟糕的是,我無法分析我的數據。

+3

+1對於遵循文檔指南的明確的第一篇文章。 –

回答

14

它看起來像你想dist(cbind(x, y)),而不是dist(rbind(x, y))

+0

這確實看起來有訣竅 - 因爲我的x向量具有所有x座標,並且我的y向量具有所有y向量,所以我需要按列而不是行綁定。謝謝! –

9

dist計算之間的距離矩陣其各自的參數。如果你的行是相同的,就像你第一個'奇怪'的例子,那麼距離確實是0.如果你的行是常數0和常數10,如你的第二個例子,那麼距離確實是sqrt((10- 0)^ 2 +(10-0)^ 2)= 14.142 ...

+0

阿!全清。感謝幫助。 –

7

你覺得什麼,當你運行這個你正在做的:

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

是您定義了兩個點,(0,0)(10,0),問R鍵計算這兩個點之間的距離。

但事實上,你還沒有要求R這麼做!

rbind向量xy在一起,你結束與矩陣:

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

當調用dist,它計算出的行該矩陣的之間的距離。因此,他們之間的距離是10.

希望現在有道理!

+0

非常感謝!現在的確有意義。 –