読者です 読者をやめる 読者になる 読者になる

J's blog

趣味で統計•データ解析をしています

NAを含む時のdist関数

R

Rのdist関数において、対象とするベクトル内にNAが含まれている場合を調べました。


初めはNAで返ってくるのか考えていましたが、どうやらNAがあっても数値として計算して返してくれるようです。
計算過程がわかりやすいようにmanhattan距離で計算してみました。

> (dist.na <- matrix(c(1,2,4,NA,7,5,4,1,8,NA,9,10),3,4))
     [,1] [,2] [,3] [,4]
[1,]    1   NA    4   NA
[2,]    2    7    1    9
[3,]    4    5    8   10
> dist(dist.na, method = "manhattan")
   1  2
2  8   
3 14 12

確かにNAが含まれている1行目との距離もしっかり数値で返ってきていますね。


helpマニュアルを参照すると、
「 If some columns are excluded in calculating a Euclidean, Manhattan, Canberra or Minkowski distance, the sum is scaled up proportionally to the number of columns used.」
とあります。列数に比例して和を取ってくれるとのこと。
これは、NAの含まれていない列の計算結果の平均を、NAの含まれている列の計算結果としているみたいです。言い換えると、平均値代入しているということです。

ここで先ほどのmanhattan距離の例を見てみますと、

# 1,2行間のmanhattan距離
> abs(1-2) + abs(4-1) + ((abs(1-2) + abs(4-1)) / 2) * 2
[1] 8
# 1,3行間のmanhattan距離
> abs(1-4) + abs(4-8) + ((abs(1-4) + abs(4-8)) / 2) * 2
[1] 14

と、一致しました。


ちなみに、euclidean距離もこのとおり正しい結果であることがわかります。

> dist(dist.na, method = "euclidean")
         1        2
2 4.472136         
3 7.071068 7.615773

# 1,2行間のeuclidean距離
> sqrt((1-2)^2 + (4-1)^2 + (((1-2)^2 + (4-1)^2) / 2) * 2)
[1] 4.472136
# 1,3行間のeuclidean距離
> sqrt((1-4)^2 + (4-8)^2 + (((1-4)^2 + (4-8)^2) / 2) * 2)
[1] 7.071068