3

次のようなものを含むデータセットがあります。

case,group,val1,val2,val3,val4
1,1,3,5,6,8
2,1,2,7,5,4
3,2,1,3,6,8
4,2,5,4,3,7
5,1,8,6,5,3

グループ内の値のベクトル間のユークリッド距離をプログラムで計算しようとしています。

これは、n 個のグループに x 個のケースがあることを意味します。行のペア間でユークリッド距離が計算され、グループの平均が計算されます。したがって、上記の例では、最初にグループ 1 (ケース 1、2、および 5) の平均値と標準偏差を計算し、次に値を標準化し (つまり [(元の値 - 平均値)/標準偏差])、ケース間の ED を計算します。 1 とケース 2、ケース 2 と 5、ケース 1 と 5、そして最後にグループの ED を平均します。

合理的に効率的な方法でこれを達成するためのきちんとした方法を誰かが提案できますか?

4

3 に答える 3

5

はい、おそらくRの方が簡単です...

あなたのデータ:

dat <- data.frame(case  = 1:5, 
                  group = c(1, 1, 2, 2, 1),
                  val1  = c(3, 2, 1, 5, 8),
                  val2  = c(5, 7, 3, 4, 6),
                  val3  = c(6, 5, 6, 3, 5),
                  val4  = c(8, 4, 8, 7, 3))

短い解決策:

library(plyr)
ddply(dat[c("group", "val1", "val2", "val3", "val4")],
      "group", function(x)c(mean.ED = mean(dist(scale(as.matrix(x))))))
#   group  mean.ED
# 1     1 3.121136
# 2     2 3.162278
于 2013-05-05T01:10:35.443 に答える
1

SPSS でこれにアプローチする方法の例として、まずサンプル データを SPSS に読み込みます。

data list list (",") / case group val1 val2 val3 val4 (6F1.0).
begin data
1,1,3,5,6,8
2,1,2,7,5,4
3,2,1,3,6,8
4,2,5,4,3,7
5,1,8,6,5,3
end data.
dataset name orig.

次に、 と を使用SPLIT FILEPROXIMITIESて、グループごとに距離行列を取得できます。flodelの回答へのコメントで述べたように、これにより、作業する必要がある別のデータセットが生成されることに注意してください(SPSS構文では大文字と小文字が実際には関係ないことにも注意してください。たとえばsplit fileSPLIT FILE同等です)。

sort cases by group.
split file by group.
dataset declare dist.
PROXIMITIES val1, val2, val3, val4
/STANDARDIZE = Z
/MEASURE = EUCLID
/PRINT = NONE
/MATRIX = OUT('dist').

R とは異なり、基本的に SPSS データ マトリックス内のすべてが Rdata.frameに似ているため、SPLIT ファイルはほぼ機能*ply的に R のさまざまな機能をすべて置き換えます。非常に便利ですが、一般的に柔軟性が低くなります。distそのため、結果を保存したファイルに距離を集約する必要があります。最初に行全体を合計し、次にAGGREGATEコマンドを使用してグループごとに合計します。

dataset activate dist.
compute dist_sum = SUM(VAR1 to VAR3).
*it appears SPSS keeps empty cases - we dont want them in the aggregation.
select if MISSING(dist_sum) = 0.
dataset activate dist.
DATASET DECLARE dist_agg.
AGGREGATE
  /OUTFILE='dist_agg'
  /BREAK=group
  /dist_sum = SUM(dist_sum)
  /N_Cases=N.
dataset activate dist_agg.
compute mean_dist = dist_sum /(N_Cases*(N_Cases - 1)).

ここで、集計結果を という名前の別のデータセットに保存しますdist_agg。SPSS は (厄介なことに) 全距離行列を保存するため、平均はn*(n-1)/2(同等の R 構文のように) ではなくn*(n-1)、対角要素を平均にカウントしたくないと仮定します。orig次に、match files コマンドを使用してこれらをデータ ファイルにマージします。

*merge back into the original dataset.
dataset activate orig.
match files file = *
/table = 'dist_agg'
/by group.
exe.

*clean out old datasets if you like.
dataset close dist.
dataset close dist_agg.

matrixオブジェクト間を行ったり来たりする R の柔軟性によりdata.frame、SPSS はこの仕事には少し扱いに​​くくなっています。MATRIXSPSS の言語でこれを行うためのはるかに簡潔なプログラムを作成することもできますがMATRIX、(R の*ply構文と比較して) 複数のグループにわたってこれを行うのは面倒です。

于 2013-05-06T16:52:07.677 に答える