我正在心理测量学课程中通过 Multitrait-Multimethod Matrix 工作。我们只需要能够分析它们,但我真的很想能够构建它们。我想我能够做到这一点(基本上它是相关矩阵与对角线系数 alpha 的重新排列)。我很确定我明白了,但想要一个数据集和一个完成的 MTMM 示例(类似于下面的格式):
这样我就可以完成并确保我的最终产品看起来像它应该的那样。我已经尝试了几个小时来寻找一些东西,但我很沮丧,并希望有人拥有这样的资源。我使用 R,所以我不在乎数据集的格式。
预先感谢您的帮助。
我正在心理测量学课程中通过 Multitrait-Multimethod Matrix 工作。我们只需要能够分析它们,但我真的很想能够构建它们。我想我能够做到这一点(基本上它是相关矩阵与对角线系数 alpha 的重新排列)。我很确定我明白了,但想要一个数据集和一个完成的 MTMM 示例(类似于下面的格式):
这样我就可以完成并确保我的最终产品看起来像它应该的那样。我已经尝试了几个小时来寻找一些东西,但我很沮丧,并希望有人拥有这样的资源。我使用 R,所以我不在乎数据集的格式。
预先感谢您的帮助。
我以@Andy W 的 R 代码为基础,希望我的更改对其他人有用。
我主要是改了,所以
该函数还包含我从数据框或相关表中以正确格式创建数据的方法。这取决于将您的特征和方法编码在变量名称中,并且您可能希望提取 CFA 加载以更可靠地看待此事。就我而言,我首先想用更多的视觉结构来观察相关性。如果您已经有长格式的相关性/加载,则应该很容易调整函数或将长转换为宽。
我把它放在 Github 上的一个包中。你可以用 得到它devtools::install_github("rubenarslan/formr"),函数就是 then formr:mtmm。

## function for rendering a multi trait multi method matrix
mtmm = function (
variables, # data frame of variables that are supposed to be correlated
reliabilities = NULL, # reliabilties: column 1: scale, column 2: rel. coefficient
split_regex = "\\.", # regular expression to separate construct and method from the variable name. the first two matched groups are chosen
cors = NULL
) {
library(stringr); library(Hmisc); library(reshape2); library(ggplot2)
if(is.null(cors))
cors = cor(variables, use="pairwise.complete.obs") # select variables
var.names = colnames(cors)
corm = melt(cors)
corm = corm[ corm[,'Var1']!=corm[,'Var2'] , ] # substitute the 1s with the scale reliabilities here
if(!is.null(reliabilities)) {
rel = reliabilities
names(rel) = c('Var1','value')
rel$Var2 = rel$Var1
rel = rel[which(rel$Var1 %in% var.names), c('Var1','Var2','value')]
corm = rbind(corm,rel)
}
if(any(is.na(str_split_fixed(corm$Var1,split_regex,n = 2))))
{
print(unique(str_split_fixed(corm$Var1,split_regex,n = 2)))
stop ("regex broken")
}
corm[, c('trait_X','method_X')] = str_split_fixed(corm$Var1,split_regex,n = 2) # regex matching our column naming schema to extract trait and method
corm[, c('trait_Y','method_Y')] = str_split_fixed(corm$Var2,split_regex,n = 2)
corm[,c('var1.s','var2.s')] <- t(apply(corm[,c('Var1','Var2')], 1, sort)) # sort pairs to find dupes
corm[which(
corm[ ,'trait_X']==corm[,'trait_Y']
& corm[,'method_X']!=corm[,'method_Y']),'type'] = 'monotrait-heteromethod (validity)'
corm[which(
corm[ ,'trait_X']!=corm[,'trait_Y']
& corm[,'method_X']==corm[,'method_Y']), 'type'] = 'heterotrait-monomethod'
corm[which(
corm[ ,'trait_X']!=corm[,'trait_Y']
& corm[,'method_X']!=corm[,'method_Y']), 'type'] = 'heterotrait-heteromethod'
corm[which(
corm[, 'trait_X']==corm[,'trait_Y']
& corm[,'method_X']==corm[,'method_Y']), 'type'] = 'monotrait-monomethod (reliability)'
corm$trait_X = factor(corm$trait_X)
corm$trait_Y = factor(corm$trait_Y,levels=rev(levels(corm$trait_X)))
corm$method_X = factor(corm$method_X)
corm$method_Y = factor(corm$method_Y,levels=levels(corm$method_X))
corm = corm[order(corm$method_X,corm$trait_X),]
corm = corm[!duplicated(corm[,c('var1.s','var2.s')]), ] # remove dupe pairs
#building ggplot
mtmm_plot <- ggplot(data= corm) + # the melted correlation matrix
geom_tile(aes(x = trait_X, y = trait_Y, fill = type)) +
geom_text(aes(x = trait_X, y = trait_Y, label = str_replace(round(value,2),"0\\.", ".") ,size=log(value^2))) + # the correlation text
facet_grid(method_Y ~ method_X) +
ylab("")+ xlab("")+
theme_bw(base_size = 18) +
theme(panel.background = element_rect(colour = NA),
panel.grid.minor = element_blank(),
axis.line = element_line(),
strip.background = element_blank(),
panel.grid = element_blank(),
legend.position = c(1,1),
legend.justification = c(1, 1)
) +
scale_fill_brewer('Type') +
scale_size("Absolute size",guide=F) +
scale_colour_gradient(guide=F)
mtmm_plot
}
data.mtmm = data.frame(
'Ach.self report' = rnorm(200),'Pow.self report'= rnorm(200),'Aff.self report'= rnorm(200),
'Ach.peer report' = rnorm(200),'Pow.peer report'= rnorm(200),'Aff.peer report'= rnorm(200),
'Ach.diary' = rnorm(200),'Pow.diary'= rnorm(200),'Aff.diary'= rnorm(200))
reliabilities = data.frame(scale = names(data.mtmm), rel = runif(length(names(data.mtmm))))
mtmm(data.mtmm, reliabilities = reliabilities)
前几天,当您将相同的问题发布到堆栈溢出时,我正在处理此问题。我将提供的不会是一个完整的解决方案,但希望它会给你足够的想法来完成你自己的演示。

这就是我可以在 SPSS 中生成的内容,我在 R 中使用与 ggplot2 相同的逻辑在此处发布了一些代码,但我对 ggplot2 不像对 SPSS 那样熟悉,因此它与生成的东西接近我可以用 SPSS 准备好地板。
正如我在对您的 SO 帖子的评论中所说,在图形样式的语法中,您可以将方法称为面板(小平面或小倍数是其他同义词),并将特征称为沿 X 和 Y 轴的定义位置。即使它们是名义类别(因此顺序是任意的),我们仍然可以按照我们在散点图中处理连续变量的方式来对待它们。也就是说,我们可以在由类别定义的笛卡尔坐标系中分配观测 X 和 Y 位置。
因此,生成此图形所需的数据形状(在 SPSS 或 R 中)如下(这是 SPSS 的读取数据语句,但这应该可以轻松转换为多种语言)。
data list free / Method_X Method_Y Traits_X Traits_Y (4A1) Corr (F3.2).
begin data
1 1 a a .89
1 1 a b .51
1 1 b b .89
1 1 a c .38
1 1 b c .37
1 1 c c .76
1 2 a a .57
1 2 b a .22
1 2 c a .09
1 2 a b .22
1 2 b b .57
1 2 c b .10
1 2 a c .11
1 2 b c .11
1 2 c c .46
2 2 a a .93
2 2 a b .68
2 2 b b .94
2 2 a c .59
2 2 b c .58
2 2 c c .84
1 3 a a .56
1 3 b a .22
1 3 c a .11
1 3 a b .23
1 3 b b .58
1 3 c b .12
1 3 a c .11
1 3 b c .11
1 3 c c .45
2 3 a a .67
2 3 b a .42
2 3 c a .33
2 3 a b .43
2 3 b b .66
2 3 c b .34
2 3 a c .34
2 3 b c .32
2 3 c c .58
3 3 a a .94
3 3 a b .67
3 3 b b .92
3 3 a c .58
3 3 b c .60
3 3 c c .85
end data.
现在,对于我的图表,我想再定义一个变量(用于为块着色的变量)并添加一些元数据,这些元数据会传播到 SPSS 中的图表。
value labels Method_X Method_Y
1 'Method 1'
2 'Method 2'
3 'Method 3'.
compute type = 0.
if method_x = method_y and traits_x = traits_y type = 1.
if method_x = method_y and traits_x <> traits_y type = 2.
if method_x <> method_y and traits_x = traits_y type = 3.
if method_x <> method_y and traits_x <> traits_y type = 4.
value labels type
1 'reliability'
2 'validity'
3 'heterotrait-monomethod'
4 'heterotrait-heteromethod'.
现在是有趣的部分,生成图表。SPSS 的图形语言 GPL 不像 Hadley 为 ggplot2 编写的那样直观,但我可以帮助对其进行分解。基本上,除了陈述和下面的陈述之外,我们在这里的讨论都是多余的GUIDE(所以现在只关注那些)。
GGRAPH
/GRAPHDATASET NAME="graphdataset" VARIABLES=Traits_Y Traits_X Method_Y Method_X corr type
MISSING=LISTWISE REPORTMISSING=NO
/GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
SOURCE: s=userSource(id("graphdataset"))
DATA: Traits_X=col(source(s), name("Traits_X"), unit.category())
DATA: Traits_Y=col(source(s), name("Traits_Y"), unit.category())
DATA: Method_Y=col(source(s), name("Method_Y"), unit.category())
DATA: Method_X=col(source(s), name("Method_X"), unit.category())
DATA: type=col(source(s), name("type"), unit.category())
DATA: corr=col(source(s), name("corr"))
GUIDE: axis(dim(1), null())
GUIDE: axis(dim(2))
GUIDE: axis(dim(3), opposite())
GUIDE: axis(dim(4))
SCALE: cat(dim(2), reverse())
SCALE: cat(aesthetic(aesthetic.color.interior), map(("1", color.black), ("2", color.darkgrey), ("3", color.lightgrey), ("4",color.white)))
ELEMENT: polygon(position(Traits_X*Traits_Y*Method_X*Method_Y), color.interior(type), label(corr))
END GPL.
element 语句本质上指定了绘图中的位置(以及分配了什么颜色和标签。在此示例中,变量Traits_X映射到 x 轴(),转到 y 轴,映射到水平方向的面板,并被映射到垂直运行的面板上。其他一切都与情节中的美学有关(什么得到什么颜色,什么标签去哪里)。dim(1)Traits_Ydim(2)Method_Xdim(3)Method_Ydim(4)
并非所有图表元素都直接在 SPSS 语法中公开(您通常必须修改图表模板才能以特定方式生成某些方面),但在这种情况下,事后编辑可以帮助您顺利进行。在问题的开头插入了我能够重现上述图表的程度(不走极端)。
我在 SPSS 中不能做的两件事(不用自己插入文本框做一些骇人听闻的事情)是上标/下标和不同颜色的标签文本(标签在那里,只是黑色)。这些是我只需将图形打印为 PDF 并在 Inkscape 或 Illustrator 中进行更多编辑的内容。我知道您可以在 R 标签中使用下标和上标,但需要注意的一点是,这会破坏我之前提供的语法,因为面板之间的分类 Y 轴会发生变化。
我可以在 SPSS 的编辑器(以及其他文本)中相当容易地完成虚线框,但箭头我做不到。我知道你想要一个 R 中的解决方案,而且我确信大部分逻辑都可以移植到 R 代码中(使用你想要的任何包)。
注意,在一些评论中,泰勒和我似乎对 MTMM 是什么感到困惑(至少我是)。David Kenny 的这一页更详细地介绍了该方法是什么以及如何估计此类模型。
看起来我忘了链接到我用来构建这张图片的原始资源,它被用作旧课程的插图(我更喜欢黑白图片:-)。我对这些数据一无所知,这在我使用它时并不是我最感兴趣的(它是用 Omnigraffle for Mac 完成的)。
如果问题是关于如何达到这些数字,您可以尝试使用出色的psych包自己生成相关矩阵。(请务必查看 William Revelle 的网站。)但是,对于完善的数据,您可能会参考
布朗,TA(2006 年)。应用研究的验证性因素分析。吉尔福德出版社。
见表 6.1的数据。一些背景(第 214-216 页):
在这幅插图中,研究人员希望检查 DSM-IV A 类人格障碍的结构效度,这是一种以古怪或古怪行为为特征的持久症状模式(美国精神病学协会,1994 年)。A组由三种人格障碍构成:(1)偏执(一种不信任和怀疑的持久模式,因此他人的动机被解释为恶意);(2) 精神分裂症(一种持久的脱离社会关系和情感表达范围受限的模式);(3) 精神分裂症(一种持久的社会关系急性不适模式、认知和知觉扭曲以及行为怪癖)。在 500 名患者的样本中,这三个特征中的每一个都通过三种评估方法来衡量:(1) 人格障碍的自我报告清单;(2) 人格障碍结构化临床访谈的维度评级;(3) 由辅助专业人员进行的观察评级。因此,表 6.1 是一个 3 (T) x 3 (M) 矩阵,其排列方式使得不同特征(人格障碍:偏执型、分裂型、分裂型)之间的相关性嵌套在每种方法中(评估类型:库存、临床访谈、观察员评级)。
结果应如下所示:

如果您使用的是 R,您可能有兴趣查看psymtmm()包中的函数(它也可用于评估单个测量仪器中的收敛和区分有效性),正如我之前的回复中已经提到的:如何计算变量组之间/内部的相关性?,哪个包用于 R 中的收敛和区分有效性?