Code to accompany Jäger, Engelmann, Vasishth: Similarity-based interference in sentence comprehension: Literature review and Bayesian meta-analysis, Journal of Memory and Language, 2017

Shravan Vasishth and Lena Jäger

2017-03-02

If you have any questions regarding this document, please contact Shravan Vasishth (vasishth@uni-potsdam.de).

Random-effects meta-analysis

We can construct a hierarchical model as follows:

\[\begin{equation} \begin{split} y_i \mid \theta_i, \sigma_i^2 \sim & N(\theta_i, \sigma_i^2) \quad i=1,\dots, n\\ \theta_i\mid \theta,\tau^2 \sim & N(\theta, \tau^2), \\ \theta \sim & N(0,100^2),\\ \tau \sim & N(0,100^2)T(0,) \\ \end{split} \end{equation}\]

Load data

dat<-read.csv("../data/MetaAnalysisData.csv",header=TRUE,sep=";")

## reorder by increasing y:
dat<-dat[with(dat,order(Effect)),]

unique(dat$Cue)
## [1] num  gend subj anim ccom sem 
## Levels: anim ccom gend num sem subj
# Retrieval cue that is manipulated:
## gend: gender (masculin vs feminin)
## num: number (singular vs plural)
## subj: subject (being a subject or not)
## anim: animacy (animate vs inanimate)
## ccom: c-comand (being a c-commander or not of the reflexive)
## sem: semantic cue (matching or mismatching the semantic requirements of a verb with respect to its subject)

unique(dat$DepType) 
## [1] agreement    refl         nonagreement reci        
## Levels: agreement nonagreement reci refl
# Dependency Type:
## agreement: subject-verb number agreement dependency
## nonagreement: subject-verb non-agreement dependency
## refl: reflexive-antecedent dependency
## reci: reciprocal-antecedent dependency

unique(dat$IntType) 
## [1] pro   retro
## Levels: pro retro
# Interference type:
## pro: proactive interference
## retro: retroactive interference

# Contrast coding of the covariates

# Interference type: sum contrasts
dat$proretro<-ifelse(dat$IntType=="pro",0.5,-0.5)

## Distractor prominence: sliding contrasts
dat$contrOR2<-ifelse(dat$Prominence2=="subj_OR_topic",0.5,
                     ifelse(dat$Prominence2=="other",-0.5,0))
dat$contrAND2<-ifelse(dat$Prominence2=="subj_AND_topic",0.5,
                      ifelse(dat$Prominence2=="subj_OR_topic",
                             -0.5,0))

MatchDat<-subset(dat,TargetType=="Match")
MismatchDat<-subset(dat,TargetType=="Mismatch")


## will do separate analyses on these subsets of data:
MatchNonAgrmt<-subset(dat,DepType=="nonagreement" & TargetType=="Match")
nMatchNonAgrmt<-dim(MatchNonAgrmt)[1] #12 studies

MatchAgrmt<-subset(dat,DepType=="agreement" & TargetType=="Match")
nMatchAgrmt <- dim(MatchAgrmt)[1] # 18 studies

MismatchAgrmt<-subset(dat,DepType=="agreement" & TargetType=="Mismatch")
nMismatchAgrmt<-dim(MismatchAgrmt)[1] # 13 studies

MatchReflReci<-subset(dat,DepType%in%c("refl","reci") & TargetType=="Match")
MismatchReflReci<-subset(dat,DepType%in%c("refl","reci") & TargetType=="Mismatch")
nMatchReflReci<-dim(MatchReflReci)[1] #21 studies
nMismatchReflReci<-dim(MismatchReflReci)[1] # 13 studies

Model 1: Modeling the interference effect without covariates in Target-Match and Target-Mismatch

This analysis is not reported in the paper (except as an aside).

## define model:
cat("
model
    {
    for( i in 1:n)
    {
    p[i] <- 1/s[i]^2
    y[i] ~ dnorm(thetai[i],p[i])
    thetai[i] ~ dnorm(theta,prec)
    }
    ## priors for theta: 
    ## theta lies between (-1.96*100,1.96*100):
    theta ~ dnorm(0,1/100^2)
    
    ## Prior 1:
    #    prec ~ dgamma(0.001,0.001)
    #    tau.sq <- 1/prec
    #    tau <- pow(tau.sq,0.5)
    ## Prior 2:
    #tau ~ dunif(0,200) 
    #tau.sq <- tau*tau
    #prec<-1/(tau.sq)
    ## Prior 3: truncated normal
       tau ~ dnorm(0,1/10000)T(0,)
        tau.sq <- tau*tau
        prec<-1/(tau.sq)
    ## Prior 4: truncated t-distribution
    #    tau ~ dt(0,25,2)I(0,)
    #    tau.sq <- tau*tau
    #    prec<-1/(tau.sq)
    }",
     file="../vignettes/JAGSModels/RandomEffectsMetaAnalysisM1.jag" )
Matchdat <- list(y = MatchDat$Effect,
            s = MatchDat$SE,
            n = dim(MatchDat)[1])
Mismatchdat <- list(y = MismatchDat$Effect,
            s = MismatchDat$SE,
            n = dim(MismatchDat)[1])

Analysis 1a: Target-Match Analysis

res<-fitmodel(Matchdat)
mysummary(res,rows = 1:2)
##             Mean       SD
## tau   12.1466267 2.940201
## theta  0.1624393 2.612423
##       Point est. Upper C.I.
## tau     1.000835   1.002999
## theta   1.000243   1.001066
estimate_match<-summary(res)$statistics[2,1]
se_match<-summary(res)$statistics[2,2]
resFull<-res
(TMCrI<-summarize(d=res,rows=1:2))
##             mean     lower     upper prob(b>0)
## tau   12.1466267  6.727681 18.396145   1.00000
## theta  0.1624393 -4.723847  5.456512   0.51725

Sensitivity/influential value analysis:

Check whether the Pearlmutter (1999) results are unduly influential. If we remove Pearlmutter et al (1999), Exp. 1 and Exp. 3, singular verbs, the posterior is a bit shifted to the right:

MatchNoPearl<-subset(MatchDat, Publication != "PearlmutterEtAl99E3sing" & Publication != "PearlmutterEtAl99E1")

MatchNoPearldat <- list(y = MatchNoPearl$Effect,
            s = MatchNoPearl$SE,
            n = dim(MatchNoPearl)[1])
resNoPearl<-fitmodel(MatchNoPearldat)
mysummary(resNoPearl,rows = 1:2)
##           Mean       SD
## tau   7.420933 3.328401
## theta 1.579368 2.193328
##       Point est. Upper C.I.
## tau     1.005033   1.008736
## theta   1.000167   1.000763
summarize(d=resNoPearl,rows=1:2)
##           mean      lower     upper prob(b>0)
## tau   7.420933  0.8484178 13.915302     1.000
## theta 1.579368 -2.5130623  6.138356     0.762

Plot with and without Pearlmutter studies:

multiplot(plotparameter(resFull,title="Interference effect \n (Target-Match, Full data)",col=2),
plotparameter(resNoPearl,title="Interference effect \n (Target-Match, W/o Pearlmutter)",col=2),
cols=2)

## for composite plot:
TMatchParam<-plotparameter(resFull,col=2)
CrI<-getCrI(res)

plotposteriors(d=MatchDat,CrI=CrI,start=3,title="Target-Match")

Analysis 1b: Target-Mismatch

res<-fitmodel(Mismatchdat)
mysummary(res,rows = 1:2)
##            Mean       SD
## tau   20.533981 4.937801
## theta -5.666933 5.291269
##       Point est. Upper C.I.
## tau    0.9998441  0.9999229
## theta  1.0010853  1.0036515
estimate_mismatch<-summary(res)$statistics[2,1]
se_mismatch<-summary(res)$statistics[2,2]
(TMisCrI<-summarize(d=res,rows = 1:2))
##            mean     lower     upper prob(b>0)
## tau   20.533981  12.18010 31.324651  1.000000
## theta -5.666933 -16.35722  4.695931  0.138125

Sensitivity/influential values analysis

If we remove Jäger et al. (2015), Exp. 1 and Pearlmutter et al. (1999), Exp. 1 (the only two experiments who report significant inhibition), we see stronger evidence for a facilitatory effect:

## Remove Jaeger et al. (2015), Exp 1 and Pearlmutter et al. (1999), Exp. 1:
MismatchNoJaegerPearl <- subset(MismatchDat, Publication != "JaegerEtAl15E1" & Publication != "PearlmutterEtAl99E1") 

MismatchNoJaegerPearldat<-list(y = MismatchNoJaegerPearl$Effect,
            s = MismatchNoJaegerPearl$SE,
            n = dim(MismatchNoJaegerPearl)[1])
resNoJaegerPearl<-fitmodel(MismatchNoJaegerPearldat)
mysummary(resNoJaegerPearl,rows = 1:2)
##           Mean       SD
## tau   18.97298 5.296332
## theta -8.84101 5.323369
##       Point est. Upper C.I.
## tau     1.000092   1.000399
## theta   1.000501   1.002216
summarize(resNoJaegerPearl,rows=1:2)
##           mean      lower     upper prob(b>0)
## tau   18.97298   9.524939 30.459445  1.000000
## theta -8.84101 -19.264212  1.721858  0.049125

However, the facilitation in target-mismatch is entirely driven by Wagers et al (2009), Experiments 2, 4 and 5:

MismatchNoWagers<-subset(MismatchDat, Publication!="WagersEtAl09E2" & Publication!= "WagersEtAl09E4" & Publication!="WagersEtAl09E5")
MismatchNoWagersdat<-list(y = MismatchNoWagers$Effect,
            s = MismatchNoWagers$SE,
            n = dim(MismatchNoWagers)[1])
resNoWagers<-fitmodel(MismatchNoWagersdat)
mysummary(resNoWagers,rows = 1:2)
##            Mean       SD
## tau   18.287717 4.811238
## theta -1.354558 5.206259
##       Point est. Upper C.I.
## tau     1.001492   1.004799
## theta   0.999840   1.000139
summarize(resNoWagers,rows=1:2)
##            mean     lower     upper prob(b>0)
## tau   18.287717  10.24659 28.958630  1.000000
## theta -1.354558 -11.80014  8.568415  0.394375
TMismatchPlot<-plotparameter(res,col=2,title="Interference effect \n (Target-Mismatch")
TMismatchPlot

CrI<-getCrI(res)
# start refers to the row we want to plot the CrIs for:
plotposteriors(d=MismatchDat,CrI=CrI,start=3,title="Target-Mismatch")

Meta-regressions

Modeling interference by taking into account the effect of distractor prominence (sliding contrasts) and Interference Type (pro/retroactive) in Target-Match and Target-Mismatch configurations

Target-match

cat("
model
    {
    for( i in 1:n)
    {
    p[i] <- 1/s[i]^2
    y[i] ~ dnorm(thetai[i]+betaOR2*contrOR2[i]+
                 betaAND2*contrAND2[i]+betaPR*proretro[i],p[i])
    thetai[i] ~ dnorm(theta,prec)
    }
    ## prior for theta: 
    ## theta lies between (-1.96*100,1.96*100):
    theta ~ dnorm(0,1/100^2)

    ## prior for beta:
    betaAND2 ~ dnorm(0,1/100^2)
    betaOR2 ~ dnorm(0,1/100^2)
    betaPR ~  dnorm(0,1/100^2)

    ## Prior 1:
    #    prec ~ dgamma(0.001,0.001)
    #    tau.sq <- 1/prec
    #    tau <- pow(tau.sq,0.5)
    ## Prior 2:
    #tau ~ dunif(0,200) 
    #tau.sq <- tau*tau
    #prec<-1/(tau.sq)
    ## Prior 3: truncated normal
       tau ~ dnorm(0,1/10000)T(0,)
       tau.sq <- tau*tau
       prec<-1/(tau.sq)
    ## Prior 4: truncated t-distribution
    #    tau ~ dt(0,25,2)I(0,)
    #    tau.sq <- tau*tau
    #    prec<-1/(tau.sq)
    }",
     file="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag" )
datMatchPromslidingPR<-list(y=MatchDat$Effect,
                     s=MatchDat$SE,
                     n=dim(MatchDat)[1],
                     contrOR2=MatchDat$contrOR2,
                     contrAND2=MatchDat$contrAND2,
                     proretro=MatchDat$proretro)

res<-fitmodel(d=datMatchPromslidingPR,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
mysummary(res,rows=1:5)
##                Mean        SD
## betaAND2 -12.183718 10.165541
## betaOR2   -2.084771  8.133591
## betaPR     8.235375  5.841801
## tau       12.569955  2.990330
## theta     -1.119907  2.953436
##          Point est. Upper C.I.
## betaAND2   1.000356   1.001129
## betaOR2    1.000634   1.002645
## betaPR     1.001078   1.002583
## tau        1.001178   1.002511
## theta      1.000229   1.000705
(resMPromSlid<-summarize(res,rows = 1:5))
##                mean      lower     upper prob(b>0)
## betaAND2 -12.183718 -33.130214  7.218893  0.114875
## betaOR2   -2.084771 -18.428092 14.164600  0.397625
## betaPR     8.235375  -3.104622 19.786283  0.924875
## tau       12.569955   7.260572 19.011191  1.000000
## theta     -1.119907  -6.957254  4.745669  0.346875
TMAndOr<-plotparameter(res,col=1,title="Target-Match:\n Prominence (AND vs OR)")
TMOrOther<-plotparameter(res,col=2,title="Target-Match:\n Prominence (OR vs other)")
TMproretro<-plotparameter(res,col=3,title="Target-Match:\n  (proretro)")
TMTheta<-plotparameter(res,col=5,title="Target-Match:\n  Interference effect (theta)")
CrI<-getCrI(res)
plotposteriors(d=MatchDat,CrI=CrI,start=6,title="Target-Match")

Sensitivity/influential value analysis:

Note that Pearlmutter paper might be influential in driving the posterior distribution. We therefore remove Pearlmutter et al. (1999), Exp. 1 and Exp. 3 (singular verbs), and fit the same model again.

MatchNoPearl<-subset(MatchDat, Publication != "PearlmutterEtAl99E3sing" & Publication != "PearlmutterEtAl99E1")
MatchNoPearldat <- list(y = MatchNoPearl$Effect,
            s = MatchNoPearl$SE,
            n = dim(MatchNoPearl)[1],
            contrOR2=MatchNoPearl$contrOR2,
            contrAND2=MatchNoPearl$contrAND2,
            proretro=MatchNoPearl$proretro)

resNoPearl<-fitmodel(d=MatchNoPearldat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
mysummary(resNoPearl,rows = 1:5)
##                 Mean       SD
## betaAND2 -11.8637672 8.640307
## betaOR2   -5.9797638 6.835906
## betaPR     5.2625807 4.900148
## tau        8.7787818 3.319874
## theta      0.1373528 2.545942
##          Point est. Upper C.I.
## betaAND2   1.001330   1.004131
## betaOR2    1.001633   1.005001
## betaPR     1.000252   1.001265
## tau        1.005442   1.012737
## theta      1.000694   1.002615
(resMPromSlid_NoPearl<-summarize(d=resNoPearl,rows=1:5))
##                 mean      lower     upper prob(b>0)
## betaAND2 -11.8637672 -29.465711  4.373669   0.07750
## betaOR2   -5.9797638 -19.735706  7.427098   0.18775
## betaPR     5.2625807  -4.184834 15.139201   0.86675
## tau        8.7787818   2.005221 15.536941   1.00000
## theta      0.1373528  -4.965013  5.293621   0.51725

Plot with and without Pearlmutter studies:

multiplot(plotparameter(res,title="Interference effect \n (Target-Match, Full data)",col=2),
plotparameter(resNoPearl,title="Interference effect \n (Target-Match, W/o Pearlmutter)",col=2),
cols=2)

Removing the Pearlmutter experiments does not have much of an impact on the posterior.

Target-mismatch

datMismatchPromslidingPR<-list(y=MismatchDat$Effect,
                     s=MismatchDat$SE,
                     n=dim(MismatchDat)[1],
                     contrOR2=MismatchDat$contrOR2,
                     contrAND2=MismatchDat$contrAND2,
                     proretro=MismatchDat$proretro)

res<-fitmodel(d=datMismatchPromslidingPR,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
mysummary(res,rows=1:5)
##                Mean        SD
## betaAND2  39.379414 14.270717
## betaOR2   34.921319 14.719521
## betaPR   -32.793193 10.729314
## tau       13.837776  5.326225
## theta     -5.121709  4.566062
##          Point est. Upper C.I.
## betaAND2   1.000879   1.003284
## betaOR2    1.001572   1.005361
## betaPR     1.001289   1.004514
## tau        1.000531   1.002081
## theta      1.000410   1.001329
(resMPromSlidPR<-summarize(res,rows = 1:5))
##                mean      lower      upper prob(b>0)
## betaAND2  39.379414  11.942016  67.394384  0.996500
## betaOR2   34.921319   5.636282  63.008330  0.987875
## betaPR   -32.793193 -53.429255 -10.425960  0.002625
## tau       13.837776   3.250984  24.953868  1.000000
## theta     -5.121709 -14.366683   3.602075  0.122250
TMMAndOr<-plotparameter(res,col=1,title="Target-Mismatch:\n Prominence (AND vs OR)")
TMMOrOther<-plotparameter(res,col=2,title="Target-Mismatch:\n Prominence (OR vs other)")
TMMproretro<-plotparameter(res,col=3,title="Target-Mismatch:\n (proretro)")
TMMTheta<-plotparameter(res,col=5,title="Target-Mismatch:\n  Interference Effect (theta)")

multiplot(TMTheta,TMMTheta,
          TMproretro,TMMproretro,
          TMOrOther,TMMOrOther,
          TMAndOr,TMMAndOr,
          cols=2)

CrI<-getCrI(res)
plotposteriors(d=MismatchDat,CrI=CrI,start=6,title="Target-Mismatch")

Sensitivity/influential values analysis

If we remove Jäger et al. (2015), Exp. 1 and Pearlmutter et al. (1999), Exp. 1, there isn’t a dramatic change in the posterior, but we see somewhat stronger evidence for facilitatory interference:

MismatchNoJaegerPearl<-subset(MismatchDat, Publication != "JaegerEtAl15E1" & Publication != "PearlmutterEtAl99E1")
MismatchNoJaegerPearldat<-list(y = MismatchNoJaegerPearl$Effect,
            s = MismatchNoJaegerPearl$SE,
            n = dim(MismatchNoJaegerPearl)[1],
            contrOR2=MismatchNoJaegerPearl$contrOR2,
            contrAND2=MismatchNoJaegerPearl$contrAND2,
            proretro=MismatchNoJaegerPearl$proretro)
resNoJaegerPearl<-fitmodel(d=MismatchNoJaegerPearldat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
mysummary(resNoJaegerPearl,rows=1:5)
##                Mean        SD
## betaAND2  42.283734 13.531809
## betaOR2   36.536784 15.334369
## betaPR   -27.933056 10.926518
## tau       11.343895  5.938237
## theta     -7.257867  4.423751
##          Point est. Upper C.I.
## betaAND2  0.9998337   1.000006
## betaOR2   1.0000025   1.000683
## betaPR    1.0000793   1.000749
## tau       1.0008225   1.002462
## theta     1.0006391   1.002409
(resMPromSlidPR_NoJaegerPearl<-summarize(resNoJaegerPearl,rows = 1:5))
##                mean      lower     upper prob(b>0)
## betaAND2  42.283734  16.034020 68.605012  0.997750
## betaOR2   36.536784   4.828925 65.475124  0.988500
## betaPR   -27.933056 -49.278971 -6.032174  0.007875
## tau       11.343895   1.056794 23.864894  1.000000
## theta     -7.257867 -16.128205  1.361952  0.047750

However, the facilitation in Target-Mismatch is driven entirely by Experiments 2, 4, and 5 reported by Wagers et al. (2009). Without these two studies, the effect is centered around 0.

MismatchNoWagersAgrmt<-subset(MismatchDat,  Publication!="WagersEtAl09E2" & Publication!= "WagersEtAl09E4" & Publication!="WagersEtAl09E5")
MismatchNoWagersdat<-list(y = MismatchNoWagers$Effect,
            s = MismatchNoWagers$SE,
            n = dim(MismatchNoWagers)[1],
            contrOR2=MismatchNoWagers$contrOR2,
            contrAND2=MismatchNoWagers$contrAND2,
            proretro=MismatchNoWagers$proretro)
resNoWagers<-fitmodel(MismatchNoWagersdat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
(mysummary(resNoWagers,rows = 1:5))
##                Mean        SD
## betaAND2  32.048275 13.314489
## betaOR2   25.054214 13.536724
## betaPR   -32.088824  9.286889
## tau        9.883541  5.465640
## theta     -1.423317  4.135809
##          Point est. Upper C.I.
## betaAND2   1.001631   1.005295
## betaOR2    1.000361   1.001557
## betaPR     1.001585   1.004642
## tau        1.001178   1.003489
## theta      1.001045   1.003632
##          Point est. Upper C.I.
## betaAND2   1.001631   1.005295
## betaOR2    1.000361   1.001557
## betaPR     1.001585   1.004642
## tau        1.001178   1.003489
## theta      1.001045   1.003632
(summarize(resNoWagers,rows=1:5))
##                mean       lower      upper prob(b>0)
## betaAND2  32.048275   5.9708829  58.710087  0.991625
## betaOR2   25.054214  -2.2995069  51.587766  0.966000
## betaPR   -32.088824 -49.8151176 -12.680201  0.002000
## tau        9.883541   0.5095725  21.509571  1.000000
## theta     -1.423317  -9.9970414   6.309276  0.374875

Check what happens if we also remove the experiments published by Lago et al (2015) in addition to the Wagers et al (2009) experiments. Without the Wagers et al (2009) and the Lago et al (2015) data, the mean of the posterior turns out to be positive.

MismatchNoWagersNoLago<-subset(MismatchDat, Publication!="WagersEtAl09E2" & Publication!= "WagersEtAl09E4" &  Publication!= "WagersEtAl09E5" &  Publication!= "WagersEtAl09E3sing" & Publication!= "WagersEtAl09E3plu" & Publication != "LagoEtAl15E1" & Publication!="LagoEtAl15E2" & Publication != "LagoEtAl15E3a" & Publication != "LagoEtAl15E3b")
MismatchNoWagersNoLagodat<-list(y = MismatchNoWagersNoLago$Effect,
            s = MismatchNoWagersNoLago$SE,
            n = dim(MismatchNoWagersNoLago)[1],
            contrOR2=MismatchNoWagersNoLago$contrOR2,
            contrAND2=MismatchNoWagersNoLago$contrAND2,
            proretro=MismatchNoWagersNoLago$proretro)
resNoWagersNoLago<-fitmodel(MismatchNoWagersNoLagodat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
(mysummary(resNoWagersNoLago,rows = 1:5))
##               Mean        SD
## betaAND2  7.969248 20.203290
## betaOR2  18.515835 14.677673
## betaPR   -7.423974 17.507018
## tau      11.235463  6.520889
## theta     7.555262  7.061419
##          Point est. Upper C.I.
## betaAND2   1.000134   1.000914
## betaOR2    1.000422   1.001393
## betaPR     1.000459   1.001851
## tau        1.001083   1.002949
## theta      1.000486   1.001170
##          Point est. Upper C.I.
## betaAND2   1.000134   1.000914
## betaOR2    1.000422   1.001393
## betaPR     1.000459   1.001851
## tau        1.001083   1.002949
## theta      1.000486   1.001170
(summarize(resNoWagersNoLago,rows=1:5))
##               mean       lower    upper prob(b>0)
## betaAND2  7.969248 -32.1471232 48.10305  0.664625
## betaOR2  18.515835 -10.7187705 47.89170  0.900375
## betaPR   -7.423974 -42.3363346 27.63692  0.324625
## tau      11.235463   0.9148786 26.04826  1.000000
## theta     7.555262  -6.3554260 21.40271  0.866625

By-dependeny type meta-regressions: Modeling the interference effect with Interference Type (pro/retroactive) as predictor for each dependency type separately.

Distractor prominence is not included in the models because not enough data is available to fit models with two covariates.

One could fit one giant meta-regression looking at the main effects of dependency type and pro/retroactive interference, and interactions. But there really isn’t enough data to do this. We can therefore do subgroup analyses: fit separate models for nonagreement, agreement, and reflexive/reciprocal dependencies and investigate whether pro/retro interference effects differ within each subtype.

Define general meta-regression model

We define the following model for the meta-regressions.

## define model for meta-regression analysis with Interference Type as predictor (without distractor prominence): Thompson and Sharp model.
## pred is the proretro predictor:
cat("
model
    {
    for(i in 1:n)
    {
    p[i] <- 1/s[i]^2
    y[i] ~ dnorm(thetai[i]+ beta * pred[i],p[i])
    thetai[i] ~ dnorm(theta,prec)
    }
    ## prior for theta: 
    ## theta lies between (-1.96*100,1.96*100):
    theta ~ dnorm(0,1/100^2)

    ## prior for beta:
    beta ~ dnorm(0,1/100^2)

    ## Prior 1:
    #    prec ~ dgamma(0.001,0.001)
    #    tau.sq <- 1/prec
    #    tau <- pow(tau.sq,0.5)
    ## Prior 2:
    #tau ~ dunif(0,200) 
    #tau.sq <- tau*tau
    #prec<-1/(tau.sq)
    ## Prior 3: truncated normal
       tau ~ dnorm(0,1/10000)T(0,)
        tau.sq <- tau*tau
        prec<-1/(tau.sq)
    ## Prior 4: truncated t-distribution
    #    tau ~ dt(0,25,2)I(0,)
    #    tau.sq <- tau*tau
    #    prec<-1/(tau.sq)
    }",
     file="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag" )

Non-agreement argument-verb dependencies (only Target-Match data available): modeling interference with interference type as predictor

This is essentially all the Van Dyke data:

datMatchNonAgrmt<-list(y=MatchNonAgrmt$Effect,
                       s=MatchNonAgrmt$SE,
                       n=dim(MatchNonAgrmt)[1],
                       pred=MatchNonAgrmt$proretro)

res<-fitmodel(d=datMatchNonAgrmt,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"))
res<-fitmodel(d=datMatchNonAgrmt,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"))
res<-fitmodel(d=datMatchPromslidingPR,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysisPromslidingPR.jag",
              track=c("tau","theta","thetai","betaAND2","betaOR2","betaPR"))
mysummary(res,rows=1:5)
##                Mean        SD
## betaAND2 -12.252150 10.039158
## betaOR2   -2.061730  7.997041
## betaPR     8.180431  5.696649
## tau       12.571589  2.952570
## theta     -1.135459  2.905504
##          Point est. Upper C.I.
## betaAND2  0.9999130   1.000138
## betaOR2   0.9999769   1.000482
## betaPR    1.0000967   1.000685
## tau       1.0005105   1.002227
## theta     1.0000338   1.000565
(resMPromSlid<-summarize(res,rows = 1:5))
##                mean      lower    upper prob(b>0)
## betaAND2 -12.252150 -32.414925  7.53270  0.106250
## betaOR2   -2.061730 -17.636330 13.64896  0.396000
## betaPR     8.180431  -3.099878 19.71950  0.926500
## tau       12.571589   7.160007 18.70487  1.000000
## theta     -1.135459  -6.669930  4.67434  0.346375
mysummary(res,rows=1:3) 
##                Mean        SD
## betaAND2 -12.252150 10.039158
## betaOR2   -2.061730  7.997041
## betaPR     8.180431  5.696649
##          Point est. Upper C.I.
## betaAND2  0.9999130   1.000138
## betaOR2   0.9999769   1.000482
## betaPR    1.0000967   1.000685
(resMNonAgrmt<-summarize(res,rows=1:3))
##                mean      lower    upper prob(b>0)
## betaAND2 -12.252150 -32.414925  7.53270   0.10625
## betaOR2   -2.061730 -17.636330 13.64896   0.39600
## betaPR     8.180431  -3.099878 19.71950   0.92650
NonAgrmtMatchproretro<-plotparameter(res,col=1,title="Target-Match (non-agr Argument-verb):\n proretro")
NonAgrmtMatchTheta<-plotparameter(res,col=3,title="Target-Match (non-agr Argument-verb):\n theta")

Subject-verb agreement, Target-Match configurations: modeling interference with interference type as predictor

datMatchAgrmt<-list(y=MatchAgrmt$Effect,
                       s=MatchAgrmt$SE,
                       n=dim(MatchAgrmt)[1],
                       pred=MatchAgrmt$proretro)

res<-fitmodel(d=datMatchAgrmt,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)
mysummary(res,rows=1:3) 
##            Mean       SD
## beta  15.928959 9.981681
## tau   15.265863 5.169076
## theta -6.546933 4.927926
##       Point est. Upper C.I.
## beta   1.0000874   1.000617
## tau    1.0000300   1.000240
## theta  0.9999577   1.000149
(resMatchAgrmt<-summarize(d=res,rows=1:3))
##            mean      lower     upper prob(b>0)
## beta  15.928959  -2.589227 36.989289   0.95450
## tau   15.265863   6.720609 27.255308   1.00000
## theta -6.546933 -15.923588  3.419853   0.08825
TMAgrmtproretro<-plotparameter(res,col=1,title="Target-Match Agrmt:\n proretro")
TMAgrmtTheta<-plotparameter(res,col=3,title="Target-Match Agrmt:\n theta")

Influential values analysis:

Only Franck et al 2015, Exp1 RC and Pearlmutter et al. 1999, Exp 3 report inhibitory interference for subject-verb agreement in target-match configurations. All other studies that report significant results found facilitation. The effect reported by Franck is extremely large (much larger than in any other experiment). Check the impact of Franck et al 2015, Exp1 RC on the posterior distribution. Without this data point, the posterior is just a bit more shifted to the left.

# Remove Franck et al (2015)
MatchNoFranckAgrmt<-subset(MatchAgrmt, Publication != "FranckEtAl15E1RC")
MatchNoFranckAgrmtdat<-list(y = MatchNoFranckAgrmt$Effect,
            s=MatchNoFranckAgrmt$SE,
            n=dim(MatchNoFranckAgrmt)[1],
            pred=MatchNoFranckAgrmt$proretro)
resNoFranckAgrmt<-fitmodel(MatchNoFranckAgrmtdat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)

(summary_NoFranckAgrmt<-summarize(resNoFranckAgrmt,rows=1:3))
##            mean      lower     upper prob(b>0)
## beta  13.545708  -4.941398 33.194511  0.931125
## tau   14.460510   6.214719 25.557596  1.000000
## theta -7.748854 -17.151302  1.810515  0.050125
theta_match_Agrmt_noFranck <- round(summary_NoFranckAgrmt$mean[3],1)
theta_match_Agrmt_noFranck_p <- round(summary_NoFranckAgrmt[[4]][3],2)

Subject-verb agreement, Target-Mismatch configurations: modeling interference with interference type as predictor

datMismatchAgrmt<-list(y=MismatchAgrmt$Effect,
                       s=MismatchAgrmt$SE,
                       n=dim(MismatchAgrmt)[1],
                       pred=MismatchAgrmt$proretro)

res<-fitmodel(d=datMismatchAgrmt,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)
mysummary(res,rows=1:3) 
##            Mean        SD
## beta  -14.51144 13.194966
## tau    16.78267  7.180141
## theta -21.79474  6.898115
##       Point est. Upper C.I.
## beta   1.0000483   1.000306
## tau    1.0005777   1.001158
## theta  0.9999683   1.000039
(resMismatchAgrmt<-summarize(d=res,rows=1:3))
##            mean     lower     upper prob(b>0)
## beta  -14.51144 -40.99270 11.374048 0.1233125
## tau    16.78267   4.48629 33.338539 1.0000000
## theta -21.79474 -36.36791 -8.897948 0.0014375
TMMAgrmtproretro<-plotparameter(res,col=1,title="Target-Mismatch Agrmt:\n proretro")
TMMAgrmtTheta<-plotparameter(res,col=3,title="Target-Mismatch Agrmt:\n theta")
CrI<-getCrI(res)
plotposteriors(d=MismatchAgrmt,CrI=CrI,start=4,title="Target-Mismatch (Agrmt)")

Influential values analysis:

The large facilitatory interferencce effect in Target-Mismatch in subj-verb agreement may be driven by the experiments in Wagers et al (2009) and Lago et al (2015). First, check the influence of the Wagers et al (2009) experiments:

#Check influence of the Wagers et al (2009) experiments:
MismatchNoWagersAgrmt<-subset(MismatchAgrmt, Publication!="WagersEtAl09E2" & Publication!= "WagersEtAl09E4" &  Publication!= "WagersEtAl09E5" &  Publication!= "WagersEtAl09E3sing" & Publication!= "WagersEtAl09E3plu")

MismatchNoWagersAgrmtdat<-list(y = MismatchNoWagersAgrmt$Effect,
            s=MismatchNoWagersAgrmt$SE,
            n=dim(MismatchNoWagersAgrmt)[1],
            pred=MismatchNoWagersAgrmt$proretro)
resNoWagersAgrmt<-fitmodel(MismatchNoWagersAgrmtdat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)

(summary_NoWagersAgrmt<-summarize(resNoWagersAgrmt,rows=1:3))
##            mean      lower     upper prob(b>0)
## beta  -22.06114 -54.375872 11.425249 0.0756875
## tau    16.37320   1.562648 41.329493 1.0000000
## theta -14.17401 -32.081589  1.571142 0.0353750
theta_mismatch_Agrmt_noWagers <- round(summary_NoWagersAgrmt$mean[3],1)
theta_mismatch_Agrmt_noWagers_p <- round(summary_NoWagersAgrmt[[4]][3],2)

Second, check the influence of the Wagers et al (2009) experiments together with the Lago et al (2015):

#Check influence of the Wagers et al (2009) and Lago et al (2015) experiments:
MismatchNoWagersNoLagoAgrmt<-subset(MismatchAgrmt, Publication!="WagersEtAl09E2" & Publication!= "WagersEtAl09E4" &  Publication!= "WagersEtAl09E5" &  Publication!= "WagersEtAl09E3sing" & Publication!= "WagersEtAl09E3plu" & Publication != "LagoEtAl15E1" & Publication!="LagoEtAl15E2" & Publication != "LagoEtAl15E3a" & Publication != "LagoEtAl15E3b")

MismatchNoWagersNoLagoAgrmtdat<-list(y = MismatchNoWagersNoLagoAgrmt$Effect,
            s=MismatchNoWagersNoLagoAgrmt$SE,
            n=dim(MismatchNoWagersNoLagoAgrmt)[1],
            pred=MismatchNoWagersNoLagoAgrmt$proretro)
resNoWagersNoLagoAgrmt<-fitmodel(MismatchNoWagersNoLagoAgrmtdat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)

(summary_NoWagersNoLagoAgrmt<-summarize(resNoWagersNoLagoAgrmt,rows=1:3))
##             mean       lower     upper prob(b>0)
## beta  -0.1067043 -176.599566 181.66858 0.4992500
## tau   30.8827189    3.681275  94.56938 1.0000000
## theta -3.8764386  -97.748413  90.81650 0.4675625
theta_mismatch_Agrmt_noWagersNoLago <- round(summary_NoWagersNoLagoAgrmt$mean[3],1)
theta_mismatch_Agrmt_noWagersNoLago_p <- round(summary_NoWagersNoLagoAgrmt[[4]][3],2)

The facilitatory effect disappears (the posterior is centered around 0) when removing the Wagers et al (2009) and the Lago et al (2015) data. However, this new estimate is actually not very informative as not many data points are left in the analysis. Therefore, this analysis is not reported in the paper.

Reciprocal/reflexive-antecedent dependencies, Target-Match configurations: modeling interference with interference type as predictor

datMatchReci<-list(y=MatchReflReci$Effect,
                       s=MatchReflReci$SE,
                       n=dim(MatchReflReci)[1],
                       pred=MatchReflReci$proretro)

res<-fitmodel(d=datMatchReci,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)
mysummary(res,rows=1:3) 
##              Mean       SD
## beta  10.27121066 6.193356
## tau    5.35436817 3.943952
## theta  0.01298092 3.117555
##       Point est. Upper C.I.
## beta    1.000251   1.000701
## tau     1.000729   1.002336
## theta   1.000401   1.001129
(resMatchReci<-summarize(d=res,rows=1:3))
##              mean      lower     upper prob(b>0)
## beta  10.27121066 -1.5480337 22.880870 0.9557500
## tau    5.35436817  0.2284568 14.773019 1.0000000
## theta  0.01298092 -6.1807229  6.072214 0.5058125
TMReciproretro<-plotparameter(res,col=1,title="Target-Match Refl:\n proretro")
TMReciTheta<-plotparameter(res,col=3,title="Target-Match Refl:\n theta")

Reciprocal/reflexive-antecedent dependencies, Target-Mismatch configurations: modeling interference with interference type as predictor

datMismatchReci<-list(y=MismatchReflReci$Effect,
                       s=MismatchReflReci$SE,
                       n=dim(MismatchReflReci)[1],
                       pred=MismatchReflReci$proretro)

res<-fitmodel(d=datMismatchReci,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)
mysummary(res,rows=1:3) 
##            Mean        SD
## beta  -6.124193 11.566317
## tau    8.228772  6.126415
## theta 10.776803  5.818454
##       Point est. Upper C.I.
## beta    1.000546   1.000801
## tau     1.000368   1.001255
## theta   1.000198   1.000243
(resMismatchReci<-summarize(res,rows=1:3))
##            mean       lower    upper prob(b>0)
## beta  -6.124193 -28.4146386 17.03809 0.2830000
## tau    8.228772   0.2871181 22.63134 1.0000000
## theta 10.776803  -0.8850380 21.99304 0.9676875
TMMReciproretro<-plotparameter(res,col=1,title="Target-Mismatch Refl/Reci:\n proretro")
TMMReciTheta<-plotparameter(res,col=3,title="Target-Mismatch Refl:\n theta")
CrI<-getCrI(res)
plotposteriors(d=MismatchReflReci,CrI=CrI,start=4,title="Target-Mismatch (Refl/Reci)")

Influential values analysis:

Is the inhibition in target-mismatch configurations in reflexives/reciprocals driven by the Chinese data from Jäger et al (2015) which is the only study that reports statistically significant inhibition and has an unusually large sample size?

MismatchNoJaegerRefl<-subset(MismatchReflReci, Publication != "JaegerEtAl15E1")

MismatchNoJaegerRefldat<-list(y = MismatchNoJaegerRefl$Effect,
            s=MismatchNoJaegerRefl$SE,
            n=dim(MismatchNoJaegerRefl)[1],
            pred=MismatchNoJaegerRefl$proretro)
resNoJaegerRefl<-fitmodel(MismatchNoJaegerRefldat,
              m="../vignettes/JAGSModels/RandomEffectsMetaRegressionAnalysispred.jag",
         track=c("theta","thetai","beta","tau"),adapt=40000,iter=80000)

(summary_resNoJaegerRefl<-summarize(resNoJaegerRefl,rows=1:3))
##            mean       lower    upper prob(b>0)
## beta  -3.499557 -28.1942561 21.14555 0.3850000
## tau    9.346311   0.4140192 25.87458 1.0000000
## theta  9.378967  -2.9879443 21.78830 0.9389375
theta_mismatch_Refl_noJaeger <- round(summary_resNoJaegerRefl$mean[3],1)
theta_mismatch_Refl_noJaeger_p <- round(summary_resNoJaegerRefl[[4]][3],2)

Plot posteriors

multiplot(NonAgrmtMatchTheta,
          NonAgrmtMatchproretro,
          TMAgrmtTheta,
          TMAgrmtproretro,
          TMMAgrmtTheta,
          TMMAgrmtproretro,
          TMReciTheta,
          TMReciproretro,
          TMMReciTheta,
          TMMReciproretro,
          cols=2)

Some basic Stan checks

Here, we are just checking whether Stan gives similar results for some of the basic models. We recover approximately the same parameters using Stan.

Match data

fit <- stan(file='StanModels/rema2.stan', data=Matchdat,
            iter=2000, chains=4, seed=987654321,
            control = list(adapt_delta = 0.8))

paramnames<-c("mu","tau")
#print(fit,pars=paramnames)

params<-extract(fit,pars=paramnames)

stan_plot(fit,pars=paramnames)+geom_vline(xintercept = 0)+
  labs(title="Target match studies")
## ci_level: 0.8 (80% intervals)
## outer_level: 0.95 (95% intervals)

paramnames<-c("mu")
stan_hist(fit,pars=paramnames)+geom_vline(xintercept = 0)+
  labs(title="Overall interference effect (Target match)")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Mismatch data

output <- stanc("StanModels/rema2.stan")

fit <- stan(file='StanModels/rema2.stan', data=Mismatchdat,
            iter=2000, chains=4, seed=987654321,
            control = list(adapt_delta = 0.8))

paramnames<-c("mu","tau","theta")
#print(fit,pars=paramnames)

params<-extract(fit,pars=paramnames)

stan_plot(fit,pars=paramnames)+geom_vline(xintercept = 0)+
  labs(title="Target mismatch")
## ci_level: 0.8 (80% intervals)
## outer_level: 0.95 (95% intervals)

stan_hist(fit,pars=paramnames)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

paramnames<-c("mu")
stan_hist(fit,pars=paramnames)+geom_vline(xintercept = 0)+
  labs(title="Overall interference effect (Target mismatch)")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Non-agreement

MatchNonAgrmt <- list(y = MatchNonAgrmt$Effect,
                 s = MatchNonAgrmt$SE,
                 n = dim(MatchNonAgrmt)[1])


fit <- stan(file='StanModels/rema2.stan', data=MatchNonAgrmt,
            iter=2000, chains=4, seed=987654321,
            control = list(adapt_delta = 0.99))

paramnames<-c("mu","theta")
print(fit,pars=paramnames)
## Inference for Stan model: rema2.
## 4 chains, each with iter=2000; warmup=1000; thin=1; 
## post-warmup draws per chain=1000, total post-warmup draws=4000.
## 
##            mean se_mean    sd   2.5%   25%   50%   75% 97.5% n_eff Rhat
## mu        13.29    0.19  6.37   2.84  9.05 12.59 16.75 28.23  1154    1
## theta[1]   2.08    0.13  8.40 -16.48 -3.28  2.86  8.11 16.56  4000    1
## theta[2]   5.64    0.13  8.40 -12.54  0.76  6.55 11.11 20.57  4000    1
## theta[3]   7.99    0.10  6.30  -5.26  4.04  8.16 12.09 20.38  4000    1
## theta[4]   9.36    0.11  6.96  -5.41  5.09  9.53 13.78 22.95  4000    1
## theta[5]   9.54    0.10  6.26  -3.13  5.41  9.61 13.69 22.05  4000    1
## theta[6]  12.78    0.20 12.69 -12.13  5.70 11.82 19.16 41.71  4000    1
## theta[7]  15.81    0.13  8.52   0.98  9.80 14.95 21.16 34.33  4000    1
## theta[8]  18.27    0.28 12.45  -1.59  9.67 15.91 25.45 47.70  1936    1
## theta[9]  18.82    0.29 12.85  -0.96  9.96 16.19 26.18 48.60  1967    1
## theta[10] 20.65    0.33 13.35   1.21 10.93 17.99 28.31 52.09  1592    1
## theta[11] 17.81    0.33 14.43  -4.98  8.60 15.12 24.72 53.50  1934    1
## theta[12] 20.59    0.35 14.65  -0.41 10.32 17.31 28.03 56.71  1782    1
## 
## Samples were drawn using NUTS(diag_e) at Thu Mar  2 12:58:16 2017.
## For each parameter, n_eff is a crude measure of effective sample size,
## and Rhat is the potential scale reduction factor on split chains (at 
## convergence, Rhat=1).
params<-extract(fit,pars=paramnames)

stan_plot(fit,pars=paramnames)+geom_vline(xintercept = 0)+
  labs(title="Interference studies (Van Dyke and colleagues)",size=20)
## ci_level: 0.8 (80% intervals)
## outer_level: 0.95 (95% intervals)