Skip to main content
4 of 5
deleted 60 characters in body
kjetil b halvorsen
  • 82.8k
  • 32
  • 201
  • 663

untrustworthy p values? emtrends following lmms with fixed effects of different levels of repetition

Edited to clarify further 23/04/24:

I have a fairly complex linear mixed effect model in R and I believe that there are issues to do with repeated data when running my post hoc tests. The model formula is as follows:

IFI_ALL <- 
lmer(IF_interact ~ cond_id*GoldMSI_MT*(HR + SC + ztime + IOS) +
       (1|case_id:group_id) +
       (1|stim_id) +
       (1|instrument) +
       (1|notasi),
     data= comb_df)

There are theoretical reasons why all should be in the same model, and my model fit is good. Within the dataset, the fixed effects have different levels of repetitions, whereby GoldMSI_MT has one value per participant, ztime and IOS repeat across the 3 cond_ids per participant, and HR and SC are longer time series physiological correlation data, with some missing values.

Here is an example of a portion of my dataset:

> head(comb_df[,c(1,3,5,10,17,18,19,20)])
 
A tibble: 6 × 8
  case_id ztime cond_id IF_interact IOS[,1] section    HR    SC
  <fct>   <dbl> <fct>         <dbl>   <dbl> <chr>   <dbl> <dbl>
1 1        2.59 Notated       0.837   0.533 1          NA 0.256
2 1        2.59 Notated       0.837   0.533 2          NA 0.539
3 1        2.59 Notated       0.837   0.533 3          NA 0.378
4 1        2.59 Notated       0.837   0.533 4          NA 0.148
5 1        2.59 Notated       0.837   0.533 5          NA 0.117
6 1        2.59 Notated       0.837   0.533 6          NA 0.449

I'm trying to run posthocs for the three-way interactions using emtrends.

etsSC_C <- 
    emtrends(IFI_ALL, ~ cond_id|GoldMSI_MT, 
    var =   "SC", cov.reduce=meanpm1sd, 
             infer = c(T,T,T), adjust= "BH")
  PH_SC_C<- as.data.frame(contrast(etsSC_C, "pairwise", adjust= "BH"))

GoldMSI_MT = -0.4693676:
 contrast               estimate   SE      df t.ratio p.value
 Improvised - Memorised     0.35 0.10 1391.79   3.540  0.0012
 Improvised - Notated       0.16 0.08 1387.30   2.030  0.0458
 Memorised - Notated       -0.19 0.09 1394.13  -2.000  0.0458

GoldMSI_MT =  0.3168349:
 contrast               estimate   SE      df t.ratio p.value
 Improvised - Memorised     0.04 0.07 1388.35   0.560  0.8617
 Improvised - Notated      -0.01 0.06 1386.51  -0.120  0.9075
 Memorised - Notated       -0.04 0.06 1389.47  -0.750  0.8617

GoldMSI_MT =  1.1030373:
 contrast               estimate   SE      df t.ratio p.value
 Improvised - Memorised    -0.28 0.09 1387.38  -3.150  0.0051
 Improvised - Notated      -0.18 0.08 1387.02  -2.180  0.0446
 Memorised - Notated        0.10 0.07 1387.65   1.470  0.1413

Results are averaged over the levels of: HR, SC, ztime, IOS 
Degrees-of-freedom method: kenward-roger 
P value adjustment: BH method for 3 tests 

I've realised that while the contrasts for SC and HR effects are perfectly fine, the p-values when I'm running contrasts for ztime and IOS are likely to be unreliable/inflated due to the amount of duplicated rows:

etsIOS_C <- emtrends(IFI_ALL, ~ cond_id|GoldMSI_MT, var = "IOS", 
    cov.reduce=meanpm1sd, infer = c(T,T,T), adjust= "BH")
PH_IOS_C<-as.data.frame(contrast(etsIOS_C, "pairwise", adjust= "BH"))
        
        GoldMSI_MT = -0.4693676:
         contrast               estimate   SE      df t.ratio p.value
         Improvised - Memorised     0.89 0.05 1399.71  16.770  <.0001
         Improvised - Notated       0.41 0.05 1419.48   7.930  <.0001
         Memorised - Notated       -0.48 0.05 1409.22  -9.010  <.0001
        
        GoldMSI_MT =  0.3168349:
         contrast               estimate   SE      df t.ratio p.value
         Improvised - Memorised     0.37 0.04 1417.97   9.010  <.0001
         Improvised - Notated       0.03 0.03 1413.51   0.890  0.3723
         Memorised - Notated       -0.35 0.03 1413.39 -11.520  <.0001
        
        GoldMSI_MT =  1.1030373:
         contrast               estimate   SE      df t.ratio p.value
         Improvised - Memorised    -0.14 0.07 1413.82  -1.920  0.0546
         Improvised - Notated      -0.36 0.05 1414.21  -6.610  <.0001
         Memorised - Notated       -0.22 0.04 1411.25  -4.890  <.0001
    
        Results are averaged over the levels of: HR, SC, ztime, IOS 
        Degrees-of-freedom method: kenward-roger 
        P value adjustment: BH method for 3 tests
The degrees of freedom are reflecting the number of observations of the HR and SC data, not the IOS data which should be around 90.

I know this may have to do with the interactions in the original model. Are all of my assumptions here correct, and is there a solution, without using distinct() and running separate models? I've thought about looking into ref_grid and adding further arguments to cov.reduce but nothing seems to work.