NAを含む時のdist関数
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