作为我将如何在 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 FILE
andPROXIMITIES
来按组获取我们的距离矩阵。请注意,正如您在对弗洛德尔答案的评论中提到的那样,这会产生一个我们需要使用的单独数据集(还要注意大小写在 SPSS 语法中几乎不重要,例如split file
并且SPLIT 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 数据矩阵中的所有内容都类似于 R data.frame
,因此 SPLIT 文件几乎在功能上替换了 R 中的所有不同*ply
函数。非常方便,但总体上不太灵活。所以现在我们需要在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.
R 在对象之间来回切换的灵活性matrix
使得data.frame
SPSS 在这项工作中显得有些笨拙。我可以用 SPSS 的语言编写一个更简洁的程序来执行此MATRIX
操作,但是跨组执行此操作很麻烦MATRIX
(与 R 的*ply
语法相比)。