d <- read_csv("ds.csv")
## Parsed with column specification:
## cols(
##   x6c_16_1 = col_double(),
##   x6c_6_2 = col_double(),
##   x7c_12_2 = col_double(),
##   x7c_8_3 = col_double(),
##   x8b_6_2 = col_double(),
##   flag = col_double()
## )
m3 <- read_rds("m3.rds")
m4 <- read_rds("m4.rds")

1 Three Class Solution Output anad Plot

m3
## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $x6c_6_2
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.2358 0.4437 0.1458 0.1747
## class 2:  0.3341 0.4539 0.1524 0.0595
## class 3:  0.3267 0.3028 0.1412 0.2292
## 
## $x6c_16_1
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0719 0.5651 0.1620 0.2009
## class 2:  0.2822 0.3992 0.1778 0.1408
## class 3:  0.5822 0.0000 0.0000 0.4178
## 
## $x7c_8_3
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0000 0.4903 0.0936 0.4161
## class 2:  0.3899 0.5450 0.0651 0.0000
## class 3:  0.4180 0.0000 0.2122 0.3698
## 
## $x7c_12_2
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0000 0.4743 0.0578 0.4679
## class 2:  0.8117 0.0920 0.0000 0.0963
## class 3:  0.4449 0.0458 0.0488 0.4604
## 
## Estimated class population shares 
##  0.4186 0.348 0.2334 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.4429 0.3014 0.2557 
##  
## ========================================================= 
## Fit for 3 latent classes: 
## ========================================================= 
## number of observations: 219 
## number of fully observed cases: 85 
## number of estimated parameters: 38 
## residual degrees of freedom: 181 
## maximum log-likelihood: -867.7372 
##  
## AIC(3): 1811.474
## BIC(3): 1940.259
## G^2(3): 161.4266 (Likelihood ratio/deviance statistic) 
## X^2(3): 276.4603 (Chi-square goodness of fit) 
## 
broom::tidy(m3) %>% 
    mutate(class_name = rep(str_c(1:3, " (n = ", as.vector(table(m3$predclass)), ")"), 16)) %>% 
    mutate(variable = factor(variable, levels =  c("x6c_6_2", "x6c_16_1", "x7c_8_3", "x7c_12_2", "x8b_6_2"))) %>% 
    #mutate(class_name = rep(c("Lots of change without a clear pattern", "Steady growth", "Already sophisticated and less simple"), 20)) %>% 
    ggplot(aes(x = variable, y = estimate, color = as.factor(outcome), group = outcome)) +
    facet_wrap(~ class_name) +
    geom_point() +
    geom_line() +
    theme_bw() +
    ylab("Probability") +
    xlab(NULL) +
    theme(text = element_text(size = 15)) +
    ylim(0, 1) +
    scale_color_discrete("") +
    theme(axis.text.x=element_text(angle = 90, hjust = 0))

2 Four Class Solution Output and Plot

m4
## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $x6c_6_2
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.3921 0.3530 0.0000 0.2549
## class 2:  0.4483 0.0000 0.1752 0.3766
## class 3:  0.0000 0.6659 0.3341 0.0000
## class 4:  0.4014 0.4350 0.1002 0.0634
## 
## $x6c_16_1
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0887 0.6107 0.0435 0.2571
## class 2:  0.3770 0.0000 0.0000 0.6230
## class 3:  0.3358 0.3834 0.2808 0.0000
## class 4:  0.3218 0.3331 0.1573 0.1878
## 
## $x7c_8_3
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0000 0.5459 0.1146 0.3394
## class 2:  0.3533 0.0000 0.2342 0.4124
## class 3:  0.2412 0.3517 0.0543 0.3528
## class 4:  0.4120 0.4938 0.0942 0.0000
## 
## $x7c_12_2
##            Pr(1)  Pr(2)  Pr(3)  Pr(4)
## class 1:  0.0000 0.6563 0.0306 0.3131
## class 2:  0.3286 0.0000 0.0820 0.5893
## class 3:  0.2150 0.1653 0.0522 0.5674
## class 4:  1.0000 0.0000 0.0000 0.0000
## 
## Estimated class population shares 
##  0.2991 0.1592 0.2657 0.2761 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.2603 0.1735 0.2511 0.3151 
##  
## ========================================================= 
## Fit for 4 latent classes: 
## ========================================================= 
## number of observations: 219 
## number of fully observed cases: 85 
## number of estimated parameters: 51 
## residual degrees of freedom: 168 
## maximum log-likelihood: -862.0112 
##  
## AIC(4): 1826.022
## BIC(4): 1998.865
## G^2(4): 154.1867 (Likelihood ratio/deviance statistic) 
## X^2(4): 260.5505 (Chi-square goodness of fit) 
## 
broom::tidy(m4) %>% 
    mutate(class_name = rep(str_c(1:4, " (n = ", as.vector(table(m4$predclass)), ")"), 16)) %>% 
    mutate(variable = factor(variable, levels =  c("x6c_6_2", "x6c_16_1", "x7c_8_3", "x7c_12_2", "x8b_6_2"))) %>% 
    #mutate(class_name = rep(c("Lots of change without a clear pattern", "Steady growth", "Already sophisticated and less simple"), 20)) %>% 
    ggplot(aes(x = variable, y = estimate, color = as.factor(outcome), group = outcome)) +
    facet_wrap(~ class_name) +
    geom_point() +
    geom_line() +
    theme_bw() +
    ylab("Probability") +
    xlab(NULL) +
    theme(text = element_text(size = 15)) +
    ylim(0, 1) +
    scale_color_discrete("") +
    theme(axis.text.x=element_text(angle = 90, hjust = 0))

post_probs <- m3$posterior %>% as.data.frame() %>% setNames(paste0("C", 1:3, "_prob"))
df <- bind_cols(d, post_probs)
df$class <- m3$predclass
df3 <- df %>% mutate_if(is.numeric, round, 3)
post_probs <- m4$posterior %>% as.data.frame() %>% setNames(paste0("C", 1:4, "_prob"))
df <- bind_cols(d, post_probs)
df$class <- m4$predclass
df4 <- df %>% mutate_if(is.numeric, round, 3)

3 Entropy

A number taking a minumum value of 0 (representing complete concentration of probability on one cell) and a maximum value equal to the logarithm of the total number of cells in the fitted cross-classfication table (representing complete dispersion, or equal probability for outcomes across every cell).

poLCA.entropy(m3)
## [1] 4.905256
poLCA.entropy(m4)
## [1] 4.834834

4 Mean classification probabilities

4.1 3 class solution

By class

mat <- df3 %>% dplyr::select(C1_prob:C3_prob, class)
mat %>% group_by(class) %>% summarize_all(funs(mean)) %>% dplyr::select(-class) %>% as.matrix() %>% diag()
## Warning: funs() is soft deprecated as of dplyr 0.8.0
## please use list() instead
## 
## # Before:
## funs(name = f(.)
## 
## # After: 
## list(name = ~f(.))
## This warning is displayed once per session.
## [1] 0.8584536 0.8954091 0.7340893

Overall

mat %>% group_by(class) %>% summarize_all(funs(mean)) %>% dplyr::select(-class) %>% as.matrix() %>% diag() %>% mean()
## [1] 0.8293173

4.2 4 class solution

By class

mat <- df4 %>% dplyr::select(C1_prob:C4_prob, class)
mat %>% group_by(class) %>% summarize_all(funs(mean)) %>% dplyr::select(-class) %>% as.matrix() %>% diag()
## [1] 0.8789825 0.7264737 0.7325273 0.8079130

Overall

mat %>% group_by(class) %>% summarize_all(funs(mean)) %>% dplyr::select(-class) %>% as.matrix() %>% diag() %>% mean()
## [1] 0.7864741

5 Are certain codes more likely across classes?

5.1 3-class solution

codes_in_class(df3, 1)
## For code: 1
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  28.66   9.554   56.97 <2e-16 ***
## Residuals        701 117.56   0.168                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr         upr     p adj
## 2-1  0.23427210  0.10944017  0.35910403 0.0000098
## 3-1  0.06576006 -0.04557934  0.17709946 0.4254022
## 4-1  0.48135156  0.37678596  0.58591717 0.0000000
## 3-2 -0.16851204 -0.29430840 -0.04271568 0.0033266
## 4-2  0.24707946  0.12723695  0.36692197 0.0000009
## 4-3  0.41559150  0.30987642  0.52130659 0.0000000
codes_in_class(df3, 2)
## For code: 2
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  29.53   9.843   52.58 <2e-16 ***
## Residuals        701 131.23   0.187                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff        lwr         upr     p adj
## 2-1 -0.63387978 -0.7657705 -0.50198911 0.0000000
## 3-1 -0.28160705 -0.3992422 -0.16397186 0.0000000
## 4-1 -0.32820293 -0.4386813 -0.21772456 0.0000000
## 3-2  0.35227273  0.2193631  0.48518236 0.0000000
## 4-2  0.30567686  0.1790577  0.43229598 0.0000000
## 4-3 -0.04659587 -0.1582887  0.06509698 0.7053378
codes_in_class(df3, 3)
## For code: 3
##                   Df Sum Sq Mean Sq F value  Pr(>F)   
## as.factor(class)   3   1.45  0.4849   5.379 0.00115 **
## Residuals        701  63.19  0.0901                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr          upr     p adj
## 2-1  0.07047779 -0.02104435  0.161999937 0.1953301
## 3-1  0.12127422  0.03964429  0.202904141 0.0008164
## 4-1  0.03378910 -0.04287452  0.110452732 0.6679698
## 3-2  0.05079643 -0.04143281  0.143025657 0.4882533
## 4-2 -0.03668869 -0.12455278  0.051175403 0.7047388
## 4-3 -0.08748511 -0.16499150 -0.009978729 0.0196665
codes_in_class(df3, 4)
## For code: 4
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  22.03   7.345   46.38 <2e-16 ***
## Residuals        701 111.02   0.158                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr         upr     p adj
## 2-1  0.32912989  0.20781838  0.45044140 0.0000000
## 3-1  0.09457278 -0.01362671  0.20277226 0.1108171
## 4-1 -0.18693774 -0.28855446 -0.08532102 0.0000156
## 3-2 -0.23455711 -0.35680585 -0.11230837 0.0000058
## 4-2 -0.51606763 -0.63253043 -0.39960483 0.0000000
## 4-3 -0.28151052 -0.38424431 -0.17877674 0.0000000

5.2 4-class solution

codes_in_class(df4, 1)
## For code: 1
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  28.66   9.554   56.97 <2e-16 ***
## Residuals        701 117.56   0.168                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr         upr     p adj
## 2-1  0.23427210  0.10944017  0.35910403 0.0000098
## 3-1  0.06576006 -0.04557934  0.17709946 0.4254022
## 4-1  0.48135156  0.37678596  0.58591717 0.0000000
## 3-2 -0.16851204 -0.29430840 -0.04271568 0.0033266
## 4-2  0.24707946  0.12723695  0.36692197 0.0000009
## 4-3  0.41559150  0.30987642  0.52130659 0.0000000
codes_in_class(df4, 2)
## For code: 2
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  29.53   9.843   52.58 <2e-16 ***
## Residuals        701 131.23   0.187                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff        lwr         upr     p adj
## 2-1 -0.63387978 -0.7657705 -0.50198911 0.0000000
## 3-1 -0.28160705 -0.3992422 -0.16397186 0.0000000
## 4-1 -0.32820293 -0.4386813 -0.21772456 0.0000000
## 3-2  0.35227273  0.2193631  0.48518236 0.0000000
## 4-2  0.30567686  0.1790577  0.43229598 0.0000000
## 4-3 -0.04659587 -0.1582887  0.06509698 0.7053378
codes_in_class(df4, 3)
## For code: 3
##                   Df Sum Sq Mean Sq F value  Pr(>F)   
## as.factor(class)   3   1.45  0.4849   5.379 0.00115 **
## Residuals        701  63.19  0.0901                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr          upr     p adj
## 2-1  0.07047779 -0.02104435  0.161999937 0.1953301
## 3-1  0.12127422  0.03964429  0.202904141 0.0008164
## 4-1  0.03378910 -0.04287452  0.110452732 0.6679698
## 3-2  0.05079643 -0.04143281  0.143025657 0.4882533
## 4-2 -0.03668869 -0.12455278  0.051175403 0.7047388
## 4-3 -0.08748511 -0.16499150 -0.009978729 0.0196665
codes_in_class(df4, 4)
## For code: 4
##                   Df Sum Sq Mean Sq F value Pr(>F)    
## as.factor(class)   3  22.03   7.345   46.38 <2e-16 ***
## Residuals        701 111.02   0.158                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 171 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ as.factor(class), data = dfa)
## 
## $`as.factor(class)`
##            diff         lwr         upr     p adj
## 2-1  0.32912989  0.20781838  0.45044140 0.0000000
## 3-1  0.09457278 -0.01362671  0.20277226 0.1108171
## 4-1 -0.18693774 -0.28855446 -0.08532102 0.0000156
## 3-2 -0.23455711 -0.35680585 -0.11230837 0.0000058
## 4-2 -0.51606763 -0.63253043 -0.39960483 0.0000000
## 4-3 -0.28151052 -0.38424431 -0.17877674 0.0000000
  • Code 1 is more likely in class 4 than class 3, 2, and 1
  • Code 1 is more liely in classes 3 and 2 than in class 1, though Code 1 does not differ between classes 3 and 2

6 Are certain codes in one class more likely at a specific timepoint?

6.1 For 3-class solution

codes_at_time(df3, my_code = 1, my_class = 1)
## Code is: 1; Class is: 1
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  3.554  1.1846   20.75 1.38e-11 ***
## Residuals   179 10.217  0.0571                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff        lwr         upr     p adj
## x6c_6_2-x6c_16_1   3.319357e-01  0.1854450  0.47842639 0.0000001
## x7c_12_2-x6c_16_1 -7.547170e-02 -0.1964033  0.04545992 0.3708549
## x7c_8_3-x6c_16_1  -7.547170e-02 -0.1970003  0.04605690 0.3753090
## x7c_12_2-x6c_6_2  -4.074074e-01 -0.5543727 -0.26044210 0.0000000
## x7c_8_3-x6c_6_2   -4.074074e-01 -0.5548643 -0.25995049 0.0000000
## x7c_8_3-x7c_12_2   1.804112e-16 -0.1221003  0.12210029 1.0000000
codes_at_time(df3, my_code = 2, my_class = 1)
## Code is: 2; Class is: 1
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   4.46  1.4877   7.007 0.000176 ***
## Residuals   179  38.01  0.2123                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.38294899 -0.66549321 -0.10040476 0.0031028
## x7c_12_2-x6c_16_1  0.10921626 -0.12403087  0.34246338 0.6185921
## x7c_8_3-x6c_16_1  -0.07140215 -0.30580069  0.16299640 0.8589371
## x7c_12_2-x6c_6_2   0.49216524  0.20870559  0.77562490 0.0000708
## x7c_8_3-x6c_6_2    0.31154684  0.02713898  0.59595470 0.0256346
## x7c_8_3-x7c_12_2  -0.18061840 -0.41611960  0.05488279 0.1959932
codes_at_time(df3, my_code = 3, my_class = 1)
## Code is: 3; Class is: 1
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  0.359  0.1197   2.613 0.0528 .
## Residuals   179  8.198  0.0458                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr       upr     p adj
## x6c_6_2-x6c_16_1  -0.01886792 -0.15009358 0.1123577 0.9822613
## x7c_12_2-x6c_16_1  0.01959361 -0.08873635 0.1279236 0.9657465
## x7c_8_3-x6c_16_1   0.09877913 -0.01008560 0.2076439 0.0901543
## x7c_12_2-x6c_6_2   0.03846154 -0.09318928 0.1701124 0.8732897
## x7c_8_3-x6c_6_2    0.11764706 -0.01444414 0.2497383 0.0996263
## x7c_8_3-x7c_12_2   0.07918552 -0.03019133 0.1885624 0.2414135
codes_at_time(df3, my_code = 4, my_class = 1)
## Code is: 4; Class is: 1
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3   0.38  0.1281   0.705   0.55
## Residuals   179  32.51  0.1816               
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.06988120 -0.1914413 0.3312037 0.8994773
## x7c_12_2-x6c_16_1 -0.05333817 -0.2690662 0.1623899 0.9184883
## x7c_8_3-x6c_16_1   0.04809471 -0.1686983 0.2648877 0.9393508
## x7c_12_2-x6c_6_2  -0.12321937 -0.3853885 0.1389498 0.6157051
## x7c_8_3-x6c_6_2   -0.02178649 -0.2848326 0.2412596 0.9964882
## x7c_8_3-x7c_12_2   0.10143288 -0.1163799 0.3192457 0.6227862
codes_at_time(df3, my_code = 1, my_class = 2)
## Code is: 1; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3  0.483  0.1608   0.732  0.535
## Residuals   113 24.817  0.2196               
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                           diff        lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.184873950 -0.1763933 0.5461412 0.5430766
## x7c_12_2-x6c_16_1 -0.004464286 -0.3033559 0.2944274 0.9999787
## x7c_8_3-x6c_16_1   0.017316017 -0.2792005 0.3138325 0.9987345
## x7c_12_2-x6c_6_2  -0.189338235 -0.5560999 0.1774235 0.5356716
## x7c_8_3-x6c_6_2   -0.167557932 -0.5323866 0.1972707 0.6295981
## x7c_8_3-x7c_12_2   0.021780303 -0.2814064 0.3249670 0.9976550
codes_at_time(df3, my_code = 2, my_class = 2)
## Code is: 2; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3      0       0               
## Residuals   113      0       0               
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                   diff lwr upr p adj
## x6c_6_2-x6c_16_1     0   0   0   NaN
## x7c_12_2-x6c_16_1    0   0   0   NaN
## x7c_8_3-x6c_16_1     0   0   0   NaN
## x7c_12_2-x6c_6_2     0   0   0   NaN
## x7c_8_3-x6c_6_2      0   0   0   NaN
## x7c_8_3-x7c_12_2     0   0   0   NaN
codes_at_time(df3, my_code = 3, my_class = 2)
## Code is: 3; Class is: 2
##              Df Sum Sq Mean Sq F value  Pr(>F)   
## time          3  1.296  0.4320   4.426 0.00557 **
## Residuals   113 11.029  0.0976                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.11764706 -0.12319024 0.3584844 0.5814285
## x7c_12_2-x6c_16_1  0.09375000 -0.10550487 0.2930049 0.6111315
## x7c_8_3-x6c_16_1   0.27272727  0.07505579 0.4703988 0.0026565
## x7c_12_2-x6c_6_2  -0.02389706 -0.26839722 0.2206031 0.9941615
## x7c_8_3-x6c_6_2    0.15508021 -0.08813130 0.3982917 0.3482201
## x7c_8_3-x7c_12_2   0.17897727 -0.02314086 0.3810954 0.1020097
codes_at_time(df3, my_code = 4, my_class = 2)
## Code is: 4; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  1.948  0.6494   2.736 0.0469 *
## Residuals   113 26.821  0.2374                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1  -0.30252101 -0.6780953 0.07305325 0.1592288
## x7c_12_2-x6c_16_1 -0.08928571 -0.4000142 0.22144273 0.8767905
## x7c_8_3-x6c_16_1  -0.29004329 -0.5983025 0.01821594 0.0730337
## x7c_12_2-x6c_6_2   0.21323529 -0.1680510 0.59452161 0.4660503
## x7c_8_3-x6c_6_2    0.01247772 -0.3667990 0.39175445 0.9997724
## x7c_8_3-x7c_12_2  -0.20075758 -0.5159511 0.11443599 0.3492034
codes_at_time(df3, my_code = 1, my_class = 3)
## Code is: 1; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  2.521  0.8404   7.361 0.000114 ***
## Residuals   172 19.638  0.1142                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.31914894 -0.51650951 -0.12178836 0.0002531
## x7c_12_2-x6c_16_1 -0.25792445 -0.43690050 -0.07894839 0.0014251
## x7c_8_3-x6c_16_1  -0.14523589 -0.32704679  0.03657501 0.1663117
## x7c_12_2-x6c_6_2   0.06122449 -0.13443812  0.25688710 0.8488380
## x7c_8_3-x6c_6_2    0.17391304 -0.02434595  0.37217204 0.1077603
## x7c_8_3-x7c_12_2   0.11268855 -0.06727772  0.29265483 0.3676139
codes_at_time(df3, my_code = 2, my_class = 3)
## Code is: 2; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   5.76   1.919   9.597 6.82e-06 ***
## Residuals   172  34.40   0.200                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1   0.31476846  0.05355277  0.57598415 0.0110867
## x7c_12_2-x6c_16_1 -0.21884498 -0.45572792  0.01803795 0.0814988
## x7c_8_3-x6c_16_1  -0.03561517 -0.27625015  0.20501981 0.9806883
## x7c_12_2-x6c_6_2  -0.53361345 -0.79258179 -0.27464510 0.0000017
## x7c_8_3-x6c_6_2   -0.35038363 -0.61278842 -0.08797885 0.0037191
## x7c_8_3-x7c_12_2   0.18322981 -0.05496373  0.42142335 0.1936192
codes_at_time(df3, my_code = 3, my_class = 3)
## Code is: 3; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  3.401  1.1337   9.076 1.31e-05 ***
## Residuals   172 21.485  0.1249                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                           diff        lwr         upr     p adj
## x6c_6_2-x6c_16_1   0.004380476 -0.2020555  0.21081645 0.9999399
## x7c_12_2-x6c_16_1 -0.278332610 -0.4655387 -0.09112655 0.0009244
## x7c_8_3-x6c_16_1  -0.275670675 -0.4658419 -0.08549942 0.0013162
## x7c_12_2-x6c_6_2  -0.282713085 -0.4873730 -0.07805317 0.0024678
## x7c_8_3-x6c_6_2   -0.280051151 -0.4874269 -0.07267545 0.0032538
## x7c_8_3-x7c_12_2   0.002661934 -0.1855799  0.19090375 0.9999822
codes_at_time(df3, my_code = 4, my_class = 3)
## Code is: 4; Class is: 3
##              Df Sum Sq Mean Sq F value Pr(>F)    
## time          3  18.41   6.137   51.56 <2e-16 ***
## Residuals   172  20.47   0.119                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1   3.436967e-16 -0.2015201  0.2015201 1.0000000
## x7c_12_2-x6c_16_1  7.551020e-01  0.5723540  0.9378501 0.0000000
## x7c_8_3-x6c_16_1   4.565217e-01  0.2708791  0.6421644 0.0000000
## x7c_12_2-x6c_6_2   7.551020e-01  0.5553157  0.9548884 0.0000000
## x7c_8_3-x6c_6_2    4.565217e-01  0.2540843  0.6589592 0.0000001
## x7c_8_3-x7c_12_2  -2.985803e-01 -0.4823395 -0.1148211 0.0002337
codes_at_time(df3, my_code = 1, my_class = 4)
## Code is: 1; Class is: 4
##              Df Sum Sq Mean Sq F value Pr(>F)    
## time          3  16.42   5.472   30.85 <2e-16 ***
## Residuals   225  39.92   0.177                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1   0.01713287 -0.1956947  0.2299604 0.9967933
## x7c_12_2-x6c_16_1  0.63076923  0.4372398  0.8242986 0.0000000
## x7c_8_3-x6c_16_1   0.07904509 -0.1178702  0.2759604 0.7267135
## x7c_12_2-x6c_6_2   0.61363636  0.3987403  0.8285324 0.0000000
## x7c_8_3-x6c_6_2    0.06191223 -0.1560380  0.2798625 0.8828050
## x7c_8_3-x7c_12_2  -0.55172414 -0.7508733 -0.3525750 0.0000000
codes_at_time(df3, my_code = 2, my_class = 4)
## Code is: 2; Class is: 4
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   8.66  2.8856   16.25 1.35e-09 ***
## Residuals   225  39.95  0.1775                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr        upr     p adj
## x6c_6_2-x6c_16_1   0.11608392 -0.09682518  0.3289930 0.4936405
## x7c_12_2-x6c_16_1 -0.33846154 -0.53206509 -0.1448580 0.0000576
## x7c_8_3-x6c_16_1   0.14429708 -0.05269368  0.3412878 0.2326809
## x7c_12_2-x6c_6_2  -0.45454545 -0.66952381 -0.2395671 0.0000007
## x7c_8_3-x6c_6_2    0.02821317 -0.18982059  0.2462469 0.9870231
## x7c_8_3-x7c_12_2   0.48275862  0.28353320  0.6819840 0.0000000
codes_at_time(df3, my_code = 3, my_class = 4)
## Code is: 3; Class is: 4
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  0.806 0.26870   3.638 0.0136 *
## Residuals   225 16.617 0.07386                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.04020979 -0.17753238  0.09711280 0.8732034
## x7c_12_2-x6c_16_1 -0.15384615 -0.27871701 -0.02897530 0.0087994
## x7c_8_3-x6c_16_1  -0.08488064 -0.21193619  0.04217491 0.3109941
## x7c_12_2-x6c_6_2  -0.11363636 -0.25229359  0.02502086 0.1494847
## x7c_8_3-x6c_6_2   -0.04467085 -0.18529875  0.09595706 0.8439287
## x7c_8_3-x7c_12_2   0.06896552 -0.05953135  0.19746238 0.5074316
codes_at_time(df3, my_code = 4, my_class = 4)
## Code is: 4; Class is: 4
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  0.809 0.26956   6.277 0.000415 ***
## Residuals   225  9.663 0.04295                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -9.300699e-02 -0.19772317  0.01170919 0.1013262
## x7c_12_2-x6c_16_1 -1.384615e-01 -0.23368257 -0.04324050 0.0012160
## x7c_8_3-x6c_16_1  -1.384615e-01 -0.23534852 -0.04157455 0.0015418
## x7c_12_2-x6c_6_2  -4.545455e-02 -0.15118846  0.06027937 0.6820855
## x7c_8_3-x6c_6_2   -4.545455e-02 -0.15269121  0.06178212 0.6916646
## x7c_8_3-x7c_12_2  -1.804112e-16 -0.09798607  0.09798607 1.0000000

6.2 For 4-class solution

codes_at_time(df4, my_code = 1, my_class = 1)
## Code is: 1; Class is: 1
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  3.554  1.1846   20.75 1.38e-11 ***
## Residuals   179 10.217  0.0571                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff        lwr         upr     p adj
## x6c_6_2-x6c_16_1   3.319357e-01  0.1854450  0.47842639 0.0000001
## x7c_12_2-x6c_16_1 -7.547170e-02 -0.1964033  0.04545992 0.3708549
## x7c_8_3-x6c_16_1  -7.547170e-02 -0.1970003  0.04605690 0.3753090
## x7c_12_2-x6c_6_2  -4.074074e-01 -0.5543727 -0.26044210 0.0000000
## x7c_8_3-x6c_6_2   -4.074074e-01 -0.5548643 -0.25995049 0.0000000
## x7c_8_3-x7c_12_2   1.804112e-16 -0.1221003  0.12210029 1.0000000
codes_at_time(df4, my_code = 2, my_class = 1)
## Code is: 2; Class is: 1
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   4.46  1.4877   7.007 0.000176 ***
## Residuals   179  38.01  0.2123                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.38294899 -0.66549321 -0.10040476 0.0031028
## x7c_12_2-x6c_16_1  0.10921626 -0.12403087  0.34246338 0.6185921
## x7c_8_3-x6c_16_1  -0.07140215 -0.30580069  0.16299640 0.8589371
## x7c_12_2-x6c_6_2   0.49216524  0.20870559  0.77562490 0.0000708
## x7c_8_3-x6c_6_2    0.31154684  0.02713898  0.59595470 0.0256346
## x7c_8_3-x7c_12_2  -0.18061840 -0.41611960  0.05488279 0.1959932
codes_at_time(df4, my_code = 3, my_class = 1)
## Code is: 3; Class is: 1
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  0.359  0.1197   2.613 0.0528 .
## Residuals   179  8.198  0.0458                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr       upr     p adj
## x6c_6_2-x6c_16_1  -0.01886792 -0.15009358 0.1123577 0.9822613
## x7c_12_2-x6c_16_1  0.01959361 -0.08873635 0.1279236 0.9657465
## x7c_8_3-x6c_16_1   0.09877913 -0.01008560 0.2076439 0.0901543
## x7c_12_2-x6c_6_2   0.03846154 -0.09318928 0.1701124 0.8732897
## x7c_8_3-x6c_6_2    0.11764706 -0.01444414 0.2497383 0.0996263
## x7c_8_3-x7c_12_2   0.07918552 -0.03019133 0.1885624 0.2414135
codes_at_time(df4, my_code = 4, my_class = 1)
## Code is: 4; Class is: 1
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3   0.38  0.1281   0.705   0.55
## Residuals   179  32.51  0.1816               
## 45 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.06988120 -0.1914413 0.3312037 0.8994773
## x7c_12_2-x6c_16_1 -0.05333817 -0.2690662 0.1623899 0.9184883
## x7c_8_3-x6c_16_1   0.04809471 -0.1686983 0.2648877 0.9393508
## x7c_12_2-x6c_6_2  -0.12321937 -0.3853885 0.1389498 0.6157051
## x7c_8_3-x6c_6_2   -0.02178649 -0.2848326 0.2412596 0.9964882
## x7c_8_3-x7c_12_2   0.10143288 -0.1163799 0.3192457 0.6227862
codes_at_time(df4, my_code = 1, my_class = 2)
## Code is: 1; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3  0.483  0.1608   0.732  0.535
## Residuals   113 24.817  0.2196               
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                           diff        lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.184873950 -0.1763933 0.5461412 0.5430766
## x7c_12_2-x6c_16_1 -0.004464286 -0.3033559 0.2944274 0.9999787
## x7c_8_3-x6c_16_1   0.017316017 -0.2792005 0.3138325 0.9987345
## x7c_12_2-x6c_6_2  -0.189338235 -0.5560999 0.1774235 0.5356716
## x7c_8_3-x6c_6_2   -0.167557932 -0.5323866 0.1972707 0.6295981
## x7c_8_3-x7c_12_2   0.021780303 -0.2814064 0.3249670 0.9976550
codes_at_time(df4, my_code = 2, my_class = 2)
## Code is: 2; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)
## time          3      0       0               
## Residuals   113      0       0               
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                   diff lwr upr p adj
## x6c_6_2-x6c_16_1     0   0   0   NaN
## x7c_12_2-x6c_16_1    0   0   0   NaN
## x7c_8_3-x6c_16_1     0   0   0   NaN
## x7c_12_2-x6c_6_2     0   0   0   NaN
## x7c_8_3-x6c_6_2      0   0   0   NaN
## x7c_8_3-x7c_12_2     0   0   0   NaN
codes_at_time(df4, my_code = 3, my_class = 2)
## Code is: 3; Class is: 2
##              Df Sum Sq Mean Sq F value  Pr(>F)   
## time          3  1.296  0.4320   4.426 0.00557 **
## Residuals   113 11.029  0.0976                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr       upr     p adj
## x6c_6_2-x6c_16_1   0.11764706 -0.12319024 0.3584844 0.5814285
## x7c_12_2-x6c_16_1  0.09375000 -0.10550487 0.2930049 0.6111315
## x7c_8_3-x6c_16_1   0.27272727  0.07505579 0.4703988 0.0026565
## x7c_12_2-x6c_6_2  -0.02389706 -0.26839722 0.2206031 0.9941615
## x7c_8_3-x6c_6_2    0.15508021 -0.08813130 0.3982917 0.3482201
## x7c_8_3-x7c_12_2   0.17897727 -0.02314086 0.3810954 0.1020097
codes_at_time(df4, my_code = 4, my_class = 2)
## Code is: 4; Class is: 2
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  1.948  0.6494   2.736 0.0469 *
## Residuals   113 26.821  0.2374                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 35 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1  -0.30252101 -0.6780953 0.07305325 0.1592288
## x7c_12_2-x6c_16_1 -0.08928571 -0.4000142 0.22144273 0.8767905
## x7c_8_3-x6c_16_1  -0.29004329 -0.5983025 0.01821594 0.0730337
## x7c_12_2-x6c_6_2   0.21323529 -0.1680510 0.59452161 0.4660503
## x7c_8_3-x6c_6_2    0.01247772 -0.3667990 0.39175445 0.9997724
## x7c_8_3-x7c_12_2  -0.20075758 -0.5159511 0.11443599 0.3492034
codes_at_time(df4, my_code = 1, my_class = 3)
## Code is: 1; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  2.521  0.8404   7.361 0.000114 ***
## Residuals   172 19.638  0.1142                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.31914894 -0.51650951 -0.12178836 0.0002531
## x7c_12_2-x6c_16_1 -0.25792445 -0.43690050 -0.07894839 0.0014251
## x7c_8_3-x6c_16_1  -0.14523589 -0.32704679  0.03657501 0.1663117
## x7c_12_2-x6c_6_2   0.06122449 -0.13443812  0.25688710 0.8488380
## x7c_8_3-x6c_6_2    0.17391304 -0.02434595  0.37217204 0.1077603
## x7c_8_3-x7c_12_2   0.11268855 -0.06727772  0.29265483 0.3676139
codes_at_time(df4, my_code = 2, my_class = 3)
## Code is: 2; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   5.76   1.919   9.597 6.82e-06 ***
## Residuals   172  34.40   0.200                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1   0.31476846  0.05355277  0.57598415 0.0110867
## x7c_12_2-x6c_16_1 -0.21884498 -0.45572792  0.01803795 0.0814988
## x7c_8_3-x6c_16_1  -0.03561517 -0.27625015  0.20501981 0.9806883
## x7c_12_2-x6c_6_2  -0.53361345 -0.79258179 -0.27464510 0.0000017
## x7c_8_3-x6c_6_2   -0.35038363 -0.61278842 -0.08797885 0.0037191
## x7c_8_3-x7c_12_2   0.18322981 -0.05496373  0.42142335 0.1936192
codes_at_time(df4, my_code = 3, my_class = 3)
## Code is: 3; Class is: 3
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  3.401  1.1337   9.076 1.31e-05 ***
## Residuals   172 21.485  0.1249                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                           diff        lwr         upr     p adj
## x6c_6_2-x6c_16_1   0.004380476 -0.2020555  0.21081645 0.9999399
## x7c_12_2-x6c_16_1 -0.278332610 -0.4655387 -0.09112655 0.0009244
## x7c_8_3-x6c_16_1  -0.275670675 -0.4658419 -0.08549942 0.0013162
## x7c_12_2-x6c_6_2  -0.282713085 -0.4873730 -0.07805317 0.0024678
## x7c_8_3-x6c_6_2   -0.280051151 -0.4874269 -0.07267545 0.0032538
## x7c_8_3-x7c_12_2   0.002661934 -0.1855799  0.19090375 0.9999822
codes_at_time(df4, my_code = 4, my_class = 3)
## Code is: 4; Class is: 3
##              Df Sum Sq Mean Sq F value Pr(>F)    
## time          3  18.41   6.137   51.56 <2e-16 ***
## Residuals   172  20.47   0.119                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 44 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1   3.436967e-16 -0.2015201  0.2015201 1.0000000
## x7c_12_2-x6c_16_1  7.551020e-01  0.5723540  0.9378501 0.0000000
## x7c_8_3-x6c_16_1   4.565217e-01  0.2708791  0.6421644 0.0000000
## x7c_12_2-x6c_6_2   7.551020e-01  0.5553157  0.9548884 0.0000000
## x7c_8_3-x6c_6_2    4.565217e-01  0.2540843  0.6589592 0.0000001
## x7c_8_3-x7c_12_2  -2.985803e-01 -0.4823395 -0.1148211 0.0002337
codes_at_time(df4, my_code = 1, my_class = 4)
## Code is: 1; Class is: 4
##              Df Sum Sq Mean Sq F value Pr(>F)    
## time          3  16.42   5.472   30.85 <2e-16 ***
## Residuals   225  39.92   0.177                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff        lwr        upr     p adj
## x6c_6_2-x6c_16_1   0.01713287 -0.1956947  0.2299604 0.9967933
## x7c_12_2-x6c_16_1  0.63076923  0.4372398  0.8242986 0.0000000
## x7c_8_3-x6c_16_1   0.07904509 -0.1178702  0.2759604 0.7267135
## x7c_12_2-x6c_6_2   0.61363636  0.3987403  0.8285324 0.0000000
## x7c_8_3-x6c_6_2    0.06191223 -0.1560380  0.2798625 0.8828050
## x7c_8_3-x7c_12_2  -0.55172414 -0.7508733 -0.3525750 0.0000000
codes_at_time(df4, my_code = 2, my_class = 4)
## Code is: 2; Class is: 4
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3   8.66  2.8856   16.25 1.35e-09 ***
## Residuals   225  39.95  0.1775                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr        upr     p adj
## x6c_6_2-x6c_16_1   0.11608392 -0.09682518  0.3289930 0.4936405
## x7c_12_2-x6c_16_1 -0.33846154 -0.53206509 -0.1448580 0.0000576
## x7c_8_3-x6c_16_1   0.14429708 -0.05269368  0.3412878 0.2326809
## x7c_12_2-x6c_6_2  -0.45454545 -0.66952381 -0.2395671 0.0000007
## x7c_8_3-x6c_6_2    0.02821317 -0.18982059  0.2462469 0.9870231
## x7c_8_3-x7c_12_2   0.48275862  0.28353320  0.6819840 0.0000000
codes_at_time(df4, my_code = 3, my_class = 4)
## Code is: 3; Class is: 4
##              Df Sum Sq Mean Sq F value Pr(>F)  
## time          3  0.806 0.26870   3.638 0.0136 *
## Residuals   225 16.617 0.07386                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                          diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -0.04020979 -0.17753238  0.09711280 0.8732034
## x7c_12_2-x6c_16_1 -0.15384615 -0.27871701 -0.02897530 0.0087994
## x7c_8_3-x6c_16_1  -0.08488064 -0.21193619  0.04217491 0.3109941
## x7c_12_2-x6c_6_2  -0.11363636 -0.25229359  0.02502086 0.1494847
## x7c_8_3-x6c_6_2   -0.04467085 -0.18529875  0.09595706 0.8439287
## x7c_8_3-x7c_12_2   0.06896552 -0.05953135  0.19746238 0.5074316
codes_at_time(df4, my_code = 4, my_class = 4)
## Code is: 4; Class is: 4
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## time          3  0.809 0.26956   6.277 0.000415 ***
## Residuals   225  9.663 0.04295                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 47 observations deleted due to missingness
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = `1` ~ time, data = dfa_class1)
## 
## $time
##                            diff         lwr         upr     p adj
## x6c_6_2-x6c_16_1  -9.300699e-02 -0.19772317  0.01170919 0.1013262
## x7c_12_2-x6c_16_1 -1.384615e-01 -0.23368257 -0.04324050 0.0012160
## x7c_8_3-x6c_16_1  -1.384615e-01 -0.23534852 -0.04157455 0.0015418
## x7c_12_2-x6c_6_2  -4.545455e-02 -0.15118846  0.06027937 0.6820855
## x7c_8_3-x6c_6_2   -4.545455e-02 -0.15269121  0.06178212 0.6916646
## x7c_8_3-x7c_12_2  -1.804112e-16 -0.09798607  0.09798607 1.0000000

7 Homogeneity and Separation

When latent class c is highly homogeneous, members of are likely to provide the same observed response pattern, implying that one response pattern is characteristic of the class. If homogeneity is low, no single response pattern stands out.

When latent class separation is good, the pattern of item-response probabiltiies across indicator variables clearly differentiates among the latent classes. When there is high separation, a response pattern that enmerges as characteristic of a particular latent class will be characteristic of that class only (and will not be characteristic of any of the other latent classes).

7.1 3 class solution

df3 %>% 
    dplyr::select(-class) %>% 
    gather(class, prob, C1_prob, C2_prob, C3_prob) %>% 
    mutate_if(is.integer, replace_na, 0) %>% 
    unite(response_pattern, x6c_6_2, x6c_16_1, x7c_8_3, x7c_12_2, sep = "-") %>% 
    group_by(class, response_pattern) %>% 
    summarize(mean_post_prob = mean(prob),
              n = n()) %>% 
    ungroup() %>% 
    spread(class, mean_post_prob) %>% 
    mutate_if(is.double, round, 3) %>% 
    arrange(desc(n)) %>% 
    print(n = 20)
## # A tibble: 143 x 5
##    response_pattern     n C1_prob C2_prob C3_prob
##    <chr>            <int>   <dbl>   <dbl>   <dbl>
##  1 NA-2-2-2             8   0.888   0.112   0    
##  2 NA-2-4-2             5   1       0       0    
##  3 NA-2-4-4             5   1       0       0    
##  4 NA-4-4-4             5   0.497   0       0.503
##  5 2-2-1-1              4   0       1       0    
##  6 2-2-2-4              4   0.879   0.121   0    
##  7 NA-2-2-1             4   0       1       0    
##  8 2-2-2-1              3   0       1       0    
##  9 2-2-2-2              3   0.885   0.115   0    
## 10 NA-1-1-1             3   0       0.551   0.449
## 11 NA-1-1-4             3   0       0.124   0.876
## 12 NA-1-2-1             3   0       1       0    
## 13 NA-1-4-4             3   0.202   0       0.798
## 14 NA-1-NA-1            3   0       0.569   0.431
## 15 NA-2-2-4             3   0.882   0.118   0    
## 16 NA-3-4-4             3   1       0       0    
## 17 1-1-1-4              2   0       0.126   0.874
## 18 1-2-4-2              2   1       0       0    
## 19 1-4-2-1              2   0       1       0    
## 20 1-4-2-2              2   0.849   0.151   0    
## # … with 123 more rows

7.2 4 class solution

df4 %>% 
    dplyr::select(-class) %>% 
    gather(class, prob, C1_prob, C2_prob, C3_prob, C4_prob) %>% 
    mutate_if(is.integer, replace_na, 0) %>% 
    unite(response_pattern, x6c_6_2,  x6c_16_1,  x7c_8_3, x7c_12_2, sep = "-") %>% 
    mutate(n_NA = str_count(response_pattern, "NA")) %>% 
    filter(n_NA <= 2) %>% 
    group_by(class, response_pattern) %>% 
    summarize(mean_post_prob = mean(prob),
              n = n()) %>% 
    ungroup() %>% 
    spread(class, mean_post_prob) %>% 
    mutate_if(is.double, round, 3) %>% 
    arrange(desc(n)) %>% 
    print(n = 20)
## # A tibble: 143 x 6
##    response_pattern     n C1_prob C2_prob C3_prob C4_prob
##    <chr>            <int>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 NA-2-2-2             8   0.917   0       0.083   0    
##  2 NA-2-4-2             5   0.873   0       0.127   0    
##  3 NA-2-4-4             5   0.488   0       0.512   0    
##  4 NA-4-4-4             5   0.253   0.747   0       0    
##  5 2-2-1-1              4   0       0       0.176   0.824
##  6 2-2-2-4              4   0.449   0       0.551   0    
##  7 NA-2-2-1             4   0       0       0.145   0.855
##  8 2-2-2-1              3   0       0       0.206   0.794
##  9 2-2-2-2              3   0.854   0       0.146   0    
## 10 NA-1-1-1             3   0       0.145   0.096   0.759
## 11 NA-1-1-4             3   0       0.506   0.494   0    
## 12 NA-1-2-1             3   0       0       0.133   0.867
## 13 NA-1-4-4             3   0.08    0.414   0.506   0    
## 14 NA-1-NA-1            3   0       0.154   0.15    0.695
## 15 NA-2-2-4             3   0.606   0       0.394   0    
## 16 NA-3-4-4             3   0.085   0       0.915   0    
## 17 1-1-1-4              2   0       1       0       0    
## 18 1-2-4-2              2   1       0       0       0    
## 19 1-4-2-1              2   0       0       0       1    
## 20 1-4-2-2              2   1       0       0       0    
## # … with 123 more rows