Nothing
`bubblePlot_Styles` <-
function(sgp_object,
state,
bPlot.years=NULL,
bPlot.content_areas=NULL,
bPlot.districts=NULL,
bPlot.schools=NULL,
bPlot.instructors=NULL,
bPlot.styles=c(1),
bPlot.levels=NULL,
bPlot.level.cuts=NULL,
bPlot.full.academic.year=TRUE,
bPlot.minimum.n=10,
bPlot.anonymize=FALSE,
bPlot.prior.achievement=TRUE,
bPlot.draft=FALSE,
bPlot.demo=FALSE,
bPlot.output ="PDF",
bPlot.format="print",
bPlot.folder="Visualizations/bubblePlots") {
DISTRICT_NUMBER <- DISTRICT_NAME <- SCHOOL_NUMBER <- SCHOOL_NAME <- SCHOOL_ENROLLMENT_STATUS <- YEAR <- CONTENT_AREA <- MEDIAN_SGP_COUNT <- NULL ## To prevent R CMD check warnings
ID <- YEAR_INTEGER_TMP <- SCALE_SCORE <- SGP <- GRADE <- NULL ## To prevent R CMD check warnings
INSTRUCTOR_NUMBER <- INSTRUCTOR_NAME <- INSTRUCTOR_ENROLLMENT_STATUS <- NULL
SGP_TARGET <- VALID_CASE <- ENROLLMENT_STATUS <- NULL
SCALE_SCORE_PRIOR <- SGP_PRIOR <- SGP_TARGET_PRIOR <- ACHIEVEMENT_LEVEL_PRIOR <- CONTENT_AREA_PRIOR <- SGP_NORM_GROUP <- NULL
### Define relevant quantities
# State stuff
if (state %in% c(datasets::state.abb, "DEMO")) {
state.name.label <- c(datasets::state.name, "DEMONSTRATION")[state==c(datasets::state.abb, "DEMO")]
test.abbreviation.label <- SGP::SGPstateData[[state]][["Assessment_Program_Information"]][["Assessment_Abbreviation"]]
} else {
state.name.label <- test.abbreviation.label <- state
}
state.name.file.label <- gsub("_", " ", state.name.label)
# draft message
if (bPlot.draft) {
bPlot.message <- c("grid.text(x=unit(50, 'native'), y=unit(50, 'native'), 'CONFIDENTIAL - DO NOT DISTRIBUTE', rot=-30, gp=gpar(col='grey80', cex=2.9, alpha=0.8, fontface=2))")
} else {
bPlot.message <- NULL
}
if (is.null(bPlot.level.cuts)) {
bPlot.level.cuts <- seq(0,100,by=20)
}
### Utility functions
"%w/o%" <- function(x,y) x[!x %in% y]
pretty_year <- function(x) sub("_", "-", x)
create.bPlot.labels <- function(year.iter, y.variable.iter, bubblePlot_LEVEL) {
pretty_year <- function(x) sub("_", "-", x)
my.labels <- list()
my.labels$x.year.label <- pretty_year(year.iter)
if (length(grep("PRIOR", y.variable.iter)) > 0) {
if (year.iter=="All Years") {
my.labels$y.year <- "All Years"
} else {
my.labels$y.year <- paste(as.numeric(unlist(strsplit(as.character(year.iter), "_")))-1, collapse="_")
}
if (bubblePlot_LEVEL=="Summary") my.labels$y.year.label <- paste(pretty_year(my.labels$y.year), "Prior Percent at/above Proficient")
if (bubblePlot_LEVEL=="Individual") my.labels$y.year.label <- list(PRIOR=paste(pretty_year(my.labels$y.year), "Achievement Level"), CURRENT=paste(pretty_year(year.iter), "Achievement Level"))
if (bubblePlot_LEVEL=="Summary") my.labels$main.title <- paste(test.abbreviation.label, "Growth & Prior Achievement")
if (bubblePlot_LEVEL=="Individual") my.labels$main.title <- paste(test.abbreviation.label, "Growth & Achievement")
if (bubblePlot_LEVEL=="Summary") my.labels$pdf.title <- "Bubble_Plot_(Prior_Achievement)"
if (bubblePlot_LEVEL=="Individual") my.labels$pdf.title <- "Student_Bubble_Plot"
} else {
my.labels$y.year <- year.iter
if (bubblePlot_LEVEL=="Summary") my.labels$y.year.label <- paste(pretty_year(my.labels$y.year), "Percent at/above Proficient")
if (bubblePlot_LEVEL=="Individual") my.labels$y.year.label <- paste(pretty_year(my.labels$y.year), "Achievement Level")
if (bubblePlot_LEVEL=="Summary") my.labels$main.title <- paste(test.abbreviation.label, "Growth & Achievement")
if (bubblePlot_LEVEL=="Individual") my.labels$main.title <- paste(test.abbreviation.label, "Growth & Achievement")
if (bubblePlot_LEVEL=="Summary") my.labels$pdf.title <- "Bubble_Plot_(Current_Achievement)"
if (bubblePlot_LEVEL=="Individual") my.labels$pdf.title <- "Student_Bubble_Plot_(Current_Achievement)"
}
return(my.labels)
}
names.merge <- function(tmp.data, bPlot.anonymize) {
if (!"INSTRUCTOR_NUMBER" %in% names(tmp.data) & !"SCHOOL_NUMBER" %in% names(tmp.data) & "DISTRICT_NUMBER" %in% names(tmp.data)) {
tmp.names <- unique(data.table(sgp_object@Data[!is.na(DISTRICT_NUMBER),
list(DISTRICT_NUMBER, DISTRICT_NAME, SCHOOL_NUMBER, SCHOOL_NAME, YEAR)], key=c("DISTRICT_NUMBER", "YEAR"), by=c("DISTRICT_NUMBER", "YEAR"))) # Keep other institution NUMBER to iterate over in some plots
if (bPlot.anonymize) {
tmp.names$DISTRICT_NAME <- paste("District", as.numeric(as.factor(tmp.names$DISTRICT_NUMBER)))
}
setkey(tmp.data, DISTRICT_NUMBER, YEAR)
}
if (!"INSTRUCTOR_NUMBER" %in% names(tmp.data) & "SCHOOL_NUMBER" %in% names(tmp.data) & !"DISTRICT_NUMBER" %in% names(tmp.data)) {
tmp.names <- unique(data.table(sgp_object@Data[!is.na(SCHOOL_NUMBER),
list(DISTRICT_NUMBER, DISTRICT_NAME, SCHOOL_NUMBER, SCHOOL_NAME, YEAR)], key=c("SCHOOL_NUMBER", "YEAR")), by=c("SCHOOL_NUMBER", "YEAR")) # Keep other institution NUMBER to iterate over in some plots
if (bPlot.anonymize) {
tmp.names$SCHOOL_NAME <- paste("School", as.numeric(as.factor(tmp.names$SCHOOL_NUMBER)))
}
setkey(tmp.data, SCHOOL_NUMBER, YEAR)
}
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data)) { #Add both school and district number regardless of
if (!"INSTRUCTOR_NAME" %in% names(tmp.data)) {
tmp.num <- seq(length(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data))))
eval(parse(text=paste("sgp_object@Data$INSTRUCTOR_NAME_", tmp.num,
"<- paste0('Instructor', as.factor(sgp_object@Data$INSTRUCTOR_NUMBER_", tmp.num, "))")))
}
tmp.names <- data.frame(sgp_object@Data[,c(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data)), grep('INSTRUCTOR_NAME', names(sgp_object@Data)),
grep('SCHOOL_NUMBER', names(sgp_object@Data)), grep('SCHOOL_NAME', names(sgp_object@Data)),
grep('DISTRICT_NUMBER', names(sgp_object@Data)), grep('DISTRICT_NAME', names(sgp_object@Data))), with=FALSE])
inst.id.index <- grep('INSTRUCTOR_NUMBER', names(tmp.names)); inst.name.index <- grep('INSTRUCTOR_NAME', names(tmp.names))
sch.id.index <- grep('SCHOOL_NUMBER', names(tmp.names)); sch.name.index <- grep('SCHOOL_NAME', names(tmp.names))
dst.id.index <- grep('DISTRICT_NUMBER', names(tmp.names)); dst.name.index <- grep('DISTRICT_NAME', names(tmp.names))
tmp.names<- eval(parse(text=paste("unique(data.table(INSTRUCTOR_NUMBER=c(", paste("tmp.names[,", inst.id.index, "]", collapse=","),
"), INSTRUCTOR_NAME=c(", paste("tmp.names[,", inst.name.index, "]", collapse=","),
"), SCHOOL_NUMBER=rep(", paste("tmp.names[,", sch.id.index, "],", length(inst.id.index), collapse=","),
"), SCHOOL_NAME=rep(", paste("tmp.names[,", sch.name.index, "],", length(inst.id.index), collapse=","),
"), DISTRICT_NUMBER=rep(", paste("tmp.names[,", dst.id.index, "],", length(inst.id.index), collapse=","),
"), DISTRICT_NAME=rep(", paste("tmp.names[,", dst.name.index, "],", length(inst.id.index), collapse=","), ")))")))
if (bPlot.anonymize) {
tmp.names$INSTRUCTOR_NAME <- paste("Instructor", as.numeric(as.factor(tmp.names$INSTRUCTOR_NUMBER)))
tmp.names$SCHOOL_NAME <- paste("School", as.numeric(as.factor(tmp.names$SCHOOL_NUMBER)))
tmp.names$DISTRICT_NAME <- paste("District", as.numeric(as.factor(tmp.names$DISTRICT_NUMBER)))
}
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data) & "SCHOOL_NUMBER" %in% names(tmp.data) & !"DISTRICT_NUMBER" %in% names(tmp.data)) {
setkeyv(tmp.names, c("INSTRUCTOR_NUMBER", "SCHOOL_NUMBER"))
setkeyv(tmp.data, c("INSTRUCTOR_NUMBER", "SCHOOL_NUMBER"))
}
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data) & !"SCHOOL_NUMBER" %in% names(tmp.data) & "DISTRICT_NUMBER" %in% names(tmp.data)) {
setkeyv(tmp.names, c("INSTRUCTOR_NUMBER", "DISTRICT_NUMBER"))
setkeyv(tmp.data, c("INSTRUCTOR_NUMBER", "DISTRICT_NUMBER"))
}
tmp.names[tmp.data, mult="last"][!is.na(INSTRUCTOR_NUMBER)]
} else tmp.names[tmp.data, mult="last"]
}
get.my.iters <- function(tmp.data, bubblePlot_LEVEL, ...) {
my.iters <- list()
# Year Stuff
if (is.null(bPlot.years)) {
if ("YEAR" %in% names(tmp.data)) {
my.iters$tmp.years <- tail(sort(unique(tmp.data[['YEAR']])), 1)
} else {
my.iters$tmp.years <- "All Years"
}
} else {
my.iters$tmp.years <- bPlot.years
}
# Content Area Stuff
if (is.null(bPlot.content_areas)) {
if ("CONTENT_AREA" %in% names(tmp.data)) {
my.iters$tmp.content_areas <- unique(tmp.data[['CONTENT_AREA']]) %w/o% NA
} else {
my.iters$tmp.content_areas <- "All Content Areas"
}
} else {
my.iters$tmp.content_areas <- bPlot.content_areas
}
# Reconcile choice of District and Schools
if (is.null(bPlot.instructors) & is.null(bPlot.schools) & is.null(bPlot.districts)) {
if ("DISTRICT_NUMBER" %in% names(tmp.data)) {
if (identical(my.iters$tmp.years, "All Years")) {
my.iters$tmp.districts <- sort(unique(tmp.data[['DISTRICT_NUMBER']])) %w/o% NA
} else {
my.iters$tmp.districts <- sort(unique(tmp.data[YEAR %in% my.iters$tmp.years][['DISTRICT_NUMBER']])) %w/o% NA
}
}
if ("SCHOOL_NUMBER" %in% names(tmp.data)) {
if (identical(my.iters$tmp.years, "All Years")) {
my.iters$tmp.schools <- sort(unique(tmp.data[['SCHOOL_NUMBER']])) %w/o% NA
} else {
my.iters$tmp.schools <- sort(unique(tmp.data[YEAR %in% my.iters$tmp.years][['SCHOOL_NUMBER']])) %w/o% NA
}
}
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data)) {
if (identical(my.iters$tmp.years, "All Years")) {
my.iters$tmp.instructors <- sort(unique(tmp.data[['INSTRUCTOR_NUMBER']])) %w/o% NA
} else {
my.iters$tmp.instructors <- sort(unique(tmp.data[YEAR %in% my.iters$tmp.years][['INSTRUCTOR_NUMBER']])) %w/o% NA
}
}
}
if (is.null(bPlot.instructors) & is.null(bPlot.schools) & !is.null(bPlot.districts)) {
my.iters$tmp.districts <- bPlot.districts
if ("SCHOOL_NUMBER" %in% names(tmp.data)) my.iters$tmp.schools <- unique(tmp.data$SCHOOL_NUMBER[tmp.data$DISTRICT_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data)) my.iters$tmp.instructors <- unique(tmp.data$INSTRUCTOR_NUMBER[tmp.data$INSTRUCTOR_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
}
if (is.null(bPlot.instructors) & !is.null(bPlot.schools) & is.null(bPlot.districts)) {
my.iters$tmp.schools <- bPlot.schools
if ("DISTRICT_NUMBER" %in% names(tmp.data)) my.iters$tmp.districts <- unique(tmp.data$DISTRICT_NUMBER[tmp.data$SCHOOL_NUMBER %in% my.iters$tmp.schools]) %w/o% NA
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data)) my.iters$tmp.instructors <- unique(tmp.data$INSTRUCTOR_NUMBER[tmp.data$INSTRUCTOR_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
}
if (!is.null(bPlot.instructors) & is.null(bPlot.schools) & is.null(bPlot.districts)) {
my.iters$tmp.instructors <- bPlot.instructors
if ("DISTRICT_NUMBER" %in% names(tmp.data)) my.iters$tmp.districts <- unique(tmp.data$DISTRICT_NUMBER[tmp.data$SCHOOL_NUMBER %in% my.iters$tmp.schools]) %w/o% NA
if ("SCHOOL_NUMBER" %in% names(tmp.data)) my.iters$tmp.schools <- unique(tmp.data$SCHOOL_NUMBER[tmp.data$DISTRICT_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
}
if (is.null(bPlot.instructors) & !is.null(bPlot.schools) & !is.null(bPlot.districts)) {
my.iters$tmp.districts <- bPlot.districts
my.iters$tmp.schools <- bPlot.schools
if ("INSTRUCTOR_NUMBER" %in% names(tmp.data)) my.iters$tmp.instructors <- unique(tmp.data$INSTRUCTOR_NUMBER[tmp.data$INSTRUCTOR_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
}
if (!is.null(bPlot.instructors) & !is.null(bPlot.schools) & is.null(bPlot.districts)) {
my.iters$tmp.schools <- bPlot.schools
my.iters$tmp.instructors <- bPlot.instructors
if ("DISTRICT_NUMBER" %in% names(tmp.data)) my.iters$tmp.districts <- unique(tmp.data$DISTRICT_NUMBER[tmp.data$SCHOOL_NUMBER %in% my.iters$tmp.schools]) %w/o% NA
}
if (!is.null(bPlot.instructors) & is.null(bPlot.schools) & !is.null(bPlot.districts)) {
my.iters$tmp.districts <- bPlot.districts
my.iters$tmp.instructors <- bPlot.instructors
if ("SCHOOL_NUMBER" %in% names(tmp.data)) my.iters$tmp.schools <- unique(tmp.data$SCHOOL_NUMBER[tmp.data$DISTRICT_NUMBER %in% my.iters$tmp.districts]) %w/o% NA
}
if (!is.null(bPlot.schools) & !is.null(bPlot.districts)) {
my.iters$tmp.districts <- bPlot.districts
my.iters$tmp.schools <- bPlot.schools
my.iters$tmp.instructors <- bPlot.instructors
my.iters$tmp.instructors <- unique(c(my.iters$tmp.instructors, tmp.data$INSTRUCTOR_NUMBER[tmp.data$SCHOOL_NUMBER %in% my.iters$tmp.schools])) %w/o% NA
my.iters$tmp.schools <- unique(c(my.iters$tmp.schools, tmp.data$SCHOOL_NUMBER[tmp.data$DISTRICT_NUMBER %in% my.iters$tmp.districts])) %w/o% NA
my.iters$tmp.districts <- unique(c(my.iters$tmp.districts, tmp.data$DISTRICT_NUMBER[tmp.data$SCHOOL_NUMBER %in% my.iters$tmp.schools])) %w/o% NA
}
# y.variable (include/not include prior achievement)
if (bPlot.prior.achievement & length(grep("PERCENT_AT_ABOVE_PROFICIENT_PRIOR", names(tmp.data))) > 0) {
if (bubblePlot_LEVEL=="Summary") my.iters$tmp.y.variable <- c("PERCENT_AT_ABOVE_PROFICIENT", "PERCENT_AT_ABOVE_PROFICIENT_PRIOR")
if (bubblePlot_LEVEL=="Individual") my.iters$tmp.y.variable <- c("SCALE_SCORE", "SCALE_SCORE_PRIOR")
} else {
if (bubblePlot_LEVEL=="Summary") my.iters$tmp.y.variable <- "PERCENT_AT_ABOVE_PROFICIENT"
if (bubblePlot_LEVEL=="Individual") my.iters$tmp.y.variable <- "SCALE_SCORE"
}
return(my.iters)
} ## END get.my.iters
get.my.level.labels <- function(bPlot.level.cuts) {
tmp.list <- list()
tmp.list[[1]] <- paste("Less than", bPlot.level.cuts[2], "percent")
if (length(bPlot.level.cuts) > 3) {
for (i in 2:(length(bPlot.level.cuts)-1)) {
tmp.list[[i]] <- paste(bPlot.level.cuts[i], "to", bPlot.level.cuts[i+1], "percent")
}
}
tmp.list[[length(bPlot.level.cuts)-1]] <- paste("More than", bPlot.level.cuts[length(bPlot.level.cuts)-1], "percent")
do.call(c, tmp.list)
}
get.bPlot.data <- function(tmp.bPlot.data) {
tmp <- "MEDIAN_SGP_COUNT >= bPlot.minimum.n"
if (content_area.iter != "All Content Areas") tmp <- paste("CONTENT_AREA==as.character(content_area.iter) &", tmp)
if (year.iter != "All Years") tmp <- paste("YEAR==year.iter &", tmp)
subset(tmp.bPlot.data, eval(parse(text=tmp)))
}
#################################################################################################################
####
#### Summary Level bubblePlots
####
#################################################################################################################
### < 100 are @Summary level bubblePlots
bubblePlot_LEVEL <- "Summary"
###################################################################
### BubblePlot Style 1 (State level bubblePlots by Schools)
###################################################################
if (1 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 1", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__SCHOOL_ENROLLMENT_STATUS"]][
SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes"]
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR"]]
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=NULL,
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(50, 100, 250, 500),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["SCHOOL_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(state.name.label, "School Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="School Size",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.04, 0.11),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(state.name.file.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
"State", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "State", "Style_1"),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 1", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 1
#######################################################################################
### BubblePlot Style 2 (State level bubblePlots with district schools highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor
#######################################################################################
if (2 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 2", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste("list(", paste0("PCT_", bPlot.levels, "=(100*length(grep('Yes',",
bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, ")))", collapse=","), ")"))
bPlot.levels <- as.list(bPlot.levels)
}
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__SCHOOL_ENROLLMENT_STATUS"]][
SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes"]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes",
eval(tmp.bPlot.levels.txt), by=list(SCHOOL_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[, eval(tmp.bPlot.levels.txt), by=list(SCHOOL_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
if (is.null(bPlot.levels)) bPlot.levels <- list(A=NULL)
for (bPlot.levels.iter in unlist(bPlot.levels)) { ### Loop over bPlot.levels
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over current & prior and bPlot.levels
for (levels.iter in levels(factor(eval(parse(text=paste0("bPlot.data$PCT_", bPlot.levels.iter)))))) {
for (y.variable.iter in my.iters$tmp.y.variable) {
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(50, 100, 250, 500),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["SCHOOL_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(state.name.label, "School Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="School Size",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels.iter, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.04, 0.11),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(state.name.file.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), capwords(levels.iter), "State", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "State", "Style_2", bPlot.levels.iter),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## END loop over levels.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
} ## End loop over bPlot.levels.iter
message(paste("\tFinished bubblePlot Style 2", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 2
#######################################################################################
### BubblePlot Style 3 (State level bubblePlots with instructors highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor
#######################################################################################
if (3 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 3", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste0("100*length(grep('Yes',", bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, "))"))
}
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["STATE"]][["STATE__INSTRUCTOR_NUMBER__INSTRUCTOR_ENROLLMENT_STATUS"]][INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes"]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes",
eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["STATE"]][["STATE__INSTRUCTOR_NUMBER"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[, eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) {
for (content_area.iter in my.iters$tmp.content_areas) {
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over current & prior and bPlot.levels
for (levels.iter in levels(factor(bPlot.data$V1))) {
for (y.variable.iter in my.iters$tmp.y.variable) {
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["INSTRUCTOR_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(state.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Class Size",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.08),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(state.name.file.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), capwords(levels.iter), "State", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "State", "Style_3", bPlot.levels),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## END loop over levels.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 3", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 3
#######################################################################################
### BubblePlot Style 10 (State level bubblePlots with district schools highlighted)
#######################################################################################
if (10 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 10", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__SCHOOL_ENROLLMENT_STATUS"]][
SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes"]
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR"]]
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over unique districts
for (district_number.iter in intersect(my.iters$tmp.districts, bPlot.data$DISTRICT_NUMBER)) { ### Loop over DISTRICT NUMBERS
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(50, 100, 250, 500),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["SCHOOL_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "School Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="School Size",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.04, 0.11),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "District", "Style_10", paste("District", district_number.iter, sep="_")),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 10", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 10
#######################################################################################
### BubblePlot Style 11 (State level bubblePlots with district schools highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor
#######################################################################################
if (11 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 11", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste("list(", paste0("PCT_", bPlot.levels, "=(100*length(grep('Yes',",
bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, ")))", collapse=","), ")"))
bPlot.levels <- as.list(bPlot.levels)
} else bPlot.levels <- list(A=NULL)
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__SCHOOL_ENROLLMENT_STATUS"]][
SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes"]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes",
eval(tmp.bPlot.levels.txt), by=list(SCHOOL_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[, eval(tmp.bPlot.levels.txt), by=list(SCHOOL_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("SCHOOL_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (bPlot.levels.iter in unlist(bPlot.levels)) { ### Loop over bPlot.levels
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Loop over unique districts
for (district_number.iter in my.iters$tmp.districts) { ### Loop over DISTRICT NUMBERS
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)[DISTRICT_NUMBER==district_number.iter & !is.na(eval(parse(text=paste0("PCT_", bPlot.levels.iter))))]
# Loop over current & prior and bPlot.levels
for (y.variable.iter in my.iters$tmp.y.variable) {
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
if (nrow(bPlot.data[which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),]) > 0) {
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(50, 100, 250, 500),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["SCHOOL_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "School Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="School Size",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels.iter, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.04, 0.11),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
capwords(bPlot.levels.iter), "Schools", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "District", "Style_11", paste("District", district_number.iter, sep="_"), bPlot.levels.iter),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} # END if (...)
} ## END loop over y.variable.iter
# } ## END loop over levels.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
} ## End loop over bPlot.levels.iter
message(paste("\tFinished bubblePlot Style 11", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 11
#######################################################################################
### BubblePlot Style 20 (State level bubblePlots with district teachers highlighted)
#######################################################################################
if (20 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 20", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER__INSTRUCTOR_ENROLLMENT_STATUS"]][
INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes"]
} else {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER"]]
}
# Merge in teacher and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over unique districts
for (district_number.iter in intersect(my.iters$tmp.districts, bPlot.data$DISTRICT_NUMBER)) { ### Loop over DISTRICT NUMBERS
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["INSTRUCTOR_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Classroom Size",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.08),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), "District", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "District", "Style_20"),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 20", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 20
#######################################################################################
### BubblePlot Style 21 (State level bubblePlots with district schools highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor (one plot for showing all levels)
#######################################################################################
if (21 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 21", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste0("100*length(grep('Yes',", bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, "))"))
}
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER"]][INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes"]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes",
eval(tmp.bPlot.levels.txt), by=list(DISTRICT_NUMBER, INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[, eval(tmp.bPlot.levels.txt), by=list(DISTRICT_NUMBER, INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over unique districts
for (district_number.iter in intersect(my.iters$tmp.districts, bPlot.data$DISTRICT_NUMBER)) { ### Loop over DISTRICT NUMBERS
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["INSTRUCTOR_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Classroom Size",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.08),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), "District", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "District", "Style_21", bPlot.levels),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 21", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 21
#######################################################################################
### BubblePlot Style 22 (State level bubblePlots with district schools highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor (one plot for each level)
#######################################################################################
if (22 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 22", prettyDate()))
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste0("100*length(grep('Yes',", bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, "))"))
}
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER"]][INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes"]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[INSTRUCTOR_ENROLLMENT_STATUS=="Enrolled Instructor: Yes",
eval(tmp.bPlot.levels.txt), by=list(DISTRICT_NUMBER, INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["DISTRICT_NUMBER"]][["DISTRICT_NUMBER__INSTRUCTOR_NUMBER"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- sgp_object@Data[, eval(tmp.bPlot.levels.txt), by=list(DISTRICT_NUMBER, INSTRUCTOR_NUMBER)]
setkeyv(tmp.bPlot.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
setkeyv(tmp.bPlot.levels.data, c("DISTRICT_NUMBER", "INSTRUCTOR_NUMBER"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
my.level.labels <- get.my.level.labels(bPlot.level.cuts)
tmp.bPlot.data$V1 <- cut(tmp.bPlot.data$V1, bPlot.level.cuts, include.lowest=TRUE, labels=my.level.labels)
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Loop over unique districts
for (district_number.iter in my.iters$tmp.districts) { ### Loop over DISTRICT NUMBERS
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)
# Loop over current & prior and bPlot.levels
for (levels.iter in levels(factor(bPlot.data$V1))) {
for (y.variable.iter in my.iters$tmp.y.variable) {
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=bPlot.data[["INSTRUCTOR_NAME"]],
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Classroom Size",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.08),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)), capwords(levels.iter), "District", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "District", "Style_22", bPlot.levels),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## END loop over levels.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 22", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 22
###################################################################
### BubblePlot Style 50 (School level bubblePlots by Instructors)
###################################################################
if (50 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 50", prettyDate()), "\n")
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__INSTRUCTOR_ENROLLMENT_STATUS"]][!is.na(INSTRUCTOR_ENROLLMENT_STATUS)]
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR"]]
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (district_number.iter in my.iters$tmp.districts) { ### Loop over DISTRICT NUMBERS
for (school_number.iter in my.iters$tmp.schools) { ### Loop over schools
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Subset data
bPlot.data <- tmp.bPlot.data[YEAR==year.iter & SCHOOL_NUMBER==school_number.iter & CONTENT_AREA==content_area.iter & MEDIAN_SGP_COUNT >= bPlot.minimum.n]
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
school.name.label <- as.character(bPlot.data[SCHOOL_NUMBER== school_number.iter]$SCHOOL_NAME[1])
### Create bubblePlot ###
if (dim(bPlot.data)[1] > 0) { # some institutions don't teach all content areas (elementary math)
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=NULL,
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data[["INSTRUCTOR_NAME"]], "-", bPlot.data[["SCHOOL_NAME"]]),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(state.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Number of Students",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.14),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(school.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
"Instructors", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_50", paste("District", district_number.iter, sep="_")),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END if
} ## END loop over y.variable.iter
} ## End loop over content_area.iter
} ## End loop over district_number.iter
} ## End loop over school_number.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 50", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 50
#######################################################################################
### BubblePlot Style 53 (STATE level --or multiple districts-- bubblePlots with District Instructors highlighted)
#######################################################################################
if (53 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 53", prettyDate()), "\n")
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__INSTRUCTOR_ENROLLMENT_STATUS"]][!is.na(INSTRUCTOR_ENROLLMENT_STATUS)]
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR"]]
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- tmp.bPlot.data[YEAR==year.iter & CONTENT_AREA==content_area.iter & DISTRICT_NUMBER %in% my.iters$tmp.districts & MEDIAN_SGP_COUNT >= bPlot.minimum.n]
# Loop over unique schools IN DISTRICT ONLY
for (district_number.iter in intersect(my.iters$tmp.districts, bPlot.data$DISTRICT_NUMBER)) { ### Loop over DISTRICT NUMBERS
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data[["INSTRUCTOR_NAME"]], "-", bPlot.data[["SCHOOL_NAME"]]),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Number of Students",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.14),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter,
gsub(" ", "_", capwords(content_area.iter)), "Instructors", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_53", paste("District", district_number.iter, sep="_")),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 53", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 53
#######################################################################################
### BubblePlot Style 55 (STATE level --or multiple districts-- bubblePlots with District Instructors highlighted
### by supplied bPlot.levels factor or without bPlot.levels factor)
#######################################################################################
if (55 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 55", prettyDate()), "\n")
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste("list(", paste0("PCT_", bPlot.levels, "=(100*length(grep('Yes',",
bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, ")))", collapse=","), ")"))
bPlot.levels <- as.list(bPlot.levels)
} else bPlot.levels <- list(A=NULL)
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__INSTRUCTOR_ENROLLMENT_STATUS"]][!is.na(INSTRUCTOR_ENROLLMENT_STATUS)]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- data.frame(eval(parse(text=paste("sgp_object@Data[,c(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data)),
intersect(grep('ENROLLMENT_STATUS', names(sgp_object@Data)), grep('INSTRUCTOR', names(sgp_object@Data))),",
"grep('CONTENT_AREA', names(sgp_object@Data)), grep('YEAR', names(sgp_object@Data)),",
paste0("grep('", bPlot.levels, "', names(sgp_object@Data))", collapse=","), "), with=FALSE]"))))
inst.index <- grep('INSTRUCTOR_NUMBER', names(tmp.bPlot.levels.data))
enroll.index <- grep('ENROLLMENT_STATUS', names(tmp.bPlot.levels.data))
tmp.bPlot.levels.data<- eval(parse(text=paste("data.table(INSTRUCTOR_NUMBER=c(", paste("tmp.bPlot.levels.data[,", inst.index, "]", collapse=","),
"), ENROLLMENT_STATUS=c(", paste("as.character(tmp.bPlot.levels.data[,", enroll.index, "])", collapse=","),
"), CONTENT_AREA=rep(tmp.bPlot.levels.data[, 'CONTENT_AREA'],", length(inst.index),
"), YEAR=rep(tmp.bPlot.levels.data[, 'YEAR'],", length(inst.index),
"), ", paste0(bPlot.levels, "=rep(tmp.bPlot.levels.data[, '", bPlot.levels, "'],", length(inst.index), ")", collapse=","),
", key=c('INSTRUCTOR_NUMBER', 'ENROLLMENT_STATUS'))[!is.na(INSTRUCTOR_NUMBER) & ENROLLMENT_STATUS=='Enrolled Instructor: Yes']")))
tmp.bPlot.levels.data <- tmp.bPlot.levels.data[, eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- data.frame(eval(parse(text=paste("sgp_object@Data[,c(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data)),
grep('CONTENT_AREA', names(sgp_object@Data)), grep('YEAR', names(sgp_object@Data)),",
paste0("grep('", bPlot.levels, "', names(sgp_object@Data))", collapse=","), "), with=FALSE]"))))
inst.index <- grep('INSTRUCTOR_NUMBER', names(tmp.bPlot.levels.data))
tmp.bPlot.levels.data<- eval(parse(text=paste("data.table(INSTRUCTOR_NUMBER=c(", paste("tmp.bPlot.levels.data[,", inst.index, "]", collapse=","),
"), CONTENT_AREA=rep(tmp.bPlot.levels.data[, 'CONTENT_AREA'],", length(inst.index),
"), YEAR=rep(tmp.bPlot.levels.data[, 'YEAR'],", length(inst.index),
"), ", paste0(bPlot.levels, "=rep(tmp.bPlot.levels.data[, '", bPlot.levels, "'],", length(inst.index), ")", collapse=","),
", key='INSTRUCTOR_NUMBER')[!is.na(INSTRUCTOR_NUMBER)]")))
tmp.bPlot.levels.data <- tmp.bPlot.levels.data[, eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data[!is.na(INSTRUCTOR_NUMBER)], bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (bPlot.levels.iter in unlist(bPlot.levels)) { ### Loop over bPlot.levels
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)[DISTRICT_NUMBER %in% my.iters$tmp.districts]
# Loop over unique schools IN DISTRICT ONLY
for (district_number.iter in intersect(my.iters$tmp.districts, bPlot.data$DISTRICT_NUMBER)) { ### Loop over DISTRICT NUMBERS
for (levels.iter in levels(factor(eval(parse(text=paste0("bPlot.data$PCT_", bPlot.levels.iter)))))) {
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
district.name.label <- as.character(bPlot.data[DISTRICT_NUMBER==district_number.iter]$DISTRICT_NAME[1])
### Create bubblePlot ###
if (nrow(bPlot.data[which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter & bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),]) > 0) {
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter & bPlot.data[["DISTRICT_NUMBER"]]==district_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data[["INSTRUCTOR_NAME"]], "-", bPlot.data[["SCHOOL_NAME"]]),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(district.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Number of Students",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels.iter, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.14),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(district.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
capwords(levels.iter), "Classrooms", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_55",
paste("District", district_number.iter, sep="_"), bPlot.levels.iter),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} # END if (...)
} ## END loop over y.variable.iter
} ## END loop over levels.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
} ## End loop over bPlot.levels.iter
message(paste("\tFinished bubblePlot Style 55", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 55
#######################################################################################
### BubblePlot Style 57 (District level bubblePlots with Schools' Instructors highlighted)
#######################################################################################
if (57 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 57", prettyDate()), "\n")
### Data sets and relevant quantities used for bubblePlots
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__INSTRUCTOR_ENROLLMENT_STATUS"]][!is.na(INSTRUCTOR_ENROLLMENT_STATUS)]
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR"]]
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data, bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (district_number.iter in my.iters$tmp.districts) { ### Loop over districts
# Subset data
bPlot.data <- tmp.bPlot.data[YEAR==year.iter & CONTENT_AREA==content_area.iter & DISTRICT_NUMBER==district_number.iter & MEDIAN_SGP_COUNT >= bPlot.minimum.n]
# Loop over unique schools IN DISTRICT ONLY
for (school_number.iter in intersect(my.iters$tmp.schools, bPlot.data$SCHOOL_NUMBER)) { ### Loop over schools
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
school.name.label <- as.character(bPlot.data[SCHOOL_NUMBER== school_number.iter]$SCHOOL_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[["SCHOOL_NUMBER"]]==school_number.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data[["INSTRUCTOR_NAME"]], "-", bPlot.data[["SCHOOL_NAME"]]),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(school.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Number of Students",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.14),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR="deeppink2",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(school.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
"Instructor", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_57", paste("District", district_number.iter, sep="_")),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## End loop over school_number.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
message(paste("\tFinished bubblePlot Style 57", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 57
#######################################################################################
### BubblePlot Style 59 (District level bubblePlots with Schools' Instructors highlighted, Demographic concentrations distinguished)
#######################################################################################
if (59 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 59", prettyDate()), "\n")
### Data sets and relevant quantities used for bubblePlots
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.txt <- parse(text=paste("list(", paste0("PCT_", bPlot.levels, "=(100*length(grep('Yes',",
bPlot.levels, "))/length(grep('Yes|No',", bPlot.levels, ")))", collapse=","), ")"))
bPlot.levels <- as.list(bPlot.levels)
} else bPlot.levels <- list(A=NULL)
if (bPlot.full.academic.year) {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__INSTRUCTOR_ENROLLMENT_STATUS"]][!is.na(INSTRUCTOR_ENROLLMENT_STATUS)]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- data.frame(eval(parse(text=paste("sgp_object@Data[,c(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data)),
intersect(grep('ENROLLMENT_STATUS', names(sgp_object@Data)), grep('INSTRUCTOR', names(sgp_object@Data))),",
"grep('CONTENT_AREA', names(sgp_object@Data)), grep('YEAR', names(sgp_object@Data)),",
paste0("grep('", bPlot.levels, "', names(sgp_object@Data))", collapse=","), "), with=FALSE]"))))
inst.index <- grep('INSTRUCTOR_NUMBER', names(tmp.bPlot.levels.data))
enroll.index <- grep('ENROLLMENT_STATUS', names(tmp.bPlot.levels.data))
tmp.bPlot.levels.data<- eval(parse(text=paste("data.table(INSTRUCTOR_NUMBER=c(", paste("tmp.bPlot.levels.data[,", inst.index, "]", collapse=","),
"), ENROLLMENT_STATUS=c(", paste("as.character(tmp.bPlot.levels.data[,", enroll.index, "])", collapse=","),
"), CONTENT_AREA=rep(tmp.bPlot.levels.data[, 'CONTENT_AREA'],", length(inst.index),
"), YEAR=rep(tmp.bPlot.levels.data[, 'YEAR'],", length(inst.index),
"), ", paste0(bPlot.levels, "=rep(tmp.bPlot.levels.data[, '", bPlot.levels, "'],", length(inst.index), ")", collapse=","),
", key=c('INSTRUCTOR_NUMBER', 'ENROLLMENT_STATUS'))[!is.na(INSTRUCTOR_NUMBER) & ENROLLMENT_STATUS=='Enrolled Instructor: Yes']")))
tmp.bPlot.levels.data <- tmp.bPlot.levels.data[, eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
} else {
tmp.bPlot.data <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR"]]
if (!is.null(bPlot.levels)) {
tmp.bPlot.levels.data <- data.frame(eval(parse(text=paste("sgp_object@Data[,c(grep('INSTRUCTOR_NUMBER', names(sgp_object@Data)),
grep('CONTENT_AREA', names(sgp_object@Data)), grep('YEAR', names(sgp_object@Data)),",
paste0("grep('", bPlot.levels, "', names(sgp_object@Data))", collapse=","), "), with=FALSE]"))))
inst.index <- grep('INSTRUCTOR_NUMBER', names(tmp.bPlot.levels.data))
tmp.bPlot.levels.data<- eval(parse(text=paste("data.table(INSTRUCTOR_NUMBER=c(", paste("tmp.bPlot.levels.data[,", inst.index, "]", collapse=","),
"), CONTENT_AREA=rep(tmp.bPlot.levels.data[, 'CONTENT_AREA'],", length(inst.index),
"), YEAR=rep(tmp.bPlot.levels.data[, 'YEAR'],", length(inst.index),
"), ", paste0(bPlot.levels, "=rep(tmp.bPlot.levels.data[, '", bPlot.levels, "'],", length(inst.index), ")", collapse=","),
", key='INSTRUCTOR_NUMBER')[!is.na(INSTRUCTOR_NUMBER)]")))
tmp.bPlot.levels.data <- tmp.bPlot.levels.data[, eval(tmp.bPlot.levels.txt), by=list(INSTRUCTOR_NUMBER, CONTENT_AREA, YEAR)]
setkeyv(tmp.bPlot.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
setkeyv(tmp.bPlot.levels.data, c("INSTRUCTOR_NUMBER", "CONTENT_AREA", "YEAR"))
tmp.bPlot.data <- tmp.bPlot.levels.data[tmp.bPlot.data]
for (l in seq_along(bPlot.level.cuts)) {
my.level.labels <- get.my.level.labels(bPlot.level.cuts[[l]])
eval(parse(text=paste0("tmp.bPlot.data$", paste0("PCT_", bPlot.levels[[l]]), "<- cut(tmp.bPlot.data$PCT_", bPlot.levels[[l]],
", bPlot.level.cuts[[l]], include.lowest=TRUE, labels=my.level.labels, ordered_result=TRUE)")))
}
}
}
# Merge in school and district names and anonymize school names (if requested)
tmp.bPlot.data <- names.merge(tmp.bPlot.data[!is.na(INSTRUCTOR_NUMBER)], bPlot.anonymize)
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(tmp.bPlot.data, bubblePlot_LEVEL)
### Start loops for bubblePlots
for (bPlot.levels.iter in unlist(bPlot.levels)) { ### Loop over bPlot.levels
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (district_number.iter in my.iters$tmp.districts) { ### Loop over districts
# Subset data
bPlot.data <- get.bPlot.data(tmp.bPlot.data)[DISTRICT_NUMBER==district_number.iter]
# Loop over unique schools IN DISTRICT ONLY
for (school_number.iter in intersect(my.iters$tmp.schools, bPlot.data$SCHOOL_NUMBER)) { ### Loop over schools
for (levels.iter in levels(factor(eval(parse(text=paste0("bPlot.data$PCT_", bPlot.levels.iter)))))) {
for (y.variable.iter in my.iters$tmp.y.variable) { ### Loop over CURRENT and PRIOR achievement (if requested)
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, y.variable.iter, bubblePlot_LEVEL)
school.name.label <- as.character(bPlot.data[SCHOOL_NUMBER== school_number.iter]$SCHOOL_NAME[1])
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["MEDIAN_SGP"]],
bubble_plot_data.Y=bPlot.data[[y.variable.iter]],
bubble_plot_data.SUBSET=which(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]==levels.iter),
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=bPlot.data[["MEDIAN_SGP_COUNT"]],
bubble_plot_data.LEVELS=bPlot.data[[paste0("PCT_", bPlot.levels.iter)]],
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[["MEDIAN_SGP"]], " (", bPlot.data[["MEDIAN_SGP_COUNT"]], ")"),
paste0(bPlot.data[[y.variable.iter]], " (", bPlot.data[[paste0(y.variable.iter, "_COUNT")]], ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Median Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=c(10, 25, 50, 100),
bubble_plot_labels.LEVELS=levels(bPlot.data[[paste0("PCT_", bPlot.levels.iter)]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Median SGP (Count)"),
paste(bPlot.labels$y.year.label, " (Count)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data[["INSTRUCTOR_NAME"]], "-", bPlot.data[["SCHOOL_NAME"]]),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(school.name.label, "Classroom Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, test.abbreviation.label, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="Number of Students",
bubble_plot_titles.LEGEND2_P1="Percentage Students",
bubble_plot_titles.LEGEND2_P2=paste(sapply(head(unlist(strsplit(bPlot.levels.iter, "_")), -1), capwords), collapse=" "),
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.03, 0.14),
bubble_plot_configs.BUBBLE_X_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.6, 5), 1, rep(0.6, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=seq(0,100,10),
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.01,
bubble_plot_configs.BUBBLE_COLOR=NULL,
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="TRUE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(school.name.label, year.iter, gsub(" ", "_", capwords(content_area.iter)),
capwords(levels.iter), capwords(bPlot.levels.iter), "Classrooms", bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_59",
paste("District", district_number.iter, sep="_"), bPlot.levels.iter),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END loop over y.variable.iter
} ## END loop over levels.iter
} ## End loop over school_number.iter
} ## End loop over district_number.iter
} ## End loop over content_area.iter
} ## End loop over year.iter
} ## End loop over bPlot.levels.iter
message(paste("\tFinished bubblePlot Style 59", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END bubblePlot style 59
#################################################################################################################
#################################################################################################################
####
#### Individual Level bubblePlots
####
#################################################################################################################
#################################################################################################################
### >= 100 are @Data level bubblePlots
if (any(bPlot.styles>=100)) {
bubblePlot_LEVEL <- "Individual"
if (any(c(150, 153) %in% bPlot.styles)) {
if (!bPlot.prior.achievement) {
message("bPlot.prior.achievement must be set to TRUE to use bubblePlot Style 150 &/or 153. Setting bPlot.prior.achievement = TRUE internally")
bPlot.prior.achievement <- TRUE
}
}
### Utility functions
get.my.cutscore.year <- function(state, content_area, year) {
tmp.cutscore.years <- sapply(strsplit(names(SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]])[
grep(content_area, names(SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]]))], "[.]"), function(x) x[2])
if (any(!is.na(tmp.cutscore.years))) {
if (year %in% tmp.cutscore.years) {
return(paste(content_area, year, sep="."))
} else {
if (year==sort(c(year, tmp.cutscore.years))[1]) {
return(content_area)
} else {
return(paste(content_area, sort(tmp.cutscore.years)[which(year==sort(c(year, tmp.cutscore.years)))-1], sep="."))
}
}
} else {
return(content_area)
}
}
### Get tmp.years, tmp.content_areas, and tmp.y.variable
my.iters <- get.my.iters(sgp_object@Data["VALID_CASE"], bubblePlot_LEVEL)
### Copy @Data
slot.data <- copy(sgp_object@Data)
### Create PRIOR Scale Score, SGP, SGP_TARGET and CONTENT_AREA
if (bPlot.prior.achievement) {
if (!all(c("SCALE_SCORE_PRIOR", "SGP_PRIOR", "SGP_TARGET_PRIOR", "CONTENT_AREA_PRIOR") %in% names(slot.data))) {
slot.data[, YEAR_INTEGER_TMP:=as.integer(as.factor(slot.data$YEAR))]
setkeyv(slot.data, c("ID", "CONTENT_AREA", "YEAR_INTEGER_TMP", "VALID_CASE")) ## CRITICAL that VALID_CASE is last in group
if (!"SCALE_SCORE_PRIOR" %in% names(slot.data)) {
slot.data[,SCALE_SCORE_PRIOR:=slot.data[SJ(ID, CONTENT_AREA, YEAR_INTEGER_TMP-1), mult="last"][["SCALE_SCORE"]]]
}
if (!"SGP_PRIOR" %in% names(slot.data)) {
slot.data[,SGP_PRIOR:=slot.data[SJ(ID, CONTENT_AREA, YEAR_INTEGER_TMP-1), mult="last"][["SGP"]]]
}
if (!"SGP_TARGET_PRIOR" %in% names(slot.data)) {
slot.data[,SGP_TARGET_PRIOR:=slot.data[SJ(ID, CONTENT_AREA, YEAR_INTEGER_TMP-1), mult="last"][["SGP_TARGET_3_YEAR"]]]
}
if (!"CONTENT_AREA_PRIOR" %in% names(slot.data) & "SGP_NORM_GROUP" %in% names(slot.data)) {
slot.data[,CONTENT_AREA_PRIOR:=SGP_NORM_GROUP]
levels(slot.data$CONTENT_AREA_PRIOR) <- sapply(strsplit(sapply(strsplit(sapply(strsplit(levels(slot.data$CONTENT_AREA_PRIOR), ";"), function(x) rev(x)[2]), "/"), function(x) rev(x)[1]), "_"), function(x) paste(head(x, -1), collapse=" "))
}
slot.data[,YEAR_INTEGER_TMP:=NULL]
}
}
} # END Individual Plot setup
###################################################################
### bubblePlot style 100 (Individual Student within Grade Chart)
###################################################################
if (100 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 100", prettyDate()))
### Key slot.data for fast subsetting
setkeyv(slot.data, c("VALID_CASE", "YEAR", "CONTENT_AREA", "DISTRICT_NUMBER"))
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (district.iter in seq_along(my.iters$tmp.districts)) { ### Loop over districts (seq_along to get integer for anonymize)
# Subset data
tmp.bPlot.data.1 <- slot.data[SJ("VALID_CASE", year.iter, content_area.iter, my.iters$tmp.districts[district.iter])]
tmp.unique.schools <- my.iters$tmp.schools[my.iters$tmp.schools %in% unique(tmp.bPlot.data.1$SCHOOL_NUMBER)]
for (school.iter in seq_along(tmp.unique.schools)) { ### Loop over schools (seq_along to get integer for anonymize)
# Subset data
tmp.bPlot.data <- tmp.bPlot.data.1[SCHOOL_NUMBER==tmp.unique.schools[school.iter] & !is.na(SGP) & !is.na(SCALE_SCORE)]
for (grade.iter in intersect(SGP::SGPstateData[[state]][["Student_Report_Information"]][["Grades_Reported"]][[content_area.iter]],
sort(unique(tmp.bPlot.data[['GRADE']])))) {
bPlot.data <- subset(tmp.bPlot.data, GRADE==grade.iter)
if (dim(bPlot.data)[1] > 0) {
# Anonymize district, school and student names (if requested)
if (bPlot.anonymize) {
bPlot.data$FIRST_NAME <- "Student"; bPlot.data$LAST_NAME <- seq(dim(bPlot.data)[1])
bPlot.data$SCHOOL_NAME <- paste("Sample School", school.iter); bPlot.data$DISTRICT_NAME <- paste("Sample District", district.iter)
}
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, "SCALE_SCORE_PRIOR", bubblePlot_LEVEL)
# Create cutscore ranges
my.content_area <- get.my.cutscore.year(state, content_area.iter, as.character(year.iter))
tmp.y.range <- extendrange(c(bPlot.data[["SCALE_SCORE"]],
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]), f=0.1)
tmp.loss.hoss <- SGP::SGPstateData[[state]][["Achievement"]][["Knots_Boundaries"]][[content_area.iter]][[paste("loss.hoss", grade.iter, sep="_")]]
tmp.y.ticks <- sort(c(max(tmp.loss.hoss[1], tmp.y.range[1]), min(tmp.loss.hoss[2], tmp.y.range[2]),
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]))
# Get median SGP for grade, school, content area combination
if (bPlot.full.academic.year) {
school.content_area.grade.median <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__GRADE__SCHOOL_ENROLLMENT_STATUS"]][
SCHOOL_ENROLLMENT_STATUS=="Enrolled School: Yes" & SCHOOL_NUMBER==tmp.unique.schools[school.iter] &
CONTENT_AREA==content_area.iter & YEAR==year.iter & GRADE==grade.iter][["MEDIAN_SGP"]]
if (length(school.content_area.grade.median)==0) school.content_area.grade.median <- NA
} else {
school.content_area.grade.median <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__CONTENT_AREA__YEAR__GRADE"]][
SCHOOL_NUMBER==tmp.unique.schools[school.iter] & CONTENT_AREA==content_area.iter & YEAR==year.iter & GRADE==grade.iter][["MEDIAN_SGP"]]
if (length(school.content_area.grade.median)==0) school.content_area.grade.median <- NA
}
### Custom draft message with two median SGP lines
if (!is.na(school.content_area.grade.median)) {
school.content_area.grade.median.line <-
c(paste0("grid.lines(x=unit(", school.content_area.grade.median, ", 'native'), y=c(0.03,0.97), gp=gpar(col='blue', lwd=1.75, lty=2, alpha=0.75))"),
paste0("grid.text('Grade ", grade.iter, " Median = ", school.content_area.grade.median, "', x=unit(", school.content_area.grade.median,
", 'native'), y=0.005, gp=gpar(col='blue', cex=0.85))"))
} else {
school.content_area.grade.median.line <- NULL
}
bPlot.message.style.100 <- c("grid.text(x=unit(50, 'native'), y=unit(mean(bubble_plot_data.Y), 'native'), 'CONFIDENTIAL \n STUDENT DATA -\n DO NOT DISTRIBUTE',
rot=-30, gp=gpar(col='grey80', cex=2, alpha=0.8, fontface=2))",
school.content_area.grade.median.line)
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[["SGP"]],
bubble_plot_data.Y=bPlot.data[["SCALE_SCORE"]],
bubble_plot_data.SUBSET=NULL,
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=rep(50, length(bPlot.data[["SGP"]])),
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(
paste0(bPlot.data$SGP, " (", bPlot.data$SGP_TARGET, ")"),
paste0(bPlot.data$ACHIEVEMENT_LEVEL_PRIOR, " (", bPlot.data$SCALE_SCORE_PRIOR, ")"),
paste0(bPlot.data$ACHIEVEMENT_LEVEL, " (", bPlot.data$SCALE_SCORE, ")")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label$CURRENT),
bubble_plot_labels.SIZE=NULL,
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(
paste(bPlot.labels$x.year.label, "Student Growth Percentile (Target)"),
paste0(bPlot.labels$y.year.label$PRIOR, " (Scale Score)"),
paste0(bPlot.labels$y.year.label$CURRENT, " (Scale Score)")),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data$FIRST_NAME, bPlot.data$LAST_NAME),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(bPlot.data$SCHOOL_NAME[1], "Student Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, "Grade", grade.iter, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.07, 0.07),
bubble_plot_configs.BUBBLE_X_TICKS=c(1, seq(10,90,10), 99),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.7, 5), 1, rep(0.7, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BANDS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BAND_LABELS=SGP::SGPstateData[[state]][["Achievement"]][["Levels"]][["Labels"]],
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR="blue",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="FALSE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_BACKGROUND_LABELS=NULL,
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message.style.100,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(gsub(" ", "_", bPlot.data$SCHOOL_NAME[1]), "Grade", grade.iter,
year.iter, gsub(" ", "_", capwords(content_area.iter)), bPlot.labels$pdf.title, sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Individual", "Style_100", gsub(" ", "_", bPlot.data$DISTRICT_NAME[1])),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END if dim(bPlot.data)[1] > 0
} ## END grade.iter loop
} ## END school.iter loop
} ## END district.iter loop
} ## END content_area.iter loop
} ## END year.iter loop
message(paste("\tFinished bubblePlot Style 100", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END if bubblePlot style 100
######################################################################
### bubblePlot style 150 (Individual Student within INSTRUCTOR Chart)
######################################################################
if (150 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 150", prettyDate()), "\n")
if (bPlot.demo) {
bPlot.anonymize <- TRUE
setkeyv(slot.data, c("VALID_CASE", "YEAR", "CONTENT_AREA", "GRADE"))
my.iters$tmp.districts <- '-999'; my.iters$tmp.schools <- '-99'
} else setkeyv(slot.data, c("VALID_CASE", "YEAR", "CONTENT_AREA", "DISTRICT_NUMBER"))
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (district.iter in seq_along(my.iters$tmp.districts)) { ### Loop over districts (seq_along to get integer for anonymize)
# Subset data
if (bPlot.demo) {
tmp.ids <- list()
tmp.grades.reported <- SGP::SGPstateData[[state]][["Student_Report_Information"]][["Grades_Reported"]][[content_area.iter]][-1]
tmp.grades.reported <- as.character(tmp.grades.reported[tmp.grades.reported %in% unique(slot.data["VALID_CASE"][["GRADE"]])])
for (i in seq_along(tmp.grades.reported)) {
tmp.ids[[i]] <- as.character(sample(unique(slot.data[SJ("VALID_CASE", year.iter, content_area.iter, tmp.grades.reported[i])][['ID']]), 30))
}
tmp.bPlot.data.1.long <- slot.data[SJ("VALID_CASE", year.iter, content_area.iter)][ID %in% unlist(tmp.ids)]
tmp.bPlot.data.1.long[['INSTRUCTOR_NUMBER']] <- factor(paste0("Grade_", tmp.bPlot.data.1.long[['GRADE']]))
tmp.bPlot.data.1.long[['INSTRUCTOR_NAME']] <- factor('Psuedo-Instructor')
tmp.bPlot.data.1.long[['SCHOOL_NUMBER']] <- factor('-99')
tmp.bPlot.data.1.long[['SCHOOL_NAME']] <- factor('Psuedo School')
tmp.bPlot.data.1.long[['DISTRICT_NUMBER']] <- factor('-999')
tmp.bPlot.data.1.long[['DISTRICT_NAME']] <- factor('Psuedo District')
setkeyv(tmp.bPlot.data.1.long, "INSTRUCTOR_NUMBER")
} else {
if (!"INSTRUCTOR_NUMBER" %in% names(sgp_object@Data_Supplementary)) {
stop("\tNOTE: Indvidividual level Instructor bubble plots require an INSTRUCTOR_NUMBER lookup table embedded in @Data_Supplementary")
}
tmp.bPlot.data.1.long <- data.table(slot.data[SJ("VALID_CASE", year.iter, content_area.iter, my.iters$tmp.districts[district.iter])],
key=c("ID", "CONTENT_AREA", "YEAR"))[sgp_object@Data_Supplementary$INSTRUCTOR_NUMBER, nomatch=0]
}
setkeyv(tmp.bPlot.data.1.long, "INSTRUCTOR_NUMBER")
tmp.unique.schools <- my.iters$tmp.schools[my.iters$tmp.schools %in% unique(tmp.bPlot.data.1.long[['SCHOOL_NUMBER']])]
for (school.iter in seq_along(tmp.unique.schools)) { ### Loop over schools (seq_along to get integer for anonymize)
# Subset data
tmp.bPlot.data <- tmp.bPlot.data.1.long[SCHOOL_NUMBER==tmp.unique.schools[school.iter] & !is.na(SGP)]
for (instructor.iter in sort(unique(tmp.bPlot.data[['INSTRUCTOR_NUMBER']]))) { ### Loop over unique teachers in school
bPlot.data <- tmp.bPlot.data[SJ(instructor.iter)]
if (dim(bPlot.data)[1] > 0) {
for (grade.iter in intersect(SGP::SGPstateData[[state]][["Student_Report_Information"]][["Grades_Reported"]][[content_area.iter]],
sort(unique(bPlot.data[['GRADE']])))) { ### Loop over unique grades levels for instructor (usually only one)
# Anonymize district, school and student names (if requested)
if (bPlot.anonymize) {
bPlot.data$FIRST_NAME <- "Student"; bPlot.data$LAST_NAME <- seq(dim(bPlot.data)[1])
bPlot.data$SCHOOL_NAME <- paste("Psuedo School", school.iter); bPlot.data$DISTRICT_NAME <- paste("Psuedo District", district.iter)
}
# Create labels and file path
bPlot.labels <- create.bPlot.labels(year.iter, "SCALE_SCORE", bubblePlot_LEVEL) # Only produce "Current Year" plots
prior.year <- paste(as.numeric(unlist(strsplit(as.character(year.iter), "_")))-1, collapse="_")
# Create cutscore ranges
my.content_area <- get.my.cutscore.year(state, content_area.iter, as.character(bPlot.labels$y.year))
tmp.y.range <- extendrange(c(bPlot.data[["SCALE_SCORE"]],
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]), f=0.1)
tmp.loss.hoss <- SGP::SGPstateData[[state]][["Achievement"]][["Knots_Boundaries"]][[content_area.iter]][[paste("loss.hoss", grade.iter, sep="_")]]
tmp.y.ticks <- sort(c(max(tmp.loss.hoss[1], tmp.y.range[1]), min(tmp.loss.hoss[2], tmp.y.range[2]),
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]))
# Get median SGP for grade, school, content area combination
instructor.content_area.grade.median <- median(bPlot.data$SGP, na.rm=TRUE)
### Custom draft message with two median SGP lines
bPlot.message.style.150 <- c("grid.text(x=unit(50, 'native'), y=unit(mean(bubble_plot_data.Y), 'native'), 'CONFIDENTIAL \n STUDENT DATA -\n DO NOT DISTRIBUTE',
rot=-30, gp=gpar(col='grey80', cex=2, alpha=0.8, fontface=2))",
paste0("grid.lines(x=unit(", instructor.content_area.grade.median,
", 'native'), y=c(0.03,0.97), gp=gpar(col='blue', lwd=1.75, lty=2, alpha=0.75))"),
paste0("grid.text('Classroom Median = ", instructor.content_area.grade.median, "', x=unit(",
instructor.content_area.grade.median, ", 'native'), y=0.005, gp=gpar(col='blue', cex=0.85))"))
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[['SGP']],
bubble_plot_data.Y=bPlot.data[['SCALE_SCORE']],
bubble_plot_data.SUBSET=NULL,
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=rep(50, length(bPlot.data[['SGP']])),
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(paste0(bPlot.data[['SGP']], " (", bPlot.data[['SGP_TARGET']], ")"),
bPlot.data[['SCALE_SCORE']],
paste0(bPlot.data[['SGP_PRIOR']], " (", bPlot.data[['SGP_TARGET_PRIOR']], ")"),
paste0(bPlot.data[['SCALE_SCORE_PRIOR']], " (", bPlot.data[['ACHIEVEMENT_LEVEL_PRIOR']], ")")),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Student Growth Percentile (Target)"),
paste(bPlot.labels$x.year.label, "Scale Score"),
paste(prior.year, "Prior Student Growth Percentile (Target)"),
paste(prior.year, "Prior Scale Score (Achievement)")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=NULL,
bubble_plot_labels.LEVELS=NULL,
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data$FIRST_NAME, bPlot.data$LAST_NAME),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(bPlot.data$SCHOOL_NAME[1], "Student Performance"),
bubble_plot_titles.SUB2=paste(bPlot.labels$x.year.label, "Instructor", instructor.iter, capwords(content_area.iter)),
bubble_plot_titles.LEGEND1="",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.07, 0.07),
bubble_plot_configs.BUBBLE_X_TICKS=c(1, seq(10,90,10), 99),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.7, 5), 1, rep(0.7, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BANDS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BAND_LABELS=SGP::SGPstateData[[state]][["Achievement"]][["Levels"]][["Labels"]],
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR="blue",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="FALSE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_BACKGROUND_LABELS=NULL,
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message.style.150,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste("Instructor", instructor.iter, year.iter, "Grade", grade.iter,
gsub(" ", "_", capwords(content_area.iter)), "Student_Plot", sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_150",
gsub(" ", "_", bPlot.data$DISTRICT_NAME[1]), gsub(" ", "_", bPlot.data$SCHOOL_NAME[1])),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END grade.iter loop
} ## END if dim(bPlot.data)[1] > 0
} ## END instructor.iter loop
} ## END school.iter loop
} ## END district.iter loop
} ## END content_area.iter loop
} ## END year.iter loop
message(paste("\tFinished bubblePlot Style 150", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END if bubblePlot style 150
######################################################################
### bubblePlot style 153 (Individual Student within INSTRUCTOR Chart) - course sequence specific
######################################################################
if (153 %in% bPlot.styles) {
started.at <- proc.time()
message(paste("\tStarted bubblePlot Style 153", prettyDate()), "\n")
if (bPlot.demo) {
bPlot.anonymize <- TRUE
setkeyv(slot.data, c("VALID_CASE", "YEAR", "CONTENT_AREA", "GRADE"))
my.iters$tmp.districts <- '-999'; my.iters$tmp.schools <- '-99'
} else setkeyv(slot.data, c("VALID_CASE", "YEAR", "CONTENT_AREA", "DISTRICT_NUMBER"))
### Start loops for bubblePlots
for (year.iter in my.iters$tmp.years) { ### Loop over year
for (content_area.iter in my.iters$tmp.content_areas) { ### Loop over content areas
for (district.iter in seq_along(my.iters$tmp.districts)) { ### Loop over districts (seq_along to get integer for anonymize)
# Subset data
if (bPlot.demo) {
tmp.ids <- list()
tmp.grades.reported <- SGP::SGPstateData[[state]][["Student_Report_Information"]][["Grades_Reported"]][[content_area.iter]][-1]
tmp.grades.reported <- as.character(tmp.grades.reported[tmp.grades.reported %in% unique(slot.data["VALID_CASE"][["GRADE"]])])
for (i in seq_along(tmp.grades.reported)) {
tmp.ids[[i]] <- as.character(sample(unique(slot.data[SJ("VALID_CASE", year.iter, content_area.iter, tmp.grades.reported[i])][['ID']]), 30))
}
tmp.bPlot.data.1.long <- slot.data[SJ("VALID_CASE", year.iter, content_area.iter)][ID %in% unlist(tmp.ids)]
tmp.bPlot.data.1.long[['INSTRUCTOR_NUMBER']] <- factor(paste0("Grade_", tmp.bPlot.data.1.long[['GRADE']]))
tmp.bPlot.data.1.long[['INSTRUCTOR_NAME']] <- factor('Psuedo-Instructor')
tmp.bPlot.data.1.long[['SCHOOL_NUMBER']] <- factor('-99')
tmp.bPlot.data.1.long[['SCHOOL_NAME']] <- factor('Pseudo School')
tmp.bPlot.data.1.long[['DISTRICT_NUMBER']] <- factor('-999')
tmp.bPlot.data.1.long[['DISTRICT_NAME']] <- factor('Psuedo District')
} else {
if (!"INSTRUCTOR_NUMBER" %in% names(sgp_object@Data_Supplementary)) {
stop("\tNOTE: Indvidividual level Instructor bubble plots require an INSTRUCTOR_NUMBER lookup table embedded in @Data_Supplementary")
}
tmp.bPlot.data.1.long <- data.table(slot.data[SJ("VALID_CASE", year.iter, content_area.iter, my.iters$tmp.districts[district.iter])],
key=c("ID", "CONTENT_AREA", "YEAR"))[sgp_object@Data_Supplementary$INSTRUCTOR_NUMBER, nomatch=0]
}
tmp.unique.schools <- my.iters$tmp.schools[my.iters$tmp.schools %in% unique(tmp.bPlot.data.1.long[['SCHOOL_NUMBER']])]
for (school.iter in seq_along(tmp.unique.schools)) { ### Loop over schools (seq_along to get integer for anonymize)
# Subset data
tmp.bPlot.data <- tmp.bPlot.data.1.long[SCHOOL_NUMBER==tmp.unique.schools[school.iter] & !is.na(SGP)]
for (instructor.iter in sort(unique(tmp.bPlot.data[['INSTRUCTOR_NUMBER']]))) { ### Loop over unique teachers in school
bPlot.data <- subset(tmp.bPlot.data, INSTRUCTOR_NUMBER==instructor.iter)
if ("INSTRUCTOR_LAST_NAME" %in% names(bPlot.data)) {
tmp.instructor.reference <- paste(bPlot.data$INSTRUCTOR_FIRST_NAME[1], bPlot.data$INSTRUCTOR_LAST_NAME[1])
} else {
tmp.instructor.reference <- instructor.iter
}
if (dim(bPlot.data)[1] > 1) { # had error when only 1 kid per teacher
for (grade.iter in sort(unique(bPlot.data[['GRADE']]))) { ### Loop over grades levels. Only one in course sequences
# Anonymize district, school and student names (if requested)
if (bPlot.anonymize) {
bPlot.data$FIRST_NAME <- "Student"; bPlot.data$LAST_NAME <- seq(dim(bPlot.data)[1])
bPlot.data$SCHOOL_NAME <- paste("Psuedo School", school.iter); bPlot.data$DISTRICT_NAME <- paste("Psuedo District", district.iter)
}
# Create labels
bPlot.labels <- create.bPlot.labels(year.iter, "SCALE_SCORE", bubblePlot_LEVEL) # Only produce "Current Year" plots
prior.year <- paste(as.numeric(unlist(strsplit(as.character(year.iter), "_")))-1, collapse="_")
# Create cutscore ranges
my.content_area <- get.my.cutscore.year(state, content_area.iter, as.character(bPlot.labels$y.year))
tmp.y.range <- extendrange(c(bPlot.data[["SCALE_SCORE"]],
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]), f=0.1)
tmp.loss.hoss <- SGP::SGPstateData[[state]][["Achievement"]][["Knots_Boundaries"]][[content_area.iter]][[paste("loss.hoss", grade.iter, sep="_")]]
tmp.y.ticks <- sort(c(max(tmp.loss.hoss[1], tmp.y.range[1]), min(tmp.loss.hoss[2], tmp.y.range[2]),
SGP::SGPstateData[[state]][["Achievement"]][["Cutscores"]][[my.content_area]][[paste("GRADE", grade.iter, sep="_")]]))
# Get median SGP for grade, school, content area combination
# Report 'Official' Median. Should be the same as median(bPlot.data$SGP, na.rm=TRUE). Use that if NULL for some reason (prevents error)
if (bPlot.full.academic.year) {
instructor.content_area.grade.median <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__GRADE__INSTRUCTOR_ENROLLMENT_STATUS"]][
SCHOOL_NUMBER==tmp.unique.schools[school.iter] & INSTRUCTOR_NUMBER==instructor.iter & CONTENT_AREA==content_area.iter & YEAR==year.iter & GRADE==grade.iter][["MEDIAN_SGP"]]
} else {
instructor.content_area.grade.median <- sgp_object@Summary[["SCHOOL_NUMBER"]][["SCHOOL_NUMBER__INSTRUCTOR_NUMBER__CONTENT_AREA__YEAR__GRADE"]][
SCHOOL_NUMBER==tmp.unique.schools[school.iter] & INSTRUCTOR_NUMBER==instructor.iter & CONTENT_AREA==content_area.iter & YEAR==year.iter & GRADE==grade.iter][["MEDIAN_SGP"]]
}
if (is.null(instructor.content_area.grade.median)) instructor.content_area.grade.median <- median(bPlot.data$SGP, na.rm=TRUE)
if (bPlot.demo) instructor.content_area.grade.median <- median(bPlot.data$SGP, na.rm=TRUE)
### Custom message with two median SGP lines
bPlot.message.style.153 <- c("grid.text(x=unit(50, 'native'), y=unit(mean(bubble_plot_data.Y), 'native'), 'CONFIDENTIAL \n STUDENT DATA -\n DO NOT DISTRIBUTE',
rot=-30, gp=gpar(col='grey80', cex=2, alpha=0.8, fontface=2))",
paste0("grid.lines(x=unit(", instructor.content_area.grade.median, ", 'native'), y=c(0.03,0.97), gp=gpar(col='blue', lwd=1.75, lty=2, alpha=0.75))"),
paste0("grid.text('Classroom Median = ", instructor.content_area.grade.median, "', x=unit(", instructor.content_area.grade.median,
", 'native'), y=0.005, gp=gpar(col='blue', cex=0.85))"))
### Create bubblePlot ###
bubblePlot(
bubble_plot_data.X=bPlot.data[['SGP']],
bubble_plot_data.Y=bPlot.data[['SCALE_SCORE']],
bubble_plot_data.SUBSET=NULL,
bubble_plot_data.INDICATE=NULL,
bubble_plot_data.BUBBLE_CENTER_LABEL=NULL,
bubble_plot_data.SIZE=rep(50, length(bPlot.data[['SGP']])),
bubble_plot_data.LEVELS=NULL,
bubble_plot_data.BUBBLE_TIPS_LINES=list(bPlot.data[['SGP']], bPlot.data[['SCALE_SCORE']],
sapply(gsub("_", " ", as.character(bPlot.data[["CONTENT_AREA_PRIOR"]])), capwords), # capwords not working with factors with "_" in them...
bPlot.data[['SGP_PRIOR']],
paste0(bPlot.data[['SCALE_SCORE_PRIOR']], " (", bPlot.data[['ACHIEVEMENT_LEVEL_PRIOR']], ")")),
bubble_plot_labels.BUBBLE_TIPS_LINES=list(paste(bPlot.labels$x.year.label, "Student Growth Percentile"),
paste(bPlot.labels$x.year.label, "Scale Score"),
paste(prior.year, "Prior Subject / Norm Group"),
paste(prior.year, "Prior Student Growth Percentile"),
paste(prior.year, "Prior Scale Score (Achievement)")),
bubble_plot_labels.X=c("Growth", paste(bPlot.labels$x.year.label, "Student Growth Percentile")),
bubble_plot_labels.Y=c("Achievement", bPlot.labels$y.year.label),
bubble_plot_labels.SIZE=NULL,
bubble_plot_labels.LEVELS=NULL, #levels(bubblePlot[["subset.factor"]]),
bubble_plot_labels.BUBBLE_TITLES=paste(bPlot.data$FIRST_NAME, bPlot.data$LAST_NAME),
bubble_plot_titles.MAIN=bPlot.labels$main.title,
bubble_plot_titles.SUB1=paste(bPlot.labels$x.year.label, bPlot.data$SCHOOL_NAME[1], "Student", capwords(content_area.iter), "Performance"),
bubble_plot_titles.SUB2=paste("Instructor:", tmp.instructor.reference),
bubble_plot_titles.LEGEND1="",
bubble_plot_titles.LEGEND2_P1=NULL,
bubble_plot_titles.LEGEND2_P2=NULL,
bubble_plot_configs.BUBBLE_MIN_MAX=c(0.07, 0.07),
bubble_plot_configs.BUBBLE_X_TICKS=c(1, seq(10,90,10), 99),
bubble_plot_configs.BUBBLE_X_TICKS_SIZE=c(rep(0.7, 5), 1, rep(0.7, 5)),
bubble_plot_configs.BUBBLE_Y_TICKS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BANDS=tmp.y.ticks,
bubble_plot_configs.BUBBLE_Y_BAND_LABELS=SGP::SGPstateData[[state]][["Achievement"]][["Levels"]][["Labels"]],
bubble_plot_configs.BUBBLE_SUBSET_INCREASE=0.00,
bubble_plot_configs.BUBBLE_COLOR="blue",
bubble_plot_configs.BUBBLE_SUBSET_ALPHA=list(Transparent=0.3, Opaque=0.9),
bubble_plot_configs.BUBBLE_TIPS="TRUE",
bubble_plot_configs.BUBBLE_PLOT_DEVICE=bPlot.output,
bubble_plot_configs.BUBBLE_PLOT_FORMAT=bPlot.format,
bubble_plot_configs.BUBBLE_PLOT_LEGEND="FALSE",
bubble_plot_configs.BUBBLE_PLOT_TITLE="TRUE",
bubble_plot_configs.BUBBLE_PLOT_BACKGROUND_LABELS=NULL,
bubble_plot_configs.BUBBLE_PLOT_EXTRAS=bPlot.message.style.153,
bubble_plot_configs.BUBBLE_PLOT_NAME=paste0(paste(gsub(" ", "_", bPlot.data$SCHOOL_NAME[1]), "Instructor",
instructor.iter, year.iter, gsub(" ", "_", capwords(content_area.iter)), "Student_Plot", sep="_"), ".pdf"),
bubble_plot_configs.BUBBLE_PLOT_PATH=file.path(bPlot.folder, year.iter, "Instructor", "Style_153",
gsub(" ", "_", bPlot.data$DISTRICT_NAME[1]), gsub(" ", "_", bPlot.data$SCHOOL_NAME[1])),
bubble_plot_pdftk.CREATE_CATALOG=FALSE)
} ## END grade.iter loop
} ## END if dim(bPlot.data)[1] > 0
} ## END instructor.iter loop
} ## END school.iter loop
} ## END district.iter loop
} ## END content_area.iter loop
} ## END year.iter loop
message(paste("\tFinished bubblePlot Style 153", prettyDate(), "in", convertTime(timetakenSGP(started.at)), "\n"))
} ## END if bubblePlot style 153
####
#### END bubblePlot_Styles
####
} ## END bubblePlot_Styles function
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.