Abstract

The Local Control Funding Formula (LCFF) directs how all local educational agencies (LEAs) in the state are funded, how they measure results, and the services and supports they receive. All school districts and charter schools receive the LCFF Grade Span Base Grant, Supplemental Grant, Concentration Grant and other sources of funding based on applicability. The Supplemental Grant targets students classified as English learners, meet income requirements to receive a free or reduced-price meal, foster youth, and students with a combination of these factors. The Concentration grant further funds targeted students when they exceed 55 percent of a school district’s or charter school’s enrollment. Advocates applaud the increase in equitable funding the LCFF directs compared to the prior funding framework, but some question whether the LCFF directs enough funds to Black students given the persistent achievement gap. Here we show that the Equity Multiplier - the Governor’s funding proposal reduce the achievement gap - would impact relatively small numbers and percentages of Black students. We found the impacts to be similar in scope, though geographically different, with a performance-based metric: Comprehensive Support and Improvement (CSI). A lowest performance-based metric - like the one proposed in AB 2774 - would impact larger numbers and percentages of Black students, and a very-high chronic absenteeism metric would impact the most schools. Our results show strengths and weaknesses of four metrics to inform funding to reduce the achievement gap for Black student and that a perfect funding formula is unknown. However, we hope this work spurs thoughtful conversations about funding options, including combining multiple options, to eliminate the achievement gap.

library(data.table)
library(tidyverse)
library(sf)
library(leaflet)
library(readxl)
library(janitor)
library(stringr)
library(kableExtra)
options(scipen = 999)


############### LCFF SCHOOLS WITH ENROLLMENT #################


#get latest (2021-22) enrollment data from https://www.cde.ca.gov/ta/ac/cm/censenrolldatafiles.asp
if (file.exists("./censusenrollratesdownload2022.txt")) {
  enrollment <- fread("./censusenrollratesdownload2022.txt", colClasses = "character")
} else {
  download.file("https://www3.cde.ca.gov/researchfiles/cadashboard/censusenrollratesdownload2022.txt", "./censusenrollratesdownload2022.txt")
  enrollment <- fread("./censusenrollratesdownload2022.txt", colClasses = "character")
}

#convert enrollment to numeric
enrollment$totalenrollment <- as.numeric(enrollment$totalenrollment)
enrollment$subgroupTotal <- as.numeric(enrollment$subgroupTotal)
enrollment$rate <- as.numeric(enrollment$rate)

#number of CA Black students
num_Black_students <- enrollment[enrollment$rtype == "X" & enrollment$studentgroup == "AA"][[1,8]]

#number CA Total student enrollment
num_students <- enrollment[enrollment$rtype == "X" & enrollment$studentgroup == "AA"][[1,7]]

#prepare to join by selecting unique schools
enrollment <- enrollment %>% filter(rtype == "S") %>% distinct(cds, .keep_all = TRUE) %>% 
  select(cds, schoolname, totalenrollment) %>%
  
  left_join(enrollment %>% filter(rtype == "S" & studentgroup %in% c("AA", "AI", "AS", "FI", "HI", "PI", "WH", "MR")) %>%
  select(cds, studentgroup, subgroupTotal, rate) %>% 
  pivot_wider(names_from = studentgroup, values_from = c(subgroupTotal, rate), values_fill = 0))

#number of schools with enrollment
num_schools <- nrow(enrollment)

#percentage of Black students who are not funded in LCFF assuming no duplication with foster or homeless students
#from https://dq.cde.ca.gov/dataquest/dqcensus/EnrEthGrd.aspx?cds=00&agglevel=state&year=2021-22 (filter non-SD, non-EL)
num_nonSED_Black_students = 81617 
pct_nonSED_Black_students = round(num_nonSED_Black_students / num_Black_students * 100, 1)


################## FREE MEAL ELIGIBILITY #####################


#get latest (2021-22) free meals data from https://www.cde.ca.gov/ds/ad/filessp.asp
if (file.exists("./frpm2122_v2.xlsx")) {
  free_meals <- read_excel("./frpm2122_v2.xlsx", sheet=2, skip=1) %>% clean_names()
} else {
  download.file("https://www.cde.ca.gov/ds/ad/documents/frpm2122_v2.xlsx", "./frpm2122_v2.xlsx")
  free_meals <- read_excel("./frpm2122_v2.xlsx", sheet=2, skip=1) %>% clean_names()
}

#make cds code
free_meals$cds <- paste0(free_meals$county_code, free_meals$district_code, free_meals$school_code)
  
#rename pct column
free_meals <- free_meals %>% rename(free_meal_pct_k_12 = percent_percent_eligible_free_k_12)

#identify schools eligible for the equity multiplier allocation
free_meals <- free_meals %>% mutate(eqmlt = case_when(free_meal_pct_k_12 >= .90 ~ 1,
                            
                            #schools over 85% with at least one grade over 9 or N/A in the high grade
                            free_meal_pct_k_12 >= .85 & free_meal_pct_k_12 < .90 &
                              school_type != "Elemen Schools In 1 School Dist. (Public)" &
                                    school_type != "Elementary Schools (Public)" &
                                    school_type != "Intermediate/Middle Schools (Public)" &
                                    high_grade != "5" &
                                    high_grade != "8" ~ 1,
                            TRUE ~ 0)) %>%
  
  #select only needed columns
  select(cds, school_type, high_grade, enrollment_k_12, free_meal_pct_k_12, eqmlt)

#number of equity multiplier schools and students
num_eqmlt_schools <- nrow(free_meals[ which(free_meals$eqmlt == 1),])
num_eqmlt_students <- sum(free_meals[ which(free_meals$eqmlt == 1),]$enrollment_k_12)

#percentage of equity multiplier schools and students out of all schools and students
pct_eqmlt_schools <- round(num_eqmlt_schools / num_schools * 100, 1)
pct_eqmlt_students <- round(num_eqmlt_students / num_students * 100, 1)

#join free meals to enrollment
enrollment <- left_join(enrollment, free_meals, by='cds') %>%
  
  #add label
  mutate(eqmlt_label = case_when(eqmlt == 1 ~ "Yes", TRUE ~ "No"))

#number of Black students impacted by equity multiplier
num_Black_eqmlt_students <- sum(enrollment[ which(enrollment$eqmlt == 1),]$subgroupTotal_AA, na.rm = TRUE)

#percentage of equity multiplier Black students out of all Black students
pct_Black_eqmlt_students <- round(num_Black_eqmlt_students / num_Black_students * 100, 1)


################## SCHOOL LOCATION INFORMATION #####################


#get most recent public schools from https://www.cde.ca.gov/ds/si/ds/pubschls.asp
if (file.exists("./pubschls.txt")) {
  schools <- fread("./pubschls.txt", colClasses = "character")
} else {
  download.file("https://www.cde.ca.gov/schooldirectory/report?rid=dl1&tp=txt", "./pubschls.txt")
  schools <- fread("./pubschls.txt", colClasses = "character")
}  
  
#filter for active, traditional schools
schools <- schools %>%  filter(StatusType == "Active") %>%
  
  #select only needed columns
  select(CDSCode, School, County, EILName, GSserved, Street, City, Zip, State, Latitude, Longitude) %>%
  
  #rename for join
  rename(cds = CDSCode)

#convert lat & long to decimal (it doesn't show all the digits in the environment window)
options(digits=(9))
schools$Latitude <- as.numeric(schools$Latitude)
schools$Longitude <- as.numeric(schools$Longitude)

#left join active, traditional schools with enrollment
enrollment <- left_join(enrollment, schools %>% select(-School), by='cds') 

Introduction

AB 2774 proposed a fix to a fundamental flaw in the LCFF by creating a new supplemental grant for California’s lowest-performing subgroup of students not currently receiving funding, which are currently African American students (Black in School). The Black in School coalition correctly claims that about a quarter of Black students do not qualify as high needs students (i.e., are not socioeconomically disadvantaged or English learners) and would not receive LCFF supplemental funding. (There are 81,617 non-high-need Black students1 or 27.3% of all 298,768 Black students2 in California. One would potentially subtract small percentages of duplicated foster and homeless students to arrive at a more accurate number). Black in School produces district-level estimates of currently unfunded Black students that approximated the number of non-high need Black students, but varies slightly, based on a more detailed methodology of schools that are currently funded.

Instead, the Governor is promoting the LCFF Equity Multiplier Allocation. Beginning in the 2023-24 fiscal year, $300 million would be annually appropriated to the Superintendent of Public Instruction to fund LEAs for services and supports that directly benefit eligible school sites as a supplement to LCFF funds they already receive. Eligible school sites would receive a minimum of $50,000, or a per-pupil amount based on the school site’s total prior year enrollment. Total statewide eligible enrollment and amount of funds available would determine the per-pupil amount. Eligible school sites are Elementary and Middle schools with ≥90% free meal eligibility under the federal National School Lunch Program in the prior year and High schools with ≥85% free meal eligibility in the prior year. The multiplier would also include accountability and other measures that are not explored here.

How many students would benefit from the Equity Multiplier?

There were 5,892,240 California public school students on Census Day in the 2021-22 school year, according to the California Department of Education. The equity multiplier would impact an estimated 849 schools with 338,120 students or 8.5% of all schools and 5.7% of all students. The number of schools impacted by the equity multiplier is similar to the number of schools that would be required to identify and tackle “very low” Black math performance in the governor’s plan (890 vs.849). The percent of students impacted is similar to the EdSource analysis estimating that funding from the equity multiplier would target 5% of students in the state. The small difference is probably is probably due to our conservative inclusion of district offices and other non-traditional school-sites.

How many Black students would benefit?

There were 298,768 California Black students counted on Census day in the 2021-22 school year, according to the California Department of Education. The equity multiplier would impact an estimated 22,172 Black students or 7.4% of all Black students. These figures are similar to the EdSource analysis estimating that funding from the equity multiplier would reach about 6% of Black students statewide.

Which schools would benefit?

See a map of schools in dark purple that would benefit from the equity multiplier allocation among all schools with location information (in light purple). 475 schools (4.5% of all public schools) were missing location information for mapping; the majority of these schools are non-traditional schools. Zoom in to see all schools, as many schools overlap at the higher zoom levels, especially in urban areas.

#make color palette for map
pal <- colorFactor(palette = c("#CEC4E2", "#3A207D"), enrollment$eqmlt)

#map
eqmlt_map <- leaflet(enrollment) %>% 
        setView(lng = -120, lat = 36.7, zoom = 6) %>%
        addCircleMarkers(data = enrollment,
                         color = ~pal(eqmlt),
                         radius = 4,
                         fillOpacity = 1,
                         stroke = F,
                         popup = paste(enrollment$schoolname, "<br>",
                                       "Percent Black: ", enrollment$rate_AA,"%", "<br>",
                                       "Black Students: ", enrollment$subgroupTotal_AA)
                         ) %>%
        addProviderTiles("CartoDB.Positron") %>%
        addLegend(position = "bottomleft",
                  title=paste("School Impacted", "<br>", "by Equity Multiplier"),
                  labels = c("Yes", "No"),
                  colors= c("#3A207D", "#CEC4E2"), opacity=1)

eqmlt_map

Note: An initial run of these data was completed using the universe of 10,558 schools published in the California Department of Education’s Free or Reduced-Price Meal (Student Poverty) Data. This is the same number of schools mentioned by Brooks Allen, the executive director of the State Board of Education, in an Ed Source article on the equity multiplier. Dr. Dominic Zarecki, Director of Data, Analytics, and Strategy at the Fortune School of Education, a representative of the Black in School Coalition recommended using the list of 9,992 schools in the California Department of Education’s School Dashboard as the universe. The difference in universe would mean a difference of 22 Black students impacted, a small enough number so as to leave the percentage of Black students impacted unchanged at 7.4%. The smaller universe is used in the Black student calculations above to be more comparable with the School Dashboard academic indicators studied below.

#get most recent CSI schools from https://www.cde.ca.gov/sp/sw/t1/essaassistdatafiles.asp
if (file.exists("./essaassistance22.xlsx")) {
  csi <- read_excel("./essaassistance22.xlsx", sheet=2, skip=2)
} else {
  download.file("https://www.cde.ca.gov/sp/sw/t1/documents/essaassistance22.xlsx", "./essaassistance22.xlsx", quiet = TRUE, mode="wb")
  csi <- read_excel("./essaassistance22.xlsx", sheet=2, skip=2)
}

#filter for CSI
csi <- csi %>%  filter(AssistanceStatus2022 %in% c("CSI Grad", "CSI Low Perform")) %>% 
  
  #select only needed columns
  select(cds, schoolname, AssistanceStatus2022)

#number and percent of CSI schools
num_csi_schools <- nrow(csi)
pct_csi_schools <- round(num_csi_schools/num_schools * 100, 1)

#join csi schools with schools for mapping
enrollment <- left_join(enrollment, csi %>% select(-schoolname), by='cds') %>%
  
  #add csi label column
  mutate(csi_label = case_when(eqmlt == 1 & AssistanceStatus2022 %in% c("CSI Grad", "CSI Low Perform") ~ "Both",
                               eqmlt == 0 & AssistanceStatus2022 %in% c("CSI Grad", "CSI Low Perform") ~ "CSI only",
                               eqmlt == 1 & is.na(AssistanceStatus2022) ~ "Equity Multiplier only",
                                TRUE ~ "Neither"))

#calculate overlap
csi_eq_overlap <- enrollment %>% count(csi_label)
num_both <- csi_eq_overlap[[1,2]]
pct_both_of_csi <- round(num_both/num_csi_schools * 100, 1)

#calculate number of Total and Black students in CSI schools and Black CSI students as a % of all Black students
num_csi_students <- sum(enrollment[which(enrollment$csi_label == "Both" | enrollment$csi_label == "CSI only"),]$totalenrollment)
num_csi_Black_students <- sum(enrollment[which(enrollment$csi_label == "Both" | enrollment$csi_label == "CSI only"),]$subgroupTotal_AA)
pct_csi_Black_students <- round(num_csi_Black_students/num_Black_students * 100, 1)

Any overlap with schools eligible for Comprehensive Support and Improvement (CSI)?

According to the California Department of Education, there were 807 schools eligible for CSI in 2022, 8.1% of all schools. This includes High schools eligible to receive assistance based on low graduation rates and schools eligible to receive assistance based on low–performance. Only 152 of the schools eligible for CSI would also receive funds through the equity multiplier, or 18.8% of schools eligible for CSI. This means fewer than one in five schools eligible for CSI would receive additional funds through the equity multiplier. See the map below for which schools are CSI eligible, eligible for the equity multiplier, or both.

How many Black students are in CSI schools?

There were 29,608 Black students in schools eligible for CSI, 9.9% of all Black students. Note: these statistics exclude enrollment for five schools eligible for CSI that lacked mappable location information. This is a slightly higher percentage than the percentage of Black students impacted by the equity multiplier. Due to the overlap in CSI and equity multiplier, some of these students would receive additional funding through both designations.

################ MAP ######################

#make color palette for map
pal <- colorFactor(palette = c("#00994C", "#F25922","#3A207D", "#CEC4E2"), enrollment$csi_label)

#map
csi_map <- leaflet(enrollment) %>% 
        setView(lng = -120, lat = 36.7, zoom = 6) %>%
        addCircleMarkers(data = enrollment,
                         color = ~pal(csi_label),
                         radius = 4,
                         fillOpacity = 1,
                         stroke = F,
                         popup = paste(enrollment$schoolname, "<br>",
                                       "CSI Status:", enrollment$AssistanceStatus2022, "<br>",
                                       "Percent Black: ", enrollment$rate_AA,"%", "<br>",
                                       "Black Students: ", enrollment$subgroupTotal_AA)
                         ) %>%
        addProviderTiles("CartoDB.Positron") %>%
        addLegend(position = "bottomleft",
                  title=paste("School Impacted by", "<br>", "CSI or Equity Multiplier"),
                  labels = c("Both", "CSI only", "Equity Multiplier only", "Neither"),
                  colors= c("#00994C", "#F25922","#3A207D", "#CEC4E2"), opacity=1)

csi_map
#get most recent chronic absenteeism from https://www.cde.ca.gov/ta/ac/cm/chronicdatafiles.asp
if (file.exists("./chronicdownload2022.txt")) {
  chron_abs <- fread("./chronicdownload2022.txt", colClasses = "character")
} else {
  download.file("https://www3.cde.ca.gov/researchfiles/cadashboard/chronicdownload2022.txt", "./chronicdownload2022.txt")
  chron_abs <- fread("./chronicdownload2022.txt", colClasses = "character")
} 

#change type and rename
chron_abs$chron_abs_rate <- as.numeric(chron_abs$currstatus)

#filter for school-level data for all students
chron_abs <- chron_abs %>%  filter(rtype == "S" & studentgroup == "ALL") %>% 
  
  #select only needed columns
  select(cds, schoolname, chron_abs_rate, statuslevel)

#number and percent of very high chronic absenteeism schools
num_vh_chron_abs_schools <- nrow(chron_abs[which(statuslevel == "1"),])
pct_vh_chron_abs_schools <- round(num_vh_chron_abs_schools/num_schools * 100, 1)

#join very high chronic absenteeism schools with schools for mapping 
enrollment <- left_join(enrollment, chron_abs %>% select(-schoolname), by='cds') %>%
  
  #add very high chronic absenteeism label column
  mutate(chron_abs_label = case_when(statuslevel == "1" ~ "Yes",
                                     statuslevel %in% c("2", "3", "4", "5") ~ "No",
                                TRUE ~ "No Data"))

#calculate number of Total and Black students in high chronic absenteeism schools and these Black students as a % of all Black students
num_vh_chron_abs_students <- sum(enrollment[which(enrollment$chron_abs_label == "Yes"),]$totalenrollment)
num_vh_chron_abs_Black_students <- sum(enrollment[which(enrollment$chron_abs_label == "Yes"),]$subgroupTotal_AA)
pct_vh_chron_abs_Black_students <- round(num_vh_chron_abs_Black_students/num_Black_students * 100, 1)

How many Black students are in schools with very high chronic absenteeism?

Another metric for comparison is the very high chronic absenteeism designation available on the California Department of Education School Dashboard. There were 5,836 schools designated with a very high chronic absenteeism status level in 2021-22. This high number of schools is indicative of the entire State falling in the very high chronic absenteeism status level. There were 170,652 Black students in very high chronic absenteeism schools or 57.1% of all Black students. This metric impacts the most schools and the most students, but impacts relatively fewer Black students than the low-performance metric.

################## MAP ###################

#make color palette for map
pal <- colorFactor(palette = c("#CEC4E2", "#DEDEDE", "#3A207D"), enrollment$chron_abs_label)

#map
chron_abs_map <- leaflet(enrollment) %>% 
        setView(lng = -120, lat = 36.7, zoom = 6) %>%
        addCircleMarkers(data = enrollment,
                         color = ~pal(chron_abs_label),
                         radius = 4,
                         fillOpacity = 1,
                         stroke = F,
                         popup = paste(enrollment$schoolname, "<br>",
                                       "Chronic Absenteeism Rate: ", enrollment$chron_abs_rate,"%", "<br>",
                                       "Percent Black: ", enrollment$rate_AA,"%", "<br>",
                                       "Black Students: ", enrollment$subgroupTotal_AA)
                         ) %>%
        addProviderTiles("CartoDB.Positron") %>%
        addLegend(position = "bottomleft",
                  title=paste("Very High", "<br>", "Chronic Absenteeism"),
                  labels = c("Yes", "No", "No Data"),
                  colors= c("#3A207D", "#CEC4E2", "#DEDEDE"), opacity=1)

chron_abs_map
############## ELA #################


#get latest ELA data from https://www.cde.ca.gov/ta/ac/cm/acaddatafiles.asp
if (file.exists("./eladownload2022.txt")) {
  ela <- fread("./eladownload2022.txt", colClasses = "character")
} else {
  download.file("https://www3.cde.ca.gov/researchfiles/cadashboard/eladownload2022.txt", "./eladownload2022.txt")
  ela <- fread("./eladownload2022.txt", colClasses = "character")
}  

#change type
ela$currstatus_withoutPRLOSS <- as.numeric(ela$currstatus_withoutPRLOSS)

#filter for school level racial group (non-low-income racial group appeared to lose too many to suppression)
ela_lowest <- ela %>% filter (rtype == "S" & studentgroup %in% c("AA", "AI", "AS", "FI", "HI", "PI", "WH", "MR")) %>%
  
  #add Black data available column
  mutate(black_ela = ifelse(studentgroup %in% "AA" & !is.na(currstatus_withoutPRLOSS), 1, 0)) %>%
 
  #identify schools with Black data
  group_by(cds) %>% mutate(black_ela = max(black_ela)) %>%

  #select only columns I want
  select(cds, schoolname, studentgroup, currstatus_withoutPRLOSS, black_ela) %>%
    filter(!is.na(currstatus_withoutPRLOSS)) %>%
    
  #find racial group with lowest percentage of standard met in each school
  group_by(cds) %>% slice_min(currstatus_withoutPRLOSS, n = 1)


############## MATH #################


#get latest MATH data from https://www.cde.ca.gov/ta/ac/cm/acaddatafiles.asp
if (file.exists("./mathdownload2022.txt")) {
  math <- fread("./mathdownload2022.txt", colClasses = "character")
} else {
  download.file("https://www3.cde.ca.gov/researchfiles/cadashboard/mathdownload2022.txt", "./mathdownload2022.txt")
  math <- fread("./mathdownload2022.txt", colClasses = "character")
}  

#change type
math$currstatus_withoutPRLOSS <- as.numeric(math$currstatus_withoutPRLOSS)

#filter for school level racial group (non-low-income racial group appeared to lose too many to suppression)
math_lowest <- math %>% filter (rtype == "S" & studentgroup %in% c("AA", "AI", "AS", "FI", "HI", "PI", "WH", "MR")) %>%
  
  #add Black data available column
  mutate(black_math = ifelse(studentgroup %in% "AA" & !is.na(currstatus_withoutPRLOSS), 1, 0)) %>%
 
  #identify schools with Black data
  group_by(cds) %>% mutate(black_math = max(black_math)) %>%

  #select only columns I want
  select(cds, schoolname, studentgroup, currstatus_withoutPRLOSS, black_math) %>%
    filter(!is.na(currstatus_withoutPRLOSS)) %>%
    
  #find racial group with lowest percentage of standard met in each school
  group_by(cds) %>% slice_min(currstatus_withoutPRLOSS, n = 1)

black_lowest_performance <- full_join(ela_lowest %>% 
                    rename(ela_lowest_group = studentgroup, 
                           ela_lowest_points = currstatus_withoutPRLOSS),
             math_lowest %>% select(-schoolname) %>% 
                    rename(math_lowest_group = studentgroup, 
                           math_lowest_points = currstatus_withoutPRLOSS),
                    by = "cds") %>%

  #add no Black data column
  mutate(black_data = ifelse(black_ela %in% c(0,NA) & black_math %in% c(0,NA), 0, 1)) %>%
  
  #add lowest performance column         
  mutate(black_low_performance = ifelse(black_data == 0, 0,  #no data
           ifelse(ela_lowest_group %in% "AA" | math_lowest_group %in% "AA", 1, 0))) #Black lowest
  
#join low performance schools to schools
enrollment <- left_join(enrollment, black_lowest_performance %>% select(-schoolname), by='cds') 

#calculate number Black students in schools where Black students are lowest in ELA or Math and as a % of all Black students
num_Black_lowest_schools <- sum(black_lowest_performance$black_low_performance, na.rm = TRUE)
pct_Black_lowest_schools <- round(num_Black_lowest_schools/num_schools * 100, 1)

num_Black_lowest_students <- enrollment %>% filter(black_low_performance == 1) %>% summarize(Black = sum(subgroupTotal_AA))
num_Black_lowest_students <- num_Black_lowest_students[[1,1]]
pct_Black_lowest_students <- round(num_Black_lowest_students/num_Black_students * 100, 1)

How many Black students are in schools where Black students are the lowest performing subgroup?

The Black in School coalition proposed funding the lowest-performing subgroup of students not currently receiving funding. They compare low-income and non-low-income students by racial-ethnic group at the State and School District levels in support of their proposal. At the school level, this analysis isn’t feasible with publicly available data due to the suppression of small populations of students. Instead, we conduct a school-level analysis for all incomes by racial-ethnic group here.

There are 2,603 schools with 212,306 Black students where Black students are the most points below State standards in ELA or Math or 71.1% of all Black students. You can see which schools are impacted by this metric in the map below. Schools are less targeted by income than they are with the equity multiplier or CSI measures and include schools in more affluent areas. Note: Many schools do not have sufficient Black student populations or Black students populations with test scores for Black student populations to be considered in this metric.

################## MAP ###################


enrollment <- enrollment %>% mutate(Black_lowest_label = case_when(black_data == 1 & black_low_performance == 1 ~ "Yes",
                                                                   black_data == 1 & black_low_performance == 0 ~ "No",
                                                                   black_data == 0 ~ "Not enough data",
                                                                   is.na(black_low_performance) ~ "Not enough data",
                                                       TRUE ~ "Not enough data"))

#make color palette for map
pal <- colorFactor(palette = c("#CEC4E2","#DEDEDE","#3A207D"), enrollment$Black_lowest_label)

#map
Black_lowest_map <- leaflet(enrollment) %>% 
        setView(lng = -120, lat = 36.7, zoom = 6) %>%
        addCircleMarkers(data = enrollment,
                         color = ~pal(Black_lowest_label),
                         radius = 4,
                         fillOpacity = 1,
                         stroke = F,
                         popup = paste(enrollment$schoolname, "<br>",
                                       "Black Lowest Performing: ", enrollment$Black_lowest_label, "<br>",
                                       "Percent Black: ", enrollment$rate_AA,"%", "<br>",
                                       "Black Students: ", enrollment$subgroupTotal_AA, "<br>")
                         ) %>%
        addProviderTiles("CartoDB.Positron") %>%
        addLegend(position = "bottomleft",
                  title=paste("School reporting", "<br>", "Black lowest performance"),
                  labels = c("Yes", "No", "Not enough data"),
                  colors= c("#3A207D", "#CEC4E2", "#DEDEDE"), opacity=1)

Black_lowest_map

Note: An initial analysis of these data identified the racial-ethnic student subgroup with the lowest percentage of students meeting ELA or Math standards in each school using CAASPP data. It found 33.4% of Black students were in schools where Black students had the lowest percentages of students meeting ELA or Math standards. Dr. Dominic Zarecki recommended using the School Dashboard academic indicators instead because the State would make funding decisions based on them. The School Dashboard uses the points above or below standard metric, which is more accurate, but available for fewer school-racial-ethnic group combinations because of privacy suppression. The results of the School Dashboard academic indicators are shown above. The difference in results (33.4% vs. 71.1%) reflects a more conservative universe in the first analysis and the size of the achievement gap; Black students are further below State standards than students of other racial-ethnic groups. According to the School Dashboard, Black students are further below Math standards than homeless students, which speaks to the immediate need to fund schools to better prepare Black students.

Summary

This analysis looked at four funding metrics aimed at reducing the achievement gap for Black students: the equity multiplier, CSI schools, chronic absenteeism, and a lowest-performance metric. Each of the four reached different percentages of students in schools in different parts of the state. Here is a summary of findings:

#make summary table
metrics <- c("Equity Multiplier", "CSI", "Chronic Absenteeism","Lowest Performance")
values <- c(pct_Black_eqmlt_students, pct_csi_Black_students, pct_vh_chron_abs_Black_students, pct_Black_lowest_students)
geos <- c("Lowest-income; few schools in urban centers, especially LA", "Low-income; few schools with more geographic spread", "Most incomes; most schools", "All incomes; all schools")
sum_table <- data.frame(metrics, "Percent of Black students impacted" = values, "Geographic impact" = geos)

kbl(sum_table, 
    col.names = c("Metric",
                  "(%) of Black Students Impacted",
                  "Geographic Impact")) %>%
  
  kable_styling(bootstrap_options = c("striped", "bordered", "condensed"))
Metric (%) of Black Students Impacted Geographic Impact
Equity Multiplier 7.4 Lowest-income; few schools in urban centers, especially LA
CSI 9.9 Low-income; few schools with more geographic spread
Chronic Absenteeism 57.1 Most incomes; most schools
Lowest Performance 71.1 All incomes; all schools

Notes: Eligible school sites for the Equity Multiplier are Elementary and Middle schools with ≥90% free meal eligibility under the federal National School Lunch Program in the prior year and High schools with ≥85% free meal eligibility in the prior year.

Comprehensive Support & Improvement (CSI) is an existing program that was analyzed for comparison and geographic impact with Equity Multiplier eligible schools.

Chronic absenteeism refers to schools with the “very high” status level for chronic absenteeism on the School Dashboard in 2021-22.

Lowest-impact schools are schools where Black students were the most points below State standards in ELA or Math in 2021-22.

_