多特征多方法矩阵和数据集

机器算法验证 心理测量学 结构方程建模
2022-04-16 18:56:11

我正在心理测量学课程中通过 Multitrait-Multimethod Matrix 工作。我们只需要能够分析它们,但我真的很想能够构建它们。我想我能够做到这一点(基本上它是相关矩阵与对角线系数 alpha 的重新排列)。我很确定我明白了,但想要一个数据集和一个完成的 MTMM 示例(类似于下面的格式):在此处输入图像描述

这样我就可以完成并确保我的最终产品看起来像它应该的那样。我已经尝试了几个小时来寻找一些东西,但我很沮丧,并希望有人拥有这样的资源。我使用 R,所以我不在乎数据集的格式。

预先感谢您的帮助。

3个回答

我以@Andy W 的 R 代码为基础,希望我的更改对其他人有用。

我主要是改了,所以

  • 遵守 ggplot2 中的新语法(不再有选择),因此不再有警告
  • 将相关性添加为文本
  • 现在相关文本大小反映了它的效果大小
  • 配色方案显示相关类型(异质/单性状/方法)。
  • 将图例放在空的右上角三角形中

该函数还包含我从数据框或相关表中以正确格式创建数据的方法。这取决于将您的特征和方法编码在变量名称中,并且您可能希望提取 CFA 加载以更可靠地看待此事。就我而言,我首先想用更多的视觉结构来观察相关性。如果您已经有长格式的相关性/加载,则应该很容易调整函数或将长转换为宽。

编辑:

我把它放在 Github 上的一个包中。你可以用 得到它devtools::install_github("rubenarslan/formr"),函数就是 then formr:mtmm

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 中的收敛和区分有效性?