knitr::opts_chunk$set(message = FALSE, warning = FALSE)

Set up

Libraries.

library(tidyverse)
library(here)
library(lme4)
library(lsr)
library(ggplot2)
library(viridis)
library(readxl)
library(sjstats)
library(reshape2)
library(coin)
library(ggbeeswarm)
library(praise)
library(langcog)
library(ggpubr)
library(ggthemes)
library(gganimate)
library(lmerTest)
library(janitor)

Read in data.

hs = read_csv("hs_f21_ex1_2x2.csv")
ms = read_csv("ms_f21_ex1_2x2.csv")

Demographics

High School

Age of participants

hs_age = hs %>%
  mutate(age = as.numeric(substr(sr_age,1,2)))

age = hs_age %>%
  summarise(n = n(),
            mean_age = mean(age),
            sd_age = sd(age),
            min_age = min(age),
            max_age = max(age))

age
## # A tibble: 1 x 5
##       n mean_age sd_age min_age max_age
##   <int>    <dbl>  <dbl>   <dbl>   <dbl>
## 1   425     15.7   1.23      11      19
ggplot(hs_age, aes(x=age, col=age)) +
  geom_histogram() +
  theme_few() +
  scale_x_discrete("Age", limits=c(11:19))

# why is there an 11 year old in high school?

Gender

table(hs$sr_gender)
## 
##            Female          Femenino              Male         Masculino 
##               208                 6               183                10 
##             Other Prefer not to say 
##                 9                 3

Grade

table(hs$sr_grade)
## 
## 10.º grado 10th grade 11.º grado 11th grade 12.º grado 12th grade  8.º grado 
##          4        115          7        106          4         94          1 
##  9.º grado  9th grade 
##          1         93

Middle School

Age of participants

ms_age = ms %>%
  mutate(age = as.numeric(substr(sr_age,1,2)))

age = ms_age %>%
  summarise(n = n(),
            mean_age = mean(age),
            sd_age = sd(age),
            min_age = min(age),
            max_age = max(age))

age
## # A tibble: 1 x 5
##       n mean_age sd_age min_age max_age
##   <int>    <dbl>  <dbl>   <dbl>   <dbl>
## 1   288     12.3  0.913      10      15
ggplot(ms_age, aes(x=age, col=age)) +
  geom_histogram() +
  theme_few() +
  scale_x_discrete("Age", limits=c(10:15))

Gender

table(ms$sr_gender)
## 
##            Female          Femenino              Male         Masculino 
##               115                12               123                 7 
##             Other Prefer not to say 
##                14                 9

Grade

table(ms$sr_grade)
## 
## 6.º grado 6th grade 7.º grado 7th grade 8.º grado 8th grade 
##         1        81        15        93         3        95

Clean

High School

Seek.

hs_seek = hs %>%
  select(response_id, fc_seek_c_test_1:fc_seek_c_test_4,fc_seek_p_test_1:fc_seek_p_test_4) %>%
  gather(question, response, fc_seek_c_test_1:fc_seek_c_test_4,fc_seek_p_test_1:fc_seek_p_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person = factor(substr(question, 16,16)),
         person = factor(person, levels=c(1,2,4,3), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question, 9,9)),
         group = "test - seek")

hs_seek_table = hs_seek %>%
  group_by(person) %>%
  summarize(n=n(),
            mean= mean(response_num))

hs_seek_knowledge = hs_seek %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

Listen.

hs_list_p = hs %>%
  select(response_id, fc_listen_p_test_1:fc_listen_p_test_4) %>%
    gather(question, response, fc_listen_p_test_1:fc_listen_p_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all motivated","Slightly motivated","Somewhat motivated", "Very motivated", "Extremely motivated")),
         response_num = as.numeric(response_lab))

hs_list_c = hs %>%
  select(response_id, fc_listen_c_test_1:fc_listen_c_test_4) %>%
    gather(question, response, fc_listen_c_test_1:fc_listen_c_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab))

hs_list = hs_list_p %>%
  full_join(hs_list_c) %>%
  mutate(person = factor(substr(question, 18,18)),
           person = factor(person, levels=c(1,2,3,4), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question,11,11)),
         group = "test - listen")

hs_list_table = hs_list %>%
  group_by(person) %>%
  summarize(n=n(),
            mean= mean(response_num))

hs_list_knowledge = hs_list %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

Control.

hs_control_seek = hs %>%
  select(response_id, fc_seek_c_control_1:fc_seek_c_control_4) %>%
  gather(question, response, fc_seek_c_control_1:fc_seek_c_control_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person_num = factor(substr(question, 19,19)),
         person = factor(person_num, levels=c(1,2,4,3), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question, 9,9)))
  
hs_control_seek_knowledge = hs_control_seek %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

hs_control_listen = hs %>%
  select(response_id, fc_listen_p_control_1:fc_listen_p_control_4) %>%
  gather(question, response, fc_listen_p_control_1:fc_listen_p_control_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all motivated","Slightly motivated","Somewhat motivated", "Very motivated", "Extremely motivated")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person_num = factor(substr(question, 21,21)),
         person = factor(person_num, levels=c(1,2,4,3), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question,11,11)))
  
hs_control_listen_knowledge = hs_control_listen %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

hs_control = full_join(hs_control_listen_knowledge, hs_control_seek_knowledge) %>%
  mutate(group = "control")

Middle School

Seek.

ms_seek = ms %>%
  select(response_id, fc_seek_c_test_1:fc_seek_c_test_4,fc_seek_p_test_1:fc_seek_p_test_4) %>%
  gather(question, response, fc_seek_c_test_1:fc_seek_c_test_4,fc_seek_p_test_1:fc_seek_p_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person = factor(substr(question, 16,16)),
         person = factor(person, levels=c(1,2,4,3), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question, 9,9)),
         group = "test - seek")

ms_seek_table = ms_seek %>%
  group_by(person) %>%
  summarize(n=n(),
            mean= mean(response_num))

ms_seek_knowledge = ms_seek %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

Listen.

ms_list_p = ms %>%
  select(response_id, fc_listen_p_test_1:fc_listen_p_test_4) %>%
    gather(question, response, fc_listen_p_test_1:fc_listen_p_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all motivated","Slightly motivated","Somewhat motivated", "Very motivated", "Extremely motivated")),
         response_num = as.numeric(response_lab))

ms_list_c = ms %>%
  select(response_id, fc_listen_c_test_1:fc_listen_c_test_4) %>%
    gather(question, response, fc_listen_c_test_1:fc_listen_c_test_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab))

ms_list = ms_list_p %>%
  full_join(hs_list_c) %>%
  mutate(person = factor(substr(question, 18,18)),
           person = factor(person, levels=c(1,2,3,4), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question,11,11)),
         group = "test - listen")

ms_list_table = ms_list %>%
  group_by(person) %>%
  summarize(n=n(),
            mean= mean(response_num))

ms_list_knowledge = ms_list %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

Control.

ms_control_seek = ms %>%
  select(response_id, fc_seek_c_control_1:fc_seek_c_control_4) %>%
  gather(question, response, fc_seek_c_control_1:fc_seek_c_control_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all likely","Slightly likely","Somewhat likely", "Very likely", "Extremely likely")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person_num = factor(substr(question, 19,19)),
         person = factor(person_num, levels=c(1,2,3,4), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question, 9,9)))
  
ms_control_seek_knowledge = ms_control_seek %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

ms_control_listen = ms %>%
  select(response_id, fc_listen_p_control_1:fc_listen_p_control_4) %>%
  gather(question, response, fc_listen_p_control_1:fc_listen_p_control_4) %>%
  mutate(response_lab = factor(response, levels=c("Not at all motivated","Slightly motivated","Somewhat motivated", "Very motivated", "Extremely motivated")),
         response_num = as.numeric(response_lab)) %>%
  mutate(person_num = factor(substr(question, 21,21)),
         person = factor(person_num, levels=c(1,2,4,3), labels=c("knows both", "knows abilities, does not know class", "does not know abilities, knows class", "knows neither")),
         type = factor(substr(question,11,11)))
  
ms_control_listen_knowledge = ms_control_listen %>%
  mutate(knowledge_abilities = ifelse(person == "knows both" | 
                                   person == "knows abilities, does not know class", 1, 0),
         knowledge_class = ifelse(person == "knows both" | 
                                    person == "does not know abilities, knows class", 1, 0))

ms_control = full_join(ms_control_listen_knowledge, ms_control_seek_knowledge) %>%
  mutate(group = "control")

Plot

High School

hs_all = hs_control %>%
  full_join(hs_list) %>%
  full_join(hs_seek)

hs_all_table = hs_all %>%
  group_by(group, person) %>%
  multi_boot_standard("response_num")

ggplot(hs_all_table, aes(x=person, y=mean, color=person)) +
 geom_pointrange(aes(ymin = ci_lower, ymax = ci_upper), 
                  position = position_dodge(width = .1),size=.5, alpha=.5) +
  theme_few() +
  ylim(1,5) +
  facet_grid(~ group) +
  theme(axis.text.x=element_text(angle=90, vjust = 0.5, hjust=1)) +
  ggtitle("HIGH SCHOOL 2X2s")

Middle School

ms_all = ms_control %>%
  full_join(ms_list) %>%
  full_join(ms_seek)

ms_all_table = ms_all %>%
  group_by(group, person) %>%
  multi_boot_standard("response_num")

ggplot(ms_all_table, aes(x=person, y=mean, color=person)) +
 geom_pointrange(aes(ymin = ci_lower, ymax = ci_upper), 
                  position = position_dodge(width = .1),size=.5, alpha=.5) +
  theme_few() +
  ylim(1,5) +
  facet_grid(~ group) +
  theme(axis.text.x=element_text(angle=90, vjust = 0.5, hjust=1)) +
  ggtitle("MIDDLE SCHOOL 2X2s")

Analyze

High School

Seek.

# interactive - maximal random effects
#hs_seek_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities|response_id) + (1+knowledge_class*knowledge_abilities|type), data=hs_seek_knowledge)

# remove correlations
#hs_seek_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=hs_seek_knowledge)

# remove interaction term random effects
#hs_seek_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=hs_seek_knowledge)

# remove knowledge abilities slope in type random effecgts
#hs_seek_interaction_4 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class||type), data=hs_seek_knowledge)

#hs_seek_interaction_5 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1|type), data=hs_seek_knowledge)

hs_seek_interaction_6 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id), data=hs_seek_knowledge)

# Analysis that runs! 
summary(hs_seek_interaction_6)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_class +  
##     knowledge_abilities || response_id)
##    Data: hs_seek_knowledge
## 
## REML criterion at convergence: 9625.4
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.8883 -0.5628 -0.0151  0.5369  3.5708 
## 
## Random effects:
##  Groups        Name                Variance Std.Dev.
##  response_id   (Intercept)         0.4553   0.6748  
##  response_id.1 knowledge_class     0.4937   0.7026  
##  response_id.2 knowledge_abilities 0.2255   0.4748  
##  Residual                          0.6372   0.7983  
## Number of obs: 3400, groups:  response_id, 425
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         1.934e+00  4.267e-02 6.353e+02   45.32
## knowledge_abilities                 6.824e-01  4.505e-02 1.127e+03   15.14
## knowledge_class                     9.118e-01  5.158e-02 8.655e+02   17.68
## knowledge_abilities:knowledge_class 1.506e-01  5.476e-02 1.832e+03    2.75
##                                     Pr(>|t|)    
## (Intercept)                          < 2e-16 ***
## knowledge_abilities                  < 2e-16 ***
## knowledge_class                      < 2e-16 ***
## knowledge_abilities:knowledge_class  0.00602 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.390                  
## knwldg_clss -0.341  0.323           
## knwldg_bl:_  0.321 -0.608   -0.531

Listen.

# interactive - maximal random effects
#hs_list_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities|response_id) + (1+knowledge_class*knowledge_abilities|type), data=hs_list_knowledge)

# remove correlations
#hs_list_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=hs_list_knowledge)

# remove interaction terms in random effects
#hs_list_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=hs_list_knowledge)

# remove knowledge_class random slope for ID
hs_list_interaction_4 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=hs_list_knowledge)

# Analysis that runs! 
summary(hs_list_interaction_4)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_abilities ||  
##     response_id) + (1 + knowledge_class + knowledge_abilities ||      type)
##    Data: hs_list_knowledge
## 
## REML criterion at convergence: 9981.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.2149 -0.6545  0.0073  0.6102  3.5929 
## 
## Random effects:
##  Groups        Name                Variance Std.Dev.
##  response_id   (Intercept)         0.367134 0.6059  
##  response_id.1 knowledge_abilities 0.174360 0.4176  
##  type          (Intercept)         0.030861 0.1757  
##  type.1        knowledge_class     0.260663 0.5106  
##  type.2        knowledge_abilities 0.005976 0.0773  
##  Residual                          0.865218 0.9302  
## Number of obs: 3400, groups:  response_id, 425; type, 2
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         2.378e+00  1.316e-01 1.135e+00  18.071
## knowledge_abilities                 3.977e-01  7.372e-02 1.827e+00   5.394
## knowledge_class                     1.129e-01  3.638e-01 1.015e+00   0.310
## knowledge_abilities:knowledge_class 8.012e-01  6.381e-02 2.555e+03  12.556
##                                     Pr(>|t|)    
## (Intercept)                           0.0246 *  
## knowledge_abilities                   0.0396 *  
## knowledge_class                       0.8078    
## knowledge_abilities:knowledge_class   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.105                  
## knwldg_clss -0.021  0.038           
## knwldg_bl:_  0.121 -0.433   -0.088

Control.

# interactive - maximal random effects
#hs_control_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities|response_id) + (1+knowledge_class*knowledge_abilities|type), data=hs_control)

# remove correlations
#hs_control_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=hs_control)

# remove interaction terms in random effects
#hs_control_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=hs_control)

# remove knowledge_abilities random slope for type
hs_control_interaction_4 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_abilities||response_id) + (1+knowledge_class||type), data=hs_control)

# Analysis that runs! 
summary(hs_control_interaction_4)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_abilities ||  
##     response_id) + (1 + knowledge_class || type)
##    Data: hs_control
## 
## REML criterion at convergence: 9818.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.7264 -0.6064 -0.0224  0.5609  3.5498 
## 
## Random effects:
##  Groups        Name                Variance Std.Dev.
##  response_id   (Intercept)         0.554818 0.74486 
##  response_id.1 knowledge_abilities 0.216909 0.46574 
##  type          (Intercept)         0.006904 0.08309 
##  type.1        knowledge_class     0.001597 0.03996 
##  Residual                          0.774440 0.88002 
## Number of obs: 3400, groups:  response_id, 425; type, 2
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         1.999e+00  7.529e-02 1.912e+00  26.548
## knowledge_abilities                 5.259e-01  4.830e-02 1.212e+03  10.889
## knowledge_class                     4.976e-01  5.119e-02 2.135e+00   9.721
## knowledge_abilities:knowledge_class 1.577e-01  6.037e-02 2.591e+03   2.611
##                                     Pr(>|t|)    
## (Intercept)                          0.00179 ** 
## knowledge_abilities                  < 2e-16 ***
## knowledge_class                      0.00837 ** 
## knowledge_abilities:knowledge_class  0.00907 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.251                  
## knwldg_clss -0.236  0.369           
## knwldg_bl:_  0.200 -0.625   -0.590

Middle School

Seek.

# interactive - maximal random effects
#ms_seek_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities|response_id) + (1+knowledge_class*knowledge_abilities|type), data=ms_seek_knowledge)

# remove correlations
#ms_seek_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=ms_seek_knowledge)

# remove interaction terms in random effects
#ms_seek_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=ms_seek_knowledge)

# remove knowledge abilities random slope in type
#ms_seek_interaction_4 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class||type), data=ms_seek_knowledge)

# remove knowledge class random slope in type
ms_seek_interaction_5 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1|type), data=ms_seek_knowledge)

# model that runs!
summary(ms_seek_interaction_5)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_class +  
##     knowledge_abilities || response_id) + (1 | type)
##    Data: ms_seek_knowledge
## 
## REML criterion at convergence: 6660.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.5563 -0.5852 -0.0599  0.5891  3.3504 
## 
## Random effects:
##  Groups        Name                Variance  Std.Dev.
##  response_id   (Intercept)         4.216e-01 0.649294
##  response_id.1 knowledge_class     3.100e-01 0.556769
##  response_id.2 knowledge_abilities 1.887e-01 0.434379
##  type          (Intercept)         9.509e-05 0.009751
##  Residual                          7.307e-01 0.854809
## Number of obs: 2304, groups:  response_id, 288; type, 2
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         1.979e+00  5.273e-02 5.216e+01  37.537
## knowledge_abilities                 7.257e-01  5.650e-02 8.485e+02  12.844
## knowledge_class                     7.483e-01  6.011e-02 7.365e+02  12.448
## knowledge_abilities:knowledge_class 2.674e-01  7.123e-02 1.257e+03   3.753
##                                     Pr(>|t|)    
## (Intercept)                          < 2e-16 ***
## knowledge_abilities                  < 2e-16 ***
## knowledge_class                      < 2e-16 ***
## knowledge_abilities:knowledge_class 0.000183 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.426                  
## knwldg_clss -0.400  0.374           
## knwldg_bl:_  0.338 -0.630   -0.593

Listen.

# interactive - maximal random effects w/ removed correlations
#ms_list_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=ms_list_knowledge)

# remove interaction terms in random effects
#ms_list_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=ms_list_knowledge)

# remove knowledge class random slopes
ms_list_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_abilities||response_id) + (1+knowledge_class||type), data=ms_list_knowledge)

# Analysis that runs! 
summary(ms_list_interaction_3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_abilities ||  
##     response_id) + (1 + knowledge_class || type)
##    Data: ms_list_knowledge
## 
## REML criterion at convergence: 8593.3
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -3.09934 -0.62977 -0.01044  0.61877  3.12391 
## 
## Random effects:
##  Groups        Name                Variance Std.Dev.
##  response_id   (Intercept)         0.38901  0.6237  
##  response_id.1 knowledge_abilities 0.01133  0.1064  
##  type          (Intercept)         0.04246  0.2061  
##  type.1        knowledge_class     0.27738  0.5267  
##  Residual                          0.91903  0.9587  
## Number of obs: 2852, groups:  response_id, 713; type, 2
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         2.372e+00  1.520e-01 1.056e+00  15.606
## knowledge_abilities                 4.067e-01  5.093e-02 2.046e+03   7.986
## knowledge_class                     1.699e-01  3.759e-01 1.023e+00   0.452
## knowledge_abilities:knowledge_class 6.648e-01  7.180e-02 1.669e+03   9.258
##                                     Pr(>|t|)    
## (Intercept)                           0.0354 *  
## knowledge_abilities                  2.3e-15 ***
## knowledge_class                       0.7284    
## knowledge_abilities:knowledge_class  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.166                  
## knwldg_clss -0.023  0.067           
## knwldg_bl:_  0.118 -0.705   -0.096  
## convergence code: 0
## Model failed to converge with max|grad| = 0.00289783 (tol = 0.002, component 1)

Control.

# maximal model
#ms_control_interaction = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities|response_id) + (1+knowledge_class*knowledge_abilities|type), data=ms_control)

# remove correlations
#ms_control_interaction_2 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class*knowledge_abilities||response_id) + (1+knowledge_class*knowledge_abilities||type), data=ms_control)

# remove interaction terms in random effects
#ms_control_interaction_3 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1+knowledge_class+knowledge_abilities||type), data=ms_control)

# remove random slopes for type
ms_control_interaction_4 = lmer(response_num ~ knowledge_abilities * knowledge_class + (1+knowledge_class+knowledge_abilities||response_id) + (1|type), data=ms_control)

summary(ms_control_interaction_4)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## response_num ~ knowledge_abilities * knowledge_class + (1 + knowledge_class +  
##     knowledge_abilities || response_id) + (1 | type)
##    Data: ms_control
## 
## REML criterion at convergence: 6833.4
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -3.09034 -0.66980  0.01872  0.61935  2.89586 
## 
## Random effects:
##  Groups        Name                Variance Std.Dev.
##  response_id   (Intercept)         0.4196   0.6477  
##  response_id.1 knowledge_class     0.0000   0.0000  
##  response_id.2 knowledge_abilities 0.1949   0.4415  
##  type          (Intercept)         0.0000   0.0000  
##  Residual                          0.8804   0.9383  
## Number of obs: 2304, groups:  response_id, 288; type, 2
## 
## Fixed effects:
##                                      Estimate Std. Error        df t value
## (Intercept)                         2.335e+00  5.464e-02 6.352e+02  42.738
## knowledge_abilities                 3.247e-01  6.110e-02 9.217e+02   5.313
## knowledge_class                     1.736e-03  5.529e-02 1.744e+03   0.031
## knowledge_abilities:knowledge_class 7.726e-01  7.819e-02 1.744e+03   9.881
##                                     Pr(>|t|)    
## (Intercept)                          < 2e-16 ***
## knowledge_abilities                 1.35e-07 ***
## knowledge_class                        0.975    
## knowledge_abilities:knowledge_class  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) knwldg_b knwldg_c
## knwldg_blts -0.458                  
## knwldg_clss -0.506  0.452           
## knwldg_bl:_  0.358 -0.640   -0.707  
## convergence code: 0
## boundary (singular) fit: see ?isSingular