# ------------------------------------------------------------------------------ # Structural Equation Models: EM - ERP Data # ------------------------------------------------------------------------------ # Dambacher, M. & Kliegl, R. (2007). Synchronizing timelines: # Relations between fixation durations and N400 amplitudes # during sentence reading. Brain Research, 1155, 147-162. # ------------------------------------------------------------------------------ # michael.dambacher@uni-potsdam.de # ------------------------------------------------------------------------------ rm(list=ls()) library(gtools) library(sem) # ------------------------------------------------------------------------------ # Data # ------------------------------------------------------------------------------ load("Dambacher.Kliegl.BrainRes.1155.2007.rda") # --- Quadratic frequency terms --- a$f1q <- a$f1^2 a$fq <- a$f^2 a$f2q <- a$f2^2 # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 1. Baseline Model # ------------------------------------------------------------------------------ b <- a[,c("dur1", "dur", "dur2", "n4amp1", "n4amp")] obs.var <- c("dur1", "dur", "dur2", "n4amp1", "n4amp") R.base <- cov(b) R.base[upper.tri(R.base)] <- 0 ram.base <- matrix(c( # Baseline effects 'dur1 <-> n4amp1', 'dur1.n4amp_1', NA, 'n4amp1 -> dur', 'n4amp_1.dur', NA, 'dur <-> n4amp', 'dur.n4amp', NA, 'n4amp -> dur2', 'n4amp.dur2', NA, 'dur1 -> dur', 'dur1.dur', NA, 'dur -> dur2', 'dur.dur2', NA, # Variances 'dur1 <-> dur1', 'dur1.var', NA, 'dur <-> dur', 'dur.var', NA, 'dur2 <-> dur2', 'dur2.var', NA, 'n4amp1 <-> n4amp1', 'n4amp_1.var', NA, 'n4amp <-> n4amp', 'n4amp.var', NA), ncol=3, byrow=TRUE) sem.base <- sem(ram.base, R.base, N=nrow(b), obs.variables=obs.var, maxiter=200) summary(sem.base, digits=2) chisq.base <- summary(sem.base)$chisq df.base <- summary(sem.base)$df # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 2. Immediacy Effect Model # ------------------------------------------------------------------------------ b <- a[,c("dur1", "dur", "dur2", "n4amp1", "n4amp", "f1", "f1q", "p1", "f", "fq", "p")] obs.var <- c("dur1", "dur", "dur2", "n4amp1", "n4amp") fix.var <- c("f1","f1q","p1","f","fq","p") R.immed <- cov(b) R.immed[upper.tri(R.immed)] <- 0 ram.immed <- matrix(c( # Baseline effects 'dur1 <-> n4amp1', 'dur1.n4amp_1', NA, 'n4amp1 -> dur', 'n4amp_1.dur', NA, 'dur <-> n4amp', 'dur.n4amp', NA, 'n4amp -> dur2', 'n4amp.dur2', NA, 'dur1 -> dur', 'dur1.dur', NA, 'dur -> dur2', 'dur.dur2', NA, # Immediacy effects 'f1 -> dur1', 'f1.dur1', NA, 'f1 -> n4amp1', 'f1.n4amp_1', NA, 'f1q -> dur1', 'f1q.dur1', NA, 'f1q -> n4amp1', 'f1q.n4amp_1', NA, 'p1 -> dur1', 'p1.dur1', NA, 'p1 -> n4amp1', 'p1.n4amp_1', NA, 'f -> dur', 'f.dur', NA, 'f -> n4amp', 'f.n4amp', NA, 'fq -> dur', 'fq.dur', NA, 'fq -> n4amp', 'fq.n4amp', NA, 'p -> dur', 'p.dur', NA, 'p -> n4amp', 'p.n4amp', NA, # Variances 'dur1 <-> dur1', 'dur1.var', NA, 'dur <-> dur', 'dur.var', NA, 'dur2 <-> dur2', 'dur2.var', NA, 'n4amp1 <-> n4amp1', 'n4_1.var', NA, 'n4amp <-> n4amp', 'n4.var', NA), ncol=3, byrow=TRUE) sem.immed <- sem(ram.immed, R.immed, N=nrow(b), obs.variables=obs.var, fixed.x=fix.var) summary(sem.immed, digits=2) chisq.immed <- summary(sem.immed)$chisq df.immed <- summary(sem.immed)$df # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 3. Lag Effect Model # ------------------------------------------------------------------------------ b <- a[,c("dur1", "dur", "dur2", "n4amp1", "n4amp", "f1", "f1q", "p1", "f", "fq", "p")] obs.var <- c("dur1", "dur", "dur2", "n4amp1", "n4amp") fix.var <- c("f1","f1q","p1","f","fq","p") R.lag <- cov(b) R.lag[upper.tri(R.lag)] <- 0 ram.lag <- matrix(c( # Baseline effects 'dur1 <-> n4amp1', 'dur1.n4amp_1', NA, 'n4amp1 -> dur', 'n4amp_1.dur', NA, 'dur <-> n4amp', 'dur.n4amp', NA, 'n4amp -> dur2', 'n4amp.dur2', NA, 'dur1 -> dur', 'dur1.dur', NA, 'dur -> dur2', 'dur.dur2', NA, # Immediacy effects 'f1 -> dur1', 'f1.dur1', NA, 'f1 -> n4amp1', 'f1.n4amp_1', NA, 'f1q -> dur1', 'f1q.dur1', NA, 'f1q -> n4amp1', 'f1q.n4amp_1', NA, 'p1 -> dur1', 'p1.dur1', NA, 'p1 -> n4amp1', 'p1.n4amp_1', NA, 'f -> dur', 'f.dur', NA, 'f -> n4amp', 'f.n4amp', NA, 'fq -> dur', 'fq.dur', NA, 'fq -> n4amp', 'fq.n4amp', NA, 'p -> dur', 'p.dur', NA, 'p -> n4amp', 'p.n4amp', NA, # Lag effects 'f1 -> dur', 'f1.dur', NA, 'f1q -> dur', 'f1q.dur', NA, 'f -> dur2', 'f.dur2', NA, 'fq -> dur2', 'fq.dur2', NA, # Variances 'dur1 <-> dur1', 'dur1.var', NA, 'dur <-> dur', 'dur.var', NA, 'dur2 <-> dur2', 'dur2.var', NA, 'n4amp1 <-> n4amp1', 'n4_1.var', NA, 'n4amp <-> n4amp', 'n4.var', NA), ncol=3, byrow=TRUE) sem.lag <- sem(ram.lag, R.lag, N=nrow(b), obs.variables=obs.var, fixed.x=fix.var) summary(sem.lag, digits=2) chisq.lag <- summary(sem.lag)$chisq df.lag <- summary(sem.lag)$df # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 4. Successor Effect Model # ------------------------------------------------------------------------------ b <- a[,c("dur1", "dur", "dur2", "n4amp1", "n4amp", "f1", "f1q", "p1", "f", "fq", "p")] obs.var <- c("dur1", "dur", "dur2", "n4amp1", "n4amp") fix.var <- c("f1","f1q","p1","f","fq","p") cor(b) R.suc <- cov(b) R.suc[upper.tri(R.suc)] <- 0 ram.suc <- matrix(c( # Baseline effects 'dur1 <-> n4amp1', 'dur1.n4amp_1', NA, 'n4amp1 -> dur', 'n4amp_1.dur', NA, 'dur <-> n4amp', 'dur.n4amp', NA, 'n4amp -> dur2', 'n4amp.dur2', NA, 'dur1 -> dur', 'dur1.dur', NA, 'dur -> dur2', 'dur.dur2', NA, # Immediacy effects 'f1 -> dur1', 'f1.dur1', NA, 'f1 -> n4amp1', 'f1.n4amp_1', NA, 'f1q -> dur1', 'f1q.dur1', NA, 'f1q -> n4amp1', 'f1q.n4amp_1', NA, 'p1 -> dur1', 'p1.dur1', NA, 'p1 -> n4amp1', 'p1.n4amp_1', NA, 'f -> dur', 'f.dur', NA, 'f -> n4amp', 'f.n4amp', NA, 'fq -> dur', 'fq.dur', NA, 'fq -> n4amp', 'fq.n4amp', NA, 'p -> dur', 'p.dur', NA, 'p -> n4amp', 'p.n4amp', NA, # Lag effects 'f1 -> dur', 'f1.dur', NA, 'f1q -> dur', 'f1q.dur', NA, 'f -> dur2', 'f.dur2', NA, 'fq -> dur2', 'fq.dur2', NA, # Successor effects 'p -> dur1', 'p.dur1', NA, 'p -> n4amp1', 'p.n4amp_1', NA, # Variances 'dur1 <-> dur1', 'dur1.var', NA, 'dur <-> dur', 'dur.var', NA, 'dur2 <-> dur2', 'dur2.var', NA, 'n4amp1 <-> n4amp1', 'n4_1.var', NA, 'n4amp <-> n4amp', 'n4.var', NA), ncol=3, byrow=TRUE) sem.suc <- sem(ram.suc, R.suc, N=nrow(b), obs.variables=obs.var, fixed.x=fix.var) summary(sem.suc, digits=2) chisq.suc <- summary(sem.suc)$chisq df.suc <- summary(sem.suc)$df # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Model Summary (Table 1) # ------------------------------------------------------------------------------ summary(sem.base, digits=3) summary(sem.immed, digits=3) summary(sem.lag, digits=3) summary(sem.suc, digits=3) # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Variance-Covariance Matrix (Table 2) # ------------------------------------------------------------------------------ vcm <- round(cov(b)*100)/100 vcm[lower.tri(vcm)] <- round(cor(b)[lower.tri(cov(b))]*100)/100 vcm # ------------------------------------------------------------------------------