* Prevent "more" messages from appearing
set more off, permanently 
* Control line length
set linesize 150 
 
********************************************************************************
*******          BEGIN DATA MANIPULATION FOR CHAPTER 11b EXAMPLE         *******
*******               CHANGE "filesave" to your directory                *******
********************************************************************************
 
* Defining global variable for file location to be replaced in code below
global filesave "C:\Dropbox\PilesOfVariance\Chapter11b\STATA" 
 
* Import chapter 11b multivariate data
* Also make student mean variable
use "$filesave\STATA_Chapter11b.dta", clear 
egen smaggression  = rowmean(aggression_year0 aggression_year1 aggression_year2) 
label variable smaggression "smaggression: Student Mean Aggression" 
 
* Get class means for student and per-year variables
* Year 0
sort classid_year0 
egen cmgirl_year0 = mean(girl), by(classid_year0) 
egen cmaggression_year0 = mean(aggression_year0), by(classid_year0) 
label variable cmgirl_year0 "cmgirl_year0: % Girls in Class at Year 0" 
label variable cmaggression_year0 "cmaggression_year0: Class Mean Aggression at Year 0" 
* Year 1
sort classid_year1 
egen cmgirl_year1 = mean(girl), by(classid_year1) 
egen cmaggression_year1 = mean(aggression_year1), by(classid_year1) 
label variable cmgirl_year1 "cmgirl_year1: % Girls in Class at Year 1" 
label variable cmaggression_year1 "cmaggression_year1: Class Mean Aggression at Year 1" 
* Year 2
sort classid_year2 
egen cmgirl_year2 = mean(girl), by(classid_year2) 
egen cmaggression_year2 = mean(aggression_year2), by(classid_year2) 
label variable cmgirl_year2 "cmgirl_year2: % Girls in Class at Year 2" 
label variable cmaggression_year2 "cmaggression_year2: Class Mean Aggression at Year 2" 
 
* Make a copy of Class ID and grade per year variables
gen copyclassid_year0 = classid_year0 
gen copyclassid_year1 = classid_year1 
gen copyclassid_year2 = classid_year2 
gen copygrade_year0 = grade_year0 
gen copygrade_year1 = grade_year1 
gen copygrade_year2 = grade_year2 
* Stack multivariate data by year
* List time-varying variables first, i(level2ID) j(newtimeID)
reshape long copyclassid_year copygrade_year effort_year aggression_year ///
             cmgirl_year cmaggression_year, i(studentid) j(year) 
gen classid = copyclassid_year 
gen grade = copygrade_year 
gen effort = effort_year 
gen aggression = aggression_year 
gen cmgirl = cmgirl_year 
gen cmaggression = cmaggression_year 
drop copyclassid_year copygrade_year effort_year aggression_year cmgirl_year cmaggression_year 
label variable year "year: Year of Study (0-2)" 
label variable classid "classid: Class ID Variable" 
label variable grade "grade: Class Grade" 
label variable effort "effort: Teacher-Perceived Student Effort" 
label variable aggression "aggression: Teacher-Perceived Student Aggression" 
label variable cmgirl "cmgirl: Class Proportion of Girls" 
label variable cmaggression "cmaggression: Class Mean Student Aggression" 
 
* Create custom intercepts for time-varying group effects
* aclass = dummy codes for acute (non-transfer) effects of classrooms across time
* tclass = dummy codes for cumulative (transfer) effects of classrooms across time
gen aclass0=0 
gen aclass1=0 
gen aclass2=0 
gen tclass0=1 
gen tclass1=1 
gen tclass2=1 
recode aclass0 (0=1) if year==0 
recode aclass1 (0=1) if year==1 
recode aclass2 (0=1) if year==2 
recode tclass1 (1=0) if year==0 
recode tclass2 (1=0) if year==0 
recode tclass2 (1=0) if year==1 
label variable aclass0 "aclass0: Acute Class Effect at Year 0" 
label variable aclass1 "aclass1: Acute Class Effect at Year 1" 
label variable aclass2 "aclass2: Acute Class Effect at Year 2" 
label variable tclass0 "tclass0: Transfer Class Effect at Year 0" 
label variable tclass1 "tclass1: Transfer Class Effect at Year 1" 
label variable tclass2 "tclass2: Transfer Class Effect at Year 2" 
 
* Setting missing classroom values to have no effect
* Replace missing ID variables with 9999 to keep in model
* Create combined variables for ID and year switch
recode classid_year0 (.=9999) if classid_year0 >= .  
recode aclass0 (1=0) if classid_year0 >= . 
recode tclass0 (1=0) if classid_year0 >= . 
gen aclass0_year0 = classid_year0*aclass0 
gen tclass0_year0 = classid_year0*tclass0 
label variable aclass0_year0 "aclass0_year0: Acute Class Effect of Year 0" 
label variable tclass0_year0 "tclass0_year0: Transfer Class Effect of Year 0" 
recode classid_year1 (.=9999) if classid_year1 >= .  
recode aclass1 (1=0) if classid_year1 >= . 
recode tclass1 (1=0) if classid_year1 >= . 
gen aclass1_year1 = classid_year1*aclass1 
gen tclass1_year1 = classid_year1*tclass1 
label variable aclass1_year1 "aclass1_year1: Acute Class Effect of Year 1" 
label variable tclass1_year1 "tclass1_year1: Transfer Class Effect of Year 1" 
recode classid_year2 (.=9999) if classid_year2 >= .  
recode aclass2 (1=0) if classid_year2 >= . 
recode tclass2 (1=0) if classid_year2 >= . 
gen aclass2_year2 = classid_year2*aclass2 
gen tclass2_year2 = classid_year2*tclass2 
label variable aclass2_year2 "aclass2_year2: Acute Class Effect of Year 2" 
label variable tclass2_year2 "tclass2_year2: Transfer Class Effect of Year 2" 
recode classid (.=9999) if classid >- . 
 
* Centering model predictors for analysis
gen cmgirl50 = cmgirl - .50 
gen cmagg2 = cmaggression - 2 
gen smagg2 = smaggression - 2 
gen agg2 = aggression - 2 
* Piecewise year
gen year01=0 
gen year12=0 
recode year01 (0=-1) if year==0 
recode year12 (0=1)  if year==2 
label variable cmgirl50 "cmgirl50: Class Proportion of Girls (0=.50)" 
label variable cmagg2 "cmagg2: Class Mean Student Aggression (0=2)" 
label variable smagg2 "smagg2: Student Mean Aggression (0=2)" 
label variable agg2 "agg2: Student Aggression (0=2)" 
label variable year01 "year01: Change from Year 1 to 0" 
label variable year12 "year12: Change from Year 1 to 2" 
 
* Subset sample to complete cases for all predictors
egen nummiss = rowmiss(year grade girl cmgirl aggression cmaggression effort) 
drop if nummiss>0 
     
********************************************************************************
*******             BEGIN CHAPTER 11b TIME-VARYING GROUP MODELS          *******
*******    NOTE: Had to switch to _all for subject random intercept      *******
*******    (which doesn't allow random slopes) once crossed random       *******
*******           effects for time-varying groups were added             *******
********************************************************************************
 
* Save results to separate file
log using $filesave\STATA_Chapter11b_Output, replace name(STATA_Chapter11b) 
 
display as result "Chapter 11b: Descriptive Statistics for Student and Year-Specific Class Variables" 
preserve  
collapse girl classid_year0 grade_year0 classid_year1 grade_year1 classid_year2 grade_year2, by(studentid) 
tabulate girl 
tabulate classid_year0 grade_year0 
tabulate classid_year1 grade_year1 
tabulate classid_year2 grade_year2 
restore  
 
display as result "Chapter 11b: Descriptive Statistics for Level-1 Time-Varying Student Variables" 
summarize cmgirl effort aggression 
 
display as result "Ch 11b: Empty Means, Two-Level Model of Years Within Students" 
display as result "Predicting Teacher-Perceived Student Effort" 
mixed effort , ///
               || studentid: , variance reml covariance(unstructured), 
      estat ic, n(33), 
      estat icc, 
      estat wcorrelation, covariance, 
      estat wcorrelation, 
      estimates store FitEmpty2E, 
 
display as result "Ch 11b: Saturated Means, Unstructured Variance Model" 
display as result "Predicting Student Effort" 
mixed effort i.year, ///
               || studentid: , noconstant variance reml covariance(unstructured) ///
               residuals(unstructured,t(year)), 
      estat ic, n(33), 
      estat wcorrelation, covariance, 
      estat wcorrelation, 
      contrast i.year,  
      margins  i.year,  
      margins  i.year, pwcompare(pveffects) 
      estimates store FitSatUN2E, 
 
display as result "Ch 11b: Piecewise Means, Random Intercept Model" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12, ///
               || studentid: , variance reml covariance(unstructured), 
      estat ic, n(33), 
      estimates store FitPieceRI2E, 
      lrtest FitSatUN2E FitPieceRI2E, force 
 
display as result "Eq 11b.13: Adding Fixed Effects of Year-Specific Class" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12 ///
             i.classid_year0#c.aclass0 i.classid_year1#c.aclass1 i.classid_year2#c.aclass2, ///
               || studentid: , variance reml covariance(unstructured), 
      estat ic, n(33), 
 
display as result "Eq 11b.14: Adding Random Acute Year-Specific Class Effects" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12, ///
               || _all: r.studentid, variance reml ///
               || _all: r.aclass0_year0,   ///
               || _all: r.aclass1_year1,   ///
               || _all: r.aclass2_year2,  , 
      estat ic, n(33), 
      estimates store FitClassAcuteE, 
      lrtest FitClassAcuteE FitPieceRI2E,  
 
display as result "Ch 11b: Adding Random Transfer Class Effects Instead" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12, ///
               || _all: r.studentid, variance reml ///
               || _all: r.tclass0_year0,   ///
               || _all: r.tclass1_year1,   ///
               || _all: r.tclass2_year2,  , 
      estat ic, n(33), 
      estimates store FitClassTransE, 
      lrtest FitClassTransE FitPieceRI2E,  
 
display as result "Eq 11b.15: Adding Year-Specific Effects of Class Grade" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12 ///
             i.grade#c.aclass0 i.grade#c.aclass1 i.grade#c.aclass2, ///
               || _all: r.studentid, variance reml ///
               || _all: r.aclass0_year0,   ///
               || _all: r.aclass1_year1,   ///
               || _all: r.aclass2_year2,  , 
      estat ic, n(33), 
      * Grade 3 vs 4 at Year 0
      test 3.grade#c.aclass0=4.grade#c.aclass0 
      * Grade 3 vs 5 at Year 0
      test 3.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 0
      test 4.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 1
      test 4.grade#c.aclass1=5.grade#c.aclass1 
      * Grade 4 vs 6 at Year 1
      test 4.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 1
      test 5.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 2
      test 5.grade#c.aclass2=6.grade#c.aclass2 
      * Grade 5 vs 7 at Year 2
      test 5.grade#c.aclass2=7.grade#c.aclass2 
      * Grade 6 vs 7 at Year 2
      test 6.grade#c.aclass2=7.grade#c.aclass2 
 
display as result "Eq 11b.16: Adding Student Gender and Year-Specific Class Contextual Gender Effects" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12 ///
             i.grade#c.aclass0 i.grade#c.aclass1 i.grade#c.aclass2 ///
             c.girl c.cmgirl50#c.aclass0 c.cmgirl50#c.aclass1 c.cmgirl50#c.aclass2, /// 
               || _all: r.studentid, variance reml ///
               || _all: r.aclass0_year0,   ///
               || _all: r.aclass1_year1,   ///
               || _all: r.aclass2_year2,  , 
      estat ic, n(33), 
      * Multivariate Test of Year-Specific Class Contextual Gender Effects
      test (c.cmgirl50#c.aclass0=0) (c.cmgirl50#c.aclass1=0) (c.cmgirl50#c.aclass2=0) 
      * Grade 3 vs 4 at Year 0
      test 3.grade#c.aclass0=4.grade#c.aclass0 
      * Grade 3 vs 5 at Year 0
      test 3.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 0
      test 4.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 1
      test 4.grade#c.aclass1=5.grade#c.aclass1 
      * Grade 4 vs 6 at Year 1
      test 4.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 1
      test 5.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 2
      test 5.grade#c.aclass2=6.grade#c.aclass2 
      * Grade 5 vs 7 at Year 2
      test 5.grade#c.aclass2=7.grade#c.aclass2 
      * Grade 6 vs 7 at Year 2
      test 6.grade#c.aclass2=7.grade#c.aclass2 
      * Between-Class Gender Effect at Year 0
      lincom c.girl*1 + c.cmgirl50#c.aclass0*1 
      * Between-Class Gender Effect at Year 1
      lincom c.girl*1 + c.cmgirl50#c.aclass1*1 
      * Between-Class Gender Effect at Year 2
      lincom c.girl*1 + c.cmgirl50#c.aclass2*1 
 
display as result "Ch 11b: Empty Means, Two-Level Model of Years Within Students" 
display as result "Predicting Teacher-Perceived Student Aggression" 
mixed aggression , ///
                   || studentid: , variance reml covariance(unstructured), 
      estat ic, n(33), 
      estat icc, 
      estat wcorrelation, covariance, 
      estat wcorrelation, 
      estimates store FitEmpty2A, 
 
display as result "Ch 11b: Saturated Means, Unstructured Variance Model" 
display as result "Predicting Student Aggression" 
mixed aggression i.year, ///
                   || studentid: , noconstant variance reml covariance(unstructured) ///
                   residuals(unstructured,t(year)), 
      estat ic, n(33), 
      estat wcorrelation, covariance, 
      estat wcorrelation, 
      contrast i.year,  
      margins  i.year,  
      margins  i.year, pwcompare(pveffects) 
      estimates store FitSatUN2A, 
 
display as result "Ch 11b: Piecewise Means, Random Intercept Model" 
display as result "Predicting Student Aggression" 
mixed aggression c.year01 c.year12, ///
                   || studentid: , variance reml covariance(unstructured), 
      estat ic, n(33), 
      estimates store FitPieceRI2A, 
      lrtest FitSatUN2A FitPieceRI2A, force 
 
display as result "Ch 11b: Adding Random Acute Year-Specific Class Effects" 
display as result "Predicting Student Aggression" 
mixed aggression c.year01 c.year12, ///
                   || _all: r.studentid, variance reml ///
                   || _all: r.aclass0_year0,   ///
                   || _all: r.aclass1_year1,   ///
                   || _all: r.aclass2_year2,  , 
      estat ic, n(33), 
      estimates store FitClassAcuteA, 
      lrtest FitClassAcuteA FitPieceRI2A,  
 
display as result "Ch 11b: Adding Random Transfer Class Effects Instead" 
display as result "Predicting Student Aggression" 
mixed aggression c.year01 c.year12, ///
                   || _all: r.studentid, variance reml ///
                   || _all: r.tclass0_year0,   ///
                   || _all: r.tclass1_year1,   ///
                   || _all: r.tclass2_year2,  , 
      estat ic, n(33), 
      estimates store FitClassTransA, 
      lrtest FitClassTransA FitPieceRI2A,  
 
display as result "Ch 11b: Adding Time-Varying, Student Mean, and Year-Specific Class Contextual Effects of Student Aggression" 
display as result "Predicting Student Effort" 
mixed effort c.year01 c.year12 ///
             i.grade#c.aclass0 i.grade#c.aclass1 i.grade#c.aclass2 ///
             c.girl c.cmgirl50#c.aclass0 c.cmgirl50#c.aclass1 c.cmgirl50#c.aclass2 /// 
             c.agg2 c.smagg2 c.cmagg2#c.aclass0 c.cmagg2#c.aclass1 c.cmagg2#c.aclass2, /// 
               || _all: r.studentid, variance reml ///
               || _all: r.aclass0_year0,   ///
               || _all: r.aclass1_year1,   ///
               || _all: r.aclass2_year2,  , 
      estat ic, n(33), 
      * Multivariate Test of Year-Specific Class Contextual Aggression Effects
      test (c.cmagg2#c.aclass0=0) (c.cmagg2#c.aclass1=0) (c.cmagg2#c.aclass2=0) 
      * Grade 3 vs 4 at Year 0
      test 3.grade#c.aclass0=4.grade#c.aclass0 
      * Grade 3 vs 5 at Year 0
      test 3.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 0
      test 4.grade#c.aclass0=5.grade#c.aclass0 
      * Grade 4 vs 5 at Year 1
      test 4.grade#c.aclass1=5.grade#c.aclass1 
      * Grade 4 vs 6 at Year 1
      test 4.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 1
      test 5.grade#c.aclass1=6.grade#c.aclass1 
      * Grade 5 vs 6 at Year 2
      test 5.grade#c.aclass2=6.grade#c.aclass2 
      * Grade 5 vs 7 at Year 2
      test 5.grade#c.aclass2=7.grade#c.aclass2 
      * Grade 6 vs 7 at Year 2
      test 6.grade#c.aclass2=7.grade#c.aclass2 
      * Between-Class Gender Effect at Year 0
      lincom c.girl*1 + c.cmgirl50#c.aclass0*1 
      * Between-Class Gender Effect at Year 1
      lincom c.girl*1 + c.cmgirl50#c.aclass1*1 
      * Between-Class Gender Effect at Year 2
      lincom c.girl*1 + c.cmgirl50#c.aclass2*1 
      * Between-Class Aggression Effect at Year 0
      lincom c.agg2*1 + c.smagg2*1 + c.cmagg2#c.aclass0*1 
      * Between-Class Aggression Effect at Year 1
      lincom c.agg2*1 + c.smagg2*1 + c.cmagg2#c.aclass1*1 
      * Between-Class Aggression Effect at Year 2
      lincom c.agg2*1 + c.smagg2*1 + c.cmagg2#c.aclass2*1 
      * Between-Student Aggression Effect
      lincom c.agg2*1 + c.smagg2*1 
      predict PredFinalE, xb, 
corr effort PredFinalE 
  
****** END CHAPTER 11b MODELS ******
 
* Close log
log close STATA_Chapter11b 
* Convert log to html using custom downloaded package
log2html $filesave\STATA_Chapter11b_Output, replace