Change the sufficiency threshold from a static number of minimum responses to a minimum response rate of 25 percent

This commit is contained in:
rebuilt 2022-02-24 12:31:21 +01:00
parent d4df7cbc06
commit 2a2777745a
20 changed files with 180 additions and 138 deletions

View file

@ -83,19 +83,13 @@ class Measure < ActiveRecord::Base
def sufficient_student_data?(school:, academic_year:)
return false unless includes_student_survey_items?
average_response_count = student_survey_items.map do |survey_item|
survey_item.survey_item_responses.where(school:, academic_year:).count
end.average
average_response_count >= SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD
subcategory.student_response_rate(school:, academic_year:).meets_student_threshold?
end
def sufficient_teacher_data?(school:, academic_year:)
return false unless includes_teacher_survey_items?
average_response_count = teacher_survey_items.map do |survey_item|
survey_item.survey_item_responses.where(school:, academic_year:).count
end.average
average_response_count >= SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD
subcategory.teacher_response_rate(school:, academic_year:).meets_teacher_threshold?
end
def sufficient_data?(school:, academic_year:)

View file

@ -1,4 +1,7 @@
module ResponseRate
TEACHER_RATE_THRESHOLD = 0.25
STUDENT_RATE_THRESHOLD = 0.25
def initialize(subcategory:, school:, academic_year:)
@subcategory = subcategory
@school = school
@ -14,4 +17,12 @@ module ResponseRate
(average_responses_per_survey_item / total_possible_responses.to_f * 100).round
end
def meets_student_threshold?
rate >= STUDENT_RATE_THRESHOLD * 100
end
def meets_teacher_threshold?
rate >= TEACHER_RATE_THRESHOLD * 100
end
end

View file

@ -4,11 +4,11 @@ class StudentResponseRate
private
def survey_item_count
@student_survey_item_count ||= @subcategory.measures.map { |measure| measure.student_survey_items.count }.sum
@survey_item_count ||= @subcategory.measures.map { |measure| measure.student_survey_items.count }.sum
end
def response_count
@student_response_count ||= @subcategory.measures.map do |measure|
@response_count ||= @subcategory.measures.map do |measure|
measure.student_survey_items.map do |survey_item|
survey_item.survey_item_responses.where(school: @school, academic_year: @academic_year).count
end.sum
@ -16,7 +16,7 @@ class StudentResponseRate
end
def total_possible_responses
@total_possible_student_responses ||= begin
@total_possible_responses ||= begin
total_responses = Respondent.where(school: @school, academic_year: @academic_year).first
return 0 unless total_responses.present?

View file

@ -10,4 +10,20 @@ class Subcategory < ActiveRecord::Base
scores = scores.reject(&:nil?)
scores.average
end
def student_response_rate(school:, academic_year:)
@student_response_rate ||= Hash.new do |memo|
memo[[school, academic_year]] = StudentResponseRate.new(subcategory: self, school:, academic_year:)
end
@student_response_rate[[school, academic_year]]
end
def teacher_response_rate(school:, academic_year:)
@teacher_response_rate ||= Hash.new do |memo|
memo[[school, academic_year]] = TeacherResponseRate.new(subcategory: self, school:, academic_year:)
end
@teacher_response_rate[[school, academic_year]]
end
end

View file

@ -1,6 +1,6 @@
class SurveyItemResponse < ActiveRecord::Base
TEACHER_RESPONSE_THRESHOLD = 17
STUDENT_RESPONSE_THRESHOLD = 196
TEACHER_RESPONSE_THRESHOLD = 2
STUDENT_RESPONSE_THRESHOLD = 2
belongs_to :academic_year
belongs_to :school

View file

@ -12,11 +12,11 @@ class TeacherResponseRate
end
def survey_item_count
@teacher_survey_item_count ||= @subcategory.measures.map { |measure| measure.teacher_survey_items.count }.sum
@survey_item_count ||= @subcategory.measures.map { |measure| measure.teacher_survey_items.count }.sum
end
def response_count
@teacher_response_count ||= @subcategory.measures.map do |measure|
@response_count ||= @subcategory.measures.map do |measure|
measure.teacher_survey_items.map do |survey_item|
survey_item.survey_item_responses.where(school: @school, academic_year: @academic_year).count
end.sum
@ -24,7 +24,7 @@ class TeacherResponseRate
end
def total_possible_responses
@total_possible_teacher_responses ||= begin
@total_possible_responses ||= begin
total_responses = Respondent.where(school: @school, academic_year: @academic_year).first
return 0 unless total_responses.present?