library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.2     v purrr   0.3.4
v tibble  3.0.3     v dplyr   1.0.2
v tidyr   1.1.1     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x tidyr::expand() masks Matrix::expand()
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
x tidyr::pack()   masks Matrix::pack()
x tidyr::unpack() masks Matrix::unpack()
library(lme4)
library(dplyr)
glimpse(STAR_wide)
Rows: 1,471
Columns: 11
$ stdntid    <dbl> 10023, 10042, 10056, 10082, 10097, 10103, 10111, ...
$ race       <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, ...
$ gender     <dbl+lbl> 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, ...
$ ac_mot     <dbl> 50, 50, 52, 49, 51, 50, 51, 57, 40, 48, 53, 28, 5...
$ ever_lunch <dbl+lbl> 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, ...
$ science3   <dbl> 632, 618, 618, 649, 577, 655, 662, 627, 573, 627,...
$ science4   <dbl> 756, 710, 719, 722, 688, 719, 767, 709, 668, 694,...
$ science5   <dbl> 729, 738, 760, 729, 681, 738, 749, 754, 586, 731,...
$ science6   <dbl> 762, 740, 776, 753, 720, 710, 782, 755, 687, 750,...
$ science7   <dbl> 778, 734, 782, 809, 698, 766, 763, 729, 634, 744,...
$ science8   <dbl> 783, 771, 772, 806, 745, 774, 804, 793, 765, 769,...
STAR.long <- STAR_wide %>%
  pivot_longer(.,
              cols = starts_with("science"),
              names_to = "year",
              values_to = "science",
              names_prefix = "science"
              )
glimpse(STAR.long)
Rows: 8,826
Columns: 7
$ stdntid    <dbl> 10023, 10023, 10023, 10023, 10023, 10023, 10042, ...
$ race       <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ gender     <dbl+lbl> 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, ...
$ ac_mot     <dbl> 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5...
$ ever_lunch <dbl+lbl> 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, ...
$ year       <chr> "3", "4", "5", "6", "7", "8", "3", "4", "5", "6",...
$ science    <dbl> 632, 756, 729, 762, 778, 783, 618, 710, 738, 740,...
STAR.long.clean <- STAR.long %>%
  mutate(.,
         year  = as.numeric(year),
         grade_0 = year - 3,
         grade_sq = grade_0^2,
         grade_cube = grade_0^3)
glimpse(STAR.long.clean)
Rows: 8,826
Columns: 10
$ stdntid    <dbl> 10023, 10023, 10023, 10023, 10023, 10023, 10042, ...
$ race       <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ gender     <dbl+lbl> 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, ...
$ ac_mot     <dbl> 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 5...
$ ever_lunch <dbl+lbl> 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, ...
$ year       <dbl> 3, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7...
$ science    <dbl> 632, 756, 729, 762, 778, 783, 618, 710, 738, 740,...
$ grade_0    <dbl> 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4...
$ grade_sq   <dbl> 0, 1, 4, 9, 16, 25, 0, 1, 4, 9, 16, 25, 0, 1, 4, ...
$ grade_cube <dbl> 0, 1, 8, 27, 64, 125, 0, 1, 8, 27, 64, 125, 0, 1,...
model.null.growth <- lmer(science ~ grade_0 + (1|stdntid), REML=FALSE, data = STAR.long.clean)
summary(model.null.growth)
Linear mixed model fit by maximum likelihood . t-tests use
  Satterthwaite's method [lmerModLmerTest]
Formula: science ~ grade_0 + (1 | stdntid)
   Data: STAR.long.clean

     AIC      BIC   logLik deviance df.resid 
 90959.4  90987.7 -45475.7  90951.4     8822 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0254 -0.6361  0.0105  0.6367  4.0226 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1072     32.74   
 Residual             1300     36.05   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)  669.3920     1.0916 2652.5068   613.2   <2e-16 ***
grade_0       24.2729     0.2247 7355.0000   108.0   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
        (Intr)
grade_0 -0.515
model.square <- lmer(science ~ grade_0 + grade_sq + (1|stdntid), REML=FALSE, data = STAR.long.clean)
summary(model.square)
Linear mixed model fit by maximum likelihood . t-tests use
  Satterthwaite's method [lmerModLmerTest]
Formula: science ~ grade_0 + grade_sq + (1 | stdntid)
   Data: STAR.long.clean

     AIC      BIC   logLik deviance df.resid 
 88570.1  88605.5 -44280.0  88560.1     8821 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.6568 -0.5429 -0.0099  0.5539  4.5442 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1132.3   33.65   
 Residual              938.9   30.64   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)  646.2231     1.1376 3069.3181  568.08   <2e-16 ***
grade_0       59.0262     0.6811 7354.9999   86.66   <2e-16 ***
grade_sq      -6.9507     0.1308 7354.9999  -53.16   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
         (Intr) grad_0
grade_0  -0.485       
grade_sq  0.383 -0.960
model.both <- lmer(science ~ grade_0 + grade_sq + grade_cube + (1|stdntid), REML=FALSE, data = STAR.long.clean)
summary(model.both)
Linear mixed model fit by maximum likelihood . t-tests use
  Satterthwaite's method [lmerModLmerTest]
Formula: science ~ grade_0 + grade_sq + grade_cube + (1 | stdntid)
   Data: STAR.long.clean

     AIC      BIC   logLik deviance df.resid 
 87223.4  87265.9 -43605.7  87211.4     8820 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2663 -0.4985  0.0027  0.5236  4.4394 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1158.5   34.04   
 Residual              781.6   27.96   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)  635.77161    1.13923 3084.84335  558.07   <2e-16 ***
grade_0      106.75456    1.38750 7355.00518   76.94   <2e-16 ***
grade_sq     -33.07934    0.68954 7355.00521  -47.97   <2e-16 ***
grade_cube     3.48382    0.09055 7355.00481   38.47   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
           (Intr) grad_0 grd_sq
grade_0    -0.411              
grade_sq    0.295 -0.955       
grade_cube -0.238  0.894 -0.985
model.both.random <- lmer(science ~ grade_0 + grade_sq + grade_cube + (grade_0|stdntid), REML=FALSE, data = STAR.long.clean)
boundary (singular) fit: see ?isSingular
summary(model.both.random)
Linear mixed model fit by maximum likelihood . t-tests use
  Satterthwaite's method [lmerModLmerTest]
Formula: science ~ grade_0 + grade_sq + grade_cube + (grade_0 | stdntid)
   Data: STAR.long.clean

     AIC      BIC   logLik deviance df.resid 
 87223.8  87280.5 -43603.9  87207.8     8818 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2775 -0.4967  0.0019  0.5228  4.4707 

Random effects:
 Groups   Name        Variance  Std.Dev. Corr
 stdntid  (Intercept) 1100.2324 33.1698      
          grade_0        0.1208  0.3475  1.00
 Residual              781.1644 27.9493      
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)  635.77161    1.12157 2221.90567  566.86   <2e-16 ***
grade_0      106.75456    1.38715 7355.64725   76.96   <2e-16 ***
grade_sq     -33.07934    0.68935 7355.00321  -47.99   <2e-16 ***
grade_cube     3.48382    0.09053 7355.00314   38.48   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
           (Intr) grad_0 grd_sq
grade_0    -0.413              
grade_sq    0.300 -0.955       
grade_cube -0.242  0.894 -0.985
convergence code: 0
boundary (singular) fit: see ?isSingular
library(nlme)

Attaching package: 㤼㸱nlme㤼㸲

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    collapse

The following object is masked from 㤼㸱package:lme4㤼㸲:

    lmList
model.null.growth.homog <- lme(science ~ grade_0, 
                         random = ~ 1|stdntid, 
                         data = STAR.long.clean,
                         method = "ML")
summary(model.null.growth.homog)
Linear mixed-effects model fit by maximum likelihood
 Data: STAR.long.clean 

Random effects:
 Formula: ~1 | stdntid
        (Intercept) Residual
StdDev:    32.74456 36.05019

Fixed effects: science ~ grade_0 
 Correlation: 
        (Intr)
grade_0 -0.515

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-4.02535175 -0.63612595  0.01049814  0.63666093  4.02256978 

Number of Observations: 8826
Number of Groups: 1471 
model.null.growth.het <- lme(science ~ grade_0, 
                             random =  ~ 1|stdntid, 
                             data = STAR.long.clean, 
                             method = "ML", 
                             weights = varIdent(form = ~ 1 | grade_0)
)
summary(model.null.growth.het)
Linear mixed-effects model fit by maximum likelihood
 Data: STAR.long.clean 

Random effects:
 Formula: ~1 | stdntid
        (Intercept) Residual
StdDev:    34.32642 67.40924

Variance function:
 Structure: Different standard deviations per stratum
 Formula: ~1 | grade_0 
 Parameter estimates:
        0         1         2         3         4         5 
1.0000000 0.4987552 0.4549923 0.4852018 0.3421510 0.3497103 
Fixed effects: science ~ grade_0 
 Correlation: 
        (Intr)
grade_0 -0.593

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-4.91503937 -0.71613675 -0.05974243  0.51662541  4.30180514 

Number of Observations: 8826
Number of Groups: 1471 
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQogDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQpgYGB7cn0NCmdsaW1wc2UoU1RBUl93aWRlKQ0KYGBgDQoNCmBgYHtyfQ0KU1RBUi5sb25nIDwtIFNUQVJfd2lkZSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgIGNvbHMgPSBzdGFydHNfd2l0aCgic2NpZW5jZSIpLA0KICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNjaWVuY2UiLA0KICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAic2NpZW5jZSINCiAgICAgICAgICAgICAgKQ0KYGBgDQpgYGB7cn0NCmdsaW1wc2UoU1RBUi5sb25nKQ0KYGBgDQpgYGB7cn0NClNUQVIubG9uZy5jbGVhbiA8LSBTVEFSLmxvbmcgJT4lDQogIG11dGF0ZSguLA0KICAgICAgICAgeWVhciAgPSBhcy5udW1lcmljKHllYXIpLA0KICAgICAgICAgZ3JhZGVfMCA9IHllYXIgLSAzLA0KICAgICAgICAgZ3JhZGVfc3EgPSBncmFkZV8wXjIsDQogICAgICAgICBncmFkZV9jdWJlID0gZ3JhZGVfMF4zKQ0KZ2xpbXBzZShTVEFSLmxvbmcuY2xlYW4pDQpgYGANCmBgYHtyfQ0KbW9kZWwubnVsbC5ncm93dGggPC0gbG1lcihzY2llbmNlIH4gZ3JhZGVfMCArICgxfHN0ZG50aWQpLCBSRU1MPUZBTFNFLCBkYXRhID0gU1RBUi5sb25nLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC5udWxsLmdyb3d0aCkNCmBgYA0KYGBge3J9DQptb2RlbC5zcXVhcmUgPC0gbG1lcihzY2llbmNlIH4gZ3JhZGVfMCArIGdyYWRlX3NxICsgKDF8c3RkbnRpZCksIFJFTUw9RkFMU0UsIGRhdGEgPSBTVEFSLmxvbmcuY2xlYW4pDQpzdW1tYXJ5KG1vZGVsLnNxdWFyZSkNCmBgYA0KYGBge3J9DQptb2RlbC5ib3RoIDwtIGxtZXIoc2NpZW5jZSB+IGdyYWRlXzAgKyBncmFkZV9zcSArIGdyYWRlX2N1YmUgKyAoMXxzdGRudGlkKSwgUkVNTD1GQUxTRSwgZGF0YSA9IFNUQVIubG9uZy5jbGVhbikNCnN1bW1hcnkobW9kZWwuYm90aCkNCmBgYA0KYGBge3J9DQptb2RlbC5ib3RoLnJhbmRvbSA8LSBsbWVyKHNjaWVuY2UgfiBncmFkZV8wICsgZ3JhZGVfc3EgKyBncmFkZV9jdWJlICsgKGdyYWRlXzB8c3RkbnRpZCksIFJFTUw9RkFMU0UsIGRhdGEgPSBTVEFSLmxvbmcuY2xlYW4pDQpzdW1tYXJ5KG1vZGVsLmJvdGgucmFuZG9tKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkobmxtZSkNCmBgYA0KYGBge3J9DQptb2RlbC5udWxsLmdyb3d0aC5ob21vZyA8LSBsbWUoc2NpZW5jZSB+IGdyYWRlXzAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gMXxzdGRudGlkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gU1RBUi5sb25nLmNsZWFuLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIpDQpzdW1tYXJ5KG1vZGVsLm51bGwuZ3Jvd3RoLmhvbW9nKQ0KYGBgDQpgYGB7cn0NCm1vZGVsLm51bGwuZ3Jvd3RoLmhldCA8LSBsbWUoc2NpZW5jZSB+IGdyYWRlXzAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSAgfiAxfHN0ZG50aWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gU1RBUi5sb25nLmNsZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB2YXJJZGVudChmb3JtID0gfiAxIHwgZ3JhZGVfMCkNCikNCnN1bW1hcnkobW9kZWwubnVsbC5ncm93dGguaGV0KQ0KYGBgDQoNCg==