Skip to content
dbetebenner edited this page Apr 21, 2015 · 6 revisions

2014 SGP Analyses

For the 2014 Utah analyses, we are following a work flow established in the previous year that includes the following 4 steps:

  1. Create annual SGP configurations for EOCT analyses as well as the associated norm group preferences included in SGPstateData.
  2. Conduct Grade-Level ELA, Math, Science SGP Analyses.
  3. Conduct End-of-Course Test (EOCT) SGP Analyses.
  4. Export data, and produce summaries and visualizations from the Utah_SGP object.

1. Create annual SGP configurations.

Unlike grade-level analyses, EOCT analyses are specialized enough so that it is necessary to explicitly specify the analyses to be performed via a configuration. The configurations associated with the 2014 annual EOCT SGP analyses are located in the Utah repo folder SGP_CONFIG. The configurations are broken up into two separate R scripts: MATHEMATICS.R, and SCIENCE.R.

Each configuration specifies a set of parameters that defines the norm group of students to be examined. Every potential norm group is defined by, at a minimum, the progressions of content area, academic year and grade-level. Other parameters may also be defined. Each configuration used for the Utah EOCT analyses contain these five elements:

  • sgp.content.areas: A progression of values that specifies the content areas to be looked at and their order
  • sgp.panel.years: The progression of the years associated with the content area progression (sgp.content.areas) provided in the configuration, potentially allowing for skipped years, etc.
  • sgp.grade.sequences: The grade progression associated with the content area and year progressions provided in the configuration. 'EOCT' stands for 'End Of Course Test'. The use of the generic 'EOCT' allows for secondary students to be compared based on the pattern of course taking rather than being dependent upon grade-level/class-designation.
  • sgp.exact.grade.progression: A Boolean argument (set to TRUE) indicating whether to run the EXACT configuration as written (rather than taking progressively restricted nested subsets of the configuration if FALSE).
  • sgp.norm.group.preference: Because a student can potentially be included in more than one analysis/configuration, this argument provides a ranking specifying which SGP is preferable and will ultimately be the SGP matched with the student in the combineSGP step. Lower numbers correspond with higher preference.

Note that sgp.content.areas, sgp.panel.years, and sgp.grade.sequences elements are all character strings, and their values correspond to levels found in the CONTENT_AREA, YEAR, and GRADE variables in the Utah_SGP@Data slot respectively. As an example, here is an excerpt from the 2014 Physics configuration script:

PHYSICS_2014.config <- list(
# VIA CHEMISTRY
	PHYSICS.2014 = list(
		sgp.content.areas=c('SCIENCE', 'BIOLOGY', 'CHEMISTRY', 'PHYSICS'),
		sgp.panel.years=as.character(2011:2014),
		sgp.grade.sequences=list(c(8, 'EOCT', 'EOCT', 'EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=0),
	PHYSICS.2014 = list(
		sgp.content.areas=c('EARTH_SCIENCE', 'BIOLOGY', 'CHEMISTRY', 'PHYSICS'),
		sgp.panel.years=as.character(2011:2014),
		sgp.grade.sequences=list(c('EOCT', 'EOCT', 'EOCT', 'EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=1),	
	PHYSICS.2014 = list(
		sgp.content.areas=c('BIOLOGY', 'CHEMISTRY', 'PHYSICS'),
		sgp.panel.years=as.character(2012:2014),
		sgp.grade.sequences=list(c('EOCT', 'EOCT', 'EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=2),
	PHYSICS.2014 = list(
		sgp.content.areas=c('CHEMISTRY', 'PHYSICS'),
		sgp.panel.years=as.character(2013:2014),
		sgp.grade.sequences=list(c('EOCT', 'EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=3),
# VIA BIOLOGY
	PHYSICS.2014 = list(
		sgp.content.areas=c(rep('SCIENCE',2), 'BIOLOGY', 'PHYSICS'),
		sgp.panel.years=as.character(2011:2014),
		sgp.grade.sequences=list(c(7:8,'EOCT','EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=1),
	PHYSICS.2014 = list(
		sgp.content.areas=c('SCIENCE', 'BIOLOGY', 'PHYSICS'),
		sgp.panel.years=as.character(2012:2014),
		sgp.grade.sequences=list(c(8,'EOCT','EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=2),
	PHYSICS.2014 = list(
		sgp.content.areas=c('SCIENCE', 'EARTH_SCIENCE', 'BIOLOGY', 'PHYSICS'),
		sgp.panel.years=as.character(2011:2014),
		sgp.grade.sequences=list(c(8,'EOCT','EOCT','EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=1),
	PHYSICS.2014 = list(
		sgp.content.areas=c('EARTH_SCIENCE', 'BIOLOGY', 'PHYSICS'),
		sgp.panel.years=as.character(2012:2014),
		sgp.grade.sequences=list(c('EOCT','EOCT','EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=2),
	PHYSICS.2014 = list(
		sgp.content.areas=c('BIOLOGY', 'PHYSICS'),
		sgp.panel.years=as.character(2013:2014),
		sgp.grade.sequences=list(c('EOCT', 'EOCT')),
		sgp.exact.grade.progression=TRUE,
		sgp.norm.group.preference=3)
)

Configurations are R scripts that are sourced as part of the larger SGP analysis to be discussed later. In addition, the SGPstateData needs to be updated with the norm group preference embedded within the configurations. To do this, an Rdata object needs to be constructed and then embedded within SGPstateData (either manually or included in the package build itself). To create the Rdata object with the norm groups preferences utilize/source the R script configToSGPNormGroup.R in the SGP_CONFIG folder as follows:

source("configToSGPNormGroup.R")

This creates and saves the Rdata object UT_SGP_Norm_Group_Preference.Rdata containing the norm group preferences (the UT_SGP_Norm_Group_Preference object is just a data.frame/data.table containing information about what the rank ordering of the configurations are in terms of preference).

The UT_SGP_Norm_Group_Preference can either be embedded into SGPstateData manually or submitted to the SGP Package maintainers for inclusion in the package so that it is contained in SGPstateData when the package is loaded.

2. Conduct Grade-Level SGP Analyses.

Unlike the 2013 analyses, we use the updateSGP function to A) prepare and add the 2014 long data to the existing SGP (S4) data object (prepareSGP step) and B) produce SGPs for the grade-level based subjects (analyzeSGP step).

# Load the SGP object Andrew produced in Fall 2013.
load("Utah_SGP.Rdata") 

# Load the 2014 data object
load("Utah_Data_LONG_2014.Rdata") 

Utah_SGP <- updateSGP(
		what_sgp_object = Utah_SGP,
		with_sgp_data_LONG = Utah_Data_LONG_2014,
		content_areas=c("ELA", "MATHEMATICS", "SCIENCE"),
		years='2014',
		grades=3:11,
		steps = c("prepareSGP", "analyzeSGP"),
		sgp.percentiles = TRUE,
		sgp.projections = FALSE,
		sgp.projections.lagged = FALSE,
		sgp.percentiles.baseline = FALSE,
		sgp.projections.baseline = FALSE,
		sgp.projections.lagged.baseline = FALSE,
		simulate.sgps=FALSE,
		save.intermediate.results=FALSE,
		goodness.of.fit.print="GROB",
		parallel.config=list(
			BACKEND="FOREACH", TYPE="doParallel", 
			WORKERS=list(PERCENTILES=12)))

Note that in 2014 the student growth projections were not produced. This is due to the switch from CRT to SAGE assessment programs.
Projections will not be available without at least one more additional year of SAGE data to form single year progression predictions.

3. Conduct EOCT SGP Analyses.

The EOCT analyses require that we supply the sgp.config argument of analyzeSGP as a list of desired configurations. These were written in Step 1. and must now be read into R and concatenated into a master configuration list (called UT.config here).

# LOAD 2014 EOCT FILES CONFIGURATION:
source("MATHEMATICS.R")
source("SCIENCE.R")

# CONSTRUCT LIST FOR sgp.config ARGUMENT FROM CONFIGURATION FILES:
UT.config <- c(
	EARTH_SCIENCE_2014.config, 
	BIOLOGY_2014.config, 
	CHEMISTRY_2014.config, 
	PHYSICS_2014.config,
	SEC_MATH_I_2014.config,
	SEC_MATH_II_2014.config,
	SEC_MATH_III_2014.config)

# PRODUCE SGP FOR COURSE-BASED TESTS
Utah_SGP <- analyzeSGP(
		Utah_SGP,
		sgp.config=UT.config,
		simulate.sgps=FALSE,
		sgp.projections = FALSE,
		sgp.projections.lagged = FALSE,
		sgp.percentiles.baseline = FALSE,
		sgp.projections.baseline = FALSE,
		sgp.projections.lagged.baseline = FALSE,
		parallel.config=list(
			BACKEND="FOREACH", TYPE="doParallel", 
			WORKERS=list(PERCENTILES=12)))

save(Utah_SGP, file="Utah_SGP.Rdata")

4. Export data, and produce summaries and visualizations from the Utah_SGP object.

Finally we will combine the 2014 grade-level and EOCT results into the longitudinal data in the SGP object (@Data) using the combineSGP function. Once the results have been merged in, we can produce numerous summary tables and visualizations. The student-level data is also output as pipe-delimited text files in both longitudinal and wide formats.

# MERGE LONG DATA WITH SGP RESULTS
Utah_SGP <- combineSGP(
	Utah_SGP,
	years='2014',
	sgp.projections = FALSE,
	sgp.projections.lagged = FALSE,
	sgp.percentiles.baseline = FALSE,
	sgp.projections.baseline = FALSE,
	sgp.projections.lagged.baseline = FALSE)

# CALCULATE SUMMARY STATISTICS TO BE STORED IN DATA OBJECT AND USED ELSEWHERE IN APPLICATION

Utah_SGP <- summarizeSGP(
	Utah_SGP,
	parallel.config=list(
		BACKEND="FOREACH", TYPE="doParallel", 
		WORKERS=list(SUMMARY=14)))

save(Utah_SGP, file="Utah_SGP.Rdata")

# EXPORT DATA FROM SGP OBJECT @Data SLOT AS PIPE-DELIMITED FILE IN VARIOUS FORMATS

outputSGP(
	Utah_SGP,
	output.type = c("LONG_Data", "WIDE_Data"))

# LOAD SGP OUTPUT INTO DATA WAREHOUSE
# SGP/Data/Utah_SGP_LONG_Data.txt -> be_upass.acsdbstage.sgp_raw

# CONSTRUCT INDIVIDUAL STUDENT REPORT (STUDENT GROWTH PLOTS)
# This may be commented out in the initial run

visualizeSGP(
	Utah_SGP,
	plot.types = c("studentGrowthPlot"),
	sgPlot.save.sgPlot.data = TRUE,
	sgPlot.front.page = "AD_SGP_GUIDE.pdf", # Serves as introduction to the report
	sgPlot.produce.plots = TRUE,
	sgPlot.zip = TRUE,
	parallel.config=list(
		BACKEND="FOREACH", TYPE="doParallel", WORKERS=14))