knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
knitr::opts_chunk$set(echo = TRUE)
library(lavaan)
library(semPlot)

Multi-Trait Multi-Method SEM

When to Use

When to Use

Logic of MTMM

The Steps

The Steps

Model 1: Correlated Traits / Correlated Methods

Model 1: Correlated Traits / Correlated Methods

knitr::include_graphics("pictures/model1_mtmm.png")

Model 1: Correlated Traits / Correlated Methods

Model 1: Correlated Traits / Correlated Methods

Model 1: Correlated Traits / Correlated Methods

Example Data

library(lavaan)
library(semPlot)
library(rio)

meaning.data <- import("data/lecture_mtmm.csv")
str(meaning.data)

Build the Measurement Models

methods.model <- '
mlq =~ m1 + m2 + m3 + m4 + m5 + m6 + m8 + m9 + m10
pil =~ p3 + p4 + p8 + p12 + p17 + p20
'

traits.model <- '
meaning =~ m1 + m2 + m5 + m10 + p4 + p12 + p17
purpose =~ m3 + m4 + m6 + m8 + m9 + p3 + p8 + p20
'

Analyze the Measurement Models

methods.fit <- cfa(model = methods.model, 
                   data = meaning.data,
                   std.lv = TRUE)
traits.fit <- cfa(model = traits.model,
                  data = meaning.data,
                  std.lv = TRUE)

lavInspect(traits.fit, "cor.lv")

Summarize the Measurement Models

summary(methods.fit, 
        rsquare = TRUE, 
        standardized = TRUE,
        fit.measures = TRUE)

summary(traits.fit, 
        rsquare = TRUE, 
        standardized = TRUE,
        fit.measures = TRUE)

Diagram the Measurement Models

semPaths(methods.fit, 
         whatLabels = "std", 
         layout = "tree", 
         edge.label.cex = 1)

semPaths(traits.fit, 
         whatLabels = "std", 
         layout = "tree", 
         edge.label.cex = 1)

Model 1: Correlated Traits / Correlated Methods

step1.model <- '
mlq =~ m1 + m2 + m3 + m4 + m5 + m6 + m8 + m9 + m10
pil =~ p3 + p4 + p8 + p12 + p17 + p20
meaning =~ m1 + m2 + m5 + m10 + p4 + p12 + p17
purpose =~ m3 + m4 + m6 + m8 + m9 + p3 + p8 + p20

##fix the covariances
mlq ~~ 0*meaning
pil ~~ 0*meaning
mlq ~~ 0*purpose
pil ~~ 0*purpose
'

Model 1: Correlated Traits / Correlated Methods

step1.fit <- cfa(model = step1.model, 
                 data = meaning.data,
                 std.lv = TRUE)

summary(step1.fit, 
        rsquare = TRUE, 
        standardized = TRUE,
        fit.measures = TRUE)

Model 1: Correlated Traits / Correlated Methods

semPaths(step1.fit, 
         whatLabels = "std", 
         layout = "tree", 
         edge.label.cex = 1)

Model 2: No Traits / Correlated Methods

Model 2: No Traits / Correlated Methods

knitr::include_graphics("pictures/model2_mtmm.png")

Model 2: No Traits / Correlated Methods

##model 2 is the methods model 
##we've already checked it out
anova(step1.fit, methods.fit)

fitmeasures(step1.fit, "cfi") 
fitmeasures(methods.fit, "cfi")

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

knitr::include_graphics("pictures/model3_mtmm.png")

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

step3.model <- '
mlq =~ m1 + m2 + m3 + m4 + m5 + m6 + m8 + m9 + m10
pil =~ p3 + p4 + p8 + p12 + p17 + p20
meaning =~ m1 + m2 + m5 + m10 + p4 + p12 + p17
purpose =~ m3 + m4 + m6 + m8 + m9 + p3 + p8 + p20

##fix the covariances
mlq ~~ 0*meaning
pil ~~ 0*meaning
mlq ~~ 0*purpose
pil ~~ 0*purpose
meaning ~~ 1*purpose
'

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

step3.fit <- cfa(model = step3.model,
                 data = meaning.data,
                 std.lv = TRUE)

summary(step3.fit, 
        rsquare = TRUE, 
        standardized = TRUE, 
        fit.measure = TRUE)

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

semPaths(step3.fit, 
         whatLabels = "std", 
         layout = "tree", 
         edge.label.cex = 1)

Model 3: Perfectly Correlated Traits / Freely Correlated Methods

anova(step1.fit, step3.fit)

fitmeasures(step1.fit, "cfi")
fitmeasures(step3.fit, "cfi")

Model 4: Freely Correlated Traits / Uncorrelated Methods

Model 4: Freely Correlated Traits / Uncorrelated Methods

knitr::include_graphics("pictures/model4_mtmm.png")

Model 4: Freely Correlated Traits / Uncorrelated Methods

step4.model <- '
mlq =~ m1 + m2 + m3 + m4 + m5 + m6 + m8 + m9 + m10
pil =~ p3 + p4 + p8 + p12 + p17 + p20
meaning =~ m1 + m2 + m5 + m10 + p4 + p12 + p17
purpose =~ m3 + m4 + m6 + m8 + m9 + p3 + p8 + p20

##fix the covariances
mlq ~~ 0*meaning
pil ~~ 0*meaning
mlq ~~ 0*purpose
pil ~~ 0*purpose
pil ~~ 0*mlq
'

Model 4: Freely Correlated Traits / Uncorrelated Methods

step4.fit <- cfa(model = step4.model, 
                  data = meaning.data,
                  std.lv = TRUE)

summary(step4.fit, 
        rsquare = TRUE, 
        standardized = TRUE, 
        fit.measure = TRUE)

Model 4: Freely Correlated Traits / Uncorrelated Methods

semPaths(step4.fit, 
         whatLabels = "std", 
         layout = "tree", 
         edge.label.cex = 1)

Model 4: Freely Correlated Traits / Uncorrelated Methods

anova(step1.fit, step4.fit)

fitmeasures(step1.fit, "cfi")
fitmeasures(step4.fit, "cfi")

Correlated Uniqueness

Interpreting Parameters

parameterestimates(step1.fit, standardized = T)

Interpreting Parameters

parameterestimates(step1.fit, standardized = T)

Summary



doomlab/learnSEM documentation built on Jan. 25, 2024, 2 p.m.