-
Notifications
You must be signed in to change notification settings - Fork 0
Data Analysis 2014
For the 2014 Utah analyses, we are following a work flow established in the previous year that includes the following 4 steps:
- Create annual SGP configurations for EOCT analyses as well as the associated norm group preferences included in
SGPstateData
. - Conduct Grade-Level ELA, Math, Science SGP Analyses.
- Conduct End-of-Course Test (EOCT) SGP Analyses.
- Export data, and produce summaries and visualizations from the
Utah_SGP
object.
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 thecombineSGP
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.
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.
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")
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))
SGP - Student Growth Percentiles SGP Blog | SGP GitHub Repo | SGP on CRAN