SGP (version 0.0-8.0)

studentGrowthPercentiles: Student Growth Percentiles

Description

Function to calculate student growth percentiles using large scale assessment data. Outputs growth percentiles for each student and supplies various options as function arguments. Results from this function are utilized to calculate percentile growth projections/trajectories using the studentGrowthProjections function.

Usage

studentGrowthPercentiles(panel.data,                                                    
                         sgp.labels,                                          
                         panel.data.vnames,                                 
                         grade.progression,                               
                         num.prior,                                         
                         subset.grade,                                     
                         percentile.cuts,
                         growth.levels,
                         use.my.knots.boundaries,                       
                         use.my.coefficient.matrices,                 
                         calculate.confidence.intervals,
                         print.other.gp=FALSE,                             
                         print.sgp.order=FALSE,
                         calculate.sgps=TRUE,                                       
                         rq.method="br",                                           
                         knot.cut.percentiles=c(0.2,0.4,0.6,0.8),
                         exact.grade.progression.sequence=FALSE,                 
                         convert.0and100=TRUE,                                   
                         sgp.quantiles="Percentiles",                          
                         percuts.digits=0,                                  
                         isotonize=TRUE,                                 
                         convert.using.loss.hoss=TRUE,                
                         goodness.of.fit=TRUE)

Arguments

panel.data
REQUIRED. Object of class list, data.frame, or matrix containing longitudinal student data in wide format. If supplied as part of a list, data should be contained in panel.data$Panel_Data. Data must be formatted so that student ID is the f
sgp.labels
REQUIRED. A list, sgp.labels, of the form list(my.year= , my.subject= ) or list(my.year= , my.subject= , my.extra.label). The user-specified values are used to save the student growth percentiles, c
panel.data.vnames
Vector of variables to use in student growth percentile calculations. If not specified, function attempts to use all available variables.
grade.progression
Preferred argument to specify a student grade/time progression in the data. For example, 3:4 would indicate to subset the data where the two most recent years of data available are 3 and 4, respectively. Also allows for non-sequential grade
num.prior
Number of prior scores one wishes to use in the analysis. Defaults to num.panels-1. If num.prior=1, then only 1st order growth percentiles are computed, if num.prior=2, then 1st and 2nd order are computed, if <
subset.grade
Student grade level for sub-setting. If the data fed into the function contains multiple grades, setting subset.grade=5 selects out those students in grade five in the most recent year of the data. If no sub-setting is desired, argument d
percentile.cuts
Additional percentile cuts (supplied as a vector) between 1 and 99 associated with each student's conditional distribution. Default is to provide NO growth percentile cuts (scale scores associated with those growth percentiles) for each student.
growth.levels
A two letter state acronym or a list of the form list(my.cuts= , my.levels= ) specifying a vector of cuts between 1 and 99 (e.g., 35, 65) and the associated qualitative levels associated with the cuts (e.g., low, typical, and high). Note t
use.my.knots.boundaries
A list of the form list(my.year= , my.subject= ) specifying a set of pre-calculated knots and boundaries for B-spline calculations. Most often used to utilize knots and boundaries calculated from a previous analysis. Knots and boundaries
use.my.coefficient.matrices
A list of the form list(my.year= , my.subject= ) specifying a set of pre-calculated coefficient matrices to use for student growth percentile calculations. Can be used to calculate baseline referenced student growth percentiles or to calc
calculate.confidence.intervals
A list of the form list(state= , confidence.quantiles= , simulation.iterations= , distribution= , round= ) specifying the state from which to use the CSEMs (note, CSEM data must be embedded in stateData set. To have
print.other.gp
Boolean argument (defaults to FALSE) indicating whether growth percentiles of all orders should be returned. The default returns only the highest order growth percentile for each student.
print.sgp.order
Boolean argument (defaults to FALSE) indicating whether the order of the growth percentile should be provided in addition to the SGP itself.
calculate.sgps
Boolean argument (defaults to TRUE) indicating whether student growth percentiles should be calculated following coefficient matrix calculation.
rq.method
Argument to define the estimation method used in the quantile regression calculations. The default is the the "br" method referring to the Barrodale and Robert's L1 estimation detailed in Koenker (2005) and in the help for the quantile regres
knot.cut.percentiles
Argument that specifies the quantiles to be used for calculation of B-spline knots. Default is to place knots at the 0.2, 0.4, 0.6, and 0.8 quantiles.
exact.grade.progression.sequence
Boolean argument indicating whether the grade.progression supplied is used exactly (TRUE) as supplied or whether lower order analyses are run as part of the whole analysis (FALSE--the default).
convert.0and100
Boolean argument (defaults to TRUE) indicating whether conversion of growth percentiles of 0 and 100 to growth percentiles of 1 and 99, respectively, occurs. The default produces growth percentiles ranging from 1 to 99.
sgp.quantiles
Argument to specify quantiles for quantile regression estimation. Default is Percentiles. User can additionally submit a vector of quantiles (between 0 and 1). Goodness of fit output only available currently for PERCENTILES.
percuts.digits
Argument specifying how many digits (defaults to 2) to print percentile cuts (if asked for) with.
isotonize
Boolean argument (defaults to TRUE) indicating whether quantile regression results are isotonized to prevent quantile crossing following the methods derived by Dette & Volgushev (2008).
convert.using.loss.hoss
Boolean argument (defaults to TRUE) indicating whether requested percentile cuts are adjusted using the lowest obtainable scale score (LOSS) and highest obtainable scale score (HOSS). Those percentile cuts above the HOSS are replaced with the HOSS and
goodness.of.fit
Boolean argument (defaults to TRUE) indicating whether to produce goodness of fit results associated with produced student growth percentiles. Goodness of fit results are grid.grobs stored in panel.data$Goodness_of_Fit $my.year.my.s

Value

  • Function returns an object of class list containing objects: Coefficient_Matrices, Goodness_of_Fit, Knots_Boundaries, Panel_Data, SGPercentiles, Simulated_SGPs.

Details

Typical use of the function is to submit a data frame to the function containing records of all students across all grades, allowing the function to subset out specific grade progressions using grade.progression. Additional uses include using pre-calculated results to recalculate SGPs for baseline referencing. studentGrowthPercentiles examples provide code for use in analyzing assessment data across multiple grades.

References

Betebenner, D. W. (2009). Norm- and criterion-referenced student growth. Educational Measurement: Issues and Practice, 28(4):42-51.

Betebenner, D. W. (2008). Toward a normative understanding of student growth. In K. E. Ryan & L. A. Shepard (Eds.), The Future of Test Based Accountability (pp. 155-170). New York: Routledge.

Dette, H. & Volgushev, S. (2008). Non-crossing non-parametric estimates of quantile curves. Journal of the Royal Statistical Society B, 70(3), 609-627.

Koenker, R. (2005). Quantile regression. Cambridge: Cambridge University Press.

See Also

studentGrowthProjections, sgpData, sgpData_LONG, stateData

Examples

Run this code
## Calculate 4th grade student growth percentiles using included sgpData

sgp_g4 <- studentGrowthPercentiles(panel.data=sgpData,
                sgp.labels=list(my.year=2011, my.subject="Reading"),
                percentile.cuts=c(1,35,65,99),
                subset.grade=4,
                num.prior=1)

## NOTE: "grade.progression" can be used in place of "subset.grade" and "num.prior" 
 
sgp_g4_v2 <- studentGrowthPercentiles(panel.data=sgpData,
                   sgp.labels=list(my.year=2011, my.subject="Reading"),
                   percentile.cuts=c(1,35,65,99),
                   grade.progression=c(3,4))

identical(sgp_g4$SGPercentiles, sgp_g4_v2$SGPercentiles)

## Established state Knots and Boundaries are available in the supplied stateData
## file and used by supplying the appropriate two letter state acronym.
 
sgp_g4_DEMO <- studentGrowthPercentiles(panel.data=sgpData,
                   sgp.labels=list(my.year=2011, my.subject="Reading"),
                   use.my.knots.boundaries="DEMO",
                   grade.progression=c(3,4))

## NOTE: Goodness of Fit results are stored as a graphical object in the
## Goodness_of_Fit slot. To view or save (using any R output device) try:

grid.draw(sgp_g4$Goodness_of_Fit$READING.2011$GRADE_4)

pdf(file="Grade_4_Reading_2011_GOF.pdf", width=8.5, height=4.5)
   grid.draw(sgp_g4$Goodness_of_Fit$READING.2011$GRADE_4)
dev.off()

# Other grades

sgp_g5 <- studentGrowthPercentiles(panel.data=sgpData,
                sgp.labels=list(my.year=2011, my.subject="Reading"),
                percentile.cuts=c(1,35,65,99),
                grade.progression=3:5)

sgp_g6 <- studentGrowthPercentiles(panel.data=sgpData,
                sgp.labels=list(my.year=2011, my.subject="Reading"),
                percentile.cuts=c(1,35,65,99),
                grade.progression=3:6)

sgp_g7 <- studentGrowthPercentiles(panel.data=sgpData,
                sgp.labels=list(my.year=2011, my.subject="Reading"),
                percentile.cuts=c(1,35,65,99),
                grade.progression=3:7)

sgp_g8 <- studentGrowthPercentiles(panel.data=sgpData,
                sgp.labels=list(my.year=2011, my.subject="Reading"),
                percentile.cuts=c(1,35,65,99),
                grade.progression=4:8)

## All output of studentGrowthPercentiles (e.g., coefficient matrices) is contained
## in the object.  See, for example, names(sgp_g8), for all included objects.
## Results are stored in the slot SGPercentiles.

# Combine all results

sgp_all <- rbind(sgp_g4$SGPercentiles$READING.2011,
                 sgp_g5$SGPercentiles$READING.2011,
                 sgp_g6$SGPercentiles$READING.2011,
                 sgp_g7$SGPercentiles$READING.2011,
                 sgp_g8$SGPercentiles$READING.2011)

# Save SGP results to .csv file

write.csv(sgp_all, file="sgp_all.csv", row.names=FALSE, quote=FALSE, na="")


## NOTE: studentGrowthPercentiles ADDs results to the current SGP object.
## This allows one to "recycle" the object for multiple grades and subjects as desired. 

# Loop to calculate all SGPs for all grades without percentile cuts 
# but with growth levels

my.grade.sequences <- list(3:4, 3:5, 3:6, 3:7, 4:8)
my.sgpData <- list(Panel_Data=sgpData)   ### Put sgpData into Panel_Data slot

for (i in seq_along(my.grade.sequences)) {
     my.sgpData <- studentGrowthPercentiles(panel.data=my.sgpData,
                     sgp.labels=list(my.year=2011, my.subject="Reading"),
                     growth.levels="DEMO",
                     grade.progression=my.grade.sequences[[i]])
}

#  Save Student Growth Percentiles results to a .csv file:

write.csv(my.sgpData$SGPercentiles$READING.2011, 
file="2011_Reading_SGPercentiles.csv", row.names=FALSE, quote=FALSE, na="")

# Create pdfs of all Goodness of Fit results:

for (i in names(my.sgpData$Goodness_of_Fit$READING.2011)) {
    pdf(file=paste(i, "_Reading_2011_GOF.pdf", sep=""), width=8.5, height=4.5)
       grid.draw(my.sgpData[["Goodness_of_Fit"]][["READING.2011"]][[i]])
    dev.off()
}


## Loop to calculate all SGPs for all grades using 2006 to 2009 data 

my.grade.sequences <- list(3:4, 3:5, 3:6, 3:7, 4:8)

for (i in seq_along(my.grade.sequences)) {
	my.sgpData_2009 <- studentGrowthPercentiles(panel.data=my.sgpData,
		panel.data.vnames=c("ID", "GRADE_2007", 
			"GRADE_2008", "GRADE_2009", "GRADE_2010",
			"SS_2007", "SS_2008", "SS_2009", "SS_2010"),
		sgp.labels=list(my.year=2010, my.subject="Reading"),
		grade.progression=my.grade.sequences[[i]])
}


## Loop to calculate all SGPs for all grades WITH 80
my.grade.sequences <- list(3:4, 3:5, 3:6, 3:7, 4:8)

for (i in seq_along(my.grade.sequences)) {
    my.sgpData <- studentGrowthPercentiles(panel.data=my.sgpData,
      sgp.labels=list(my.year=2011, my.subject="Reading"),
      calculate.confidence.intervals=list(state="DEMO", 
         confidence.quantiles=c(0.1, 0.9), simulation.iterations=100, 
         distribution="Normal", round=1),
      grade.progression=my.grade.sequences[[i]])
}

Run the code above in your browser using DataLab