Randomization Method
We do a two-step randomisation: first we randomise at the school level whether schools get access to wage information or not. Then, within the schools that receive information, we randomise at the classroom level in which format the information is displayed (treatments 1 - 5).
Randomisation method for the school level randomisation:
Originally we received a dataset with 255 schools that were already in the system (i.e., schools that use the Qompas methods). We use the cvcrand command from STATA, which performs a covariate constrained randomisation of clusters in a two-arm parallel cluster randomised trial:
cvcrand aantalleerlingen20212022 aantal_leerlingen pc4 cm em ng nt qualitylife qompas_intensity size sizeqompas qualitylifecat qompas_int_cat classrooms, ntotal_cluster(255) ntrt_cluster(192) categorical (size sizeqompas qualitylifecat qompas_int_cat classrooms) stratify(size sizeqompas qualitylifecat qompas_int_cat classrooms) seed(12345)
* varlist are the baseline cluster-level variables to constrain on:
- aantalleerlingen20212022: registered students per school in the platform
- aantal_leerlingen: total number of students in the school
- pc4: postcode (4 digit version) of the school
- cm: number of students in the culture and society profile
- em: number of students in the economics and society profile
- ng: number of students in the nature and health profile
- nt: number of students in the nature and technology profile
- qualitylife: quality of life indicator at the 4 digit postcode (https://data.overheid.nl/en/dataset/leefbaarometer-meting-20201)
- qompas_intensity: qompas intensity usage, determined by the share of tests completed at the school level
- size: categorical variable that divides schools in quartiles based on the number of registered students
- sizeqompas: categorical variable that divides schools in quartiles based on the number of students registered in the platform
- qualitylifecat: categorical variable that divides schools in quartiles based on the quality of life indicator
- qompas_int_cat: categorical variable that divides schools in quartiles based on the intensity of usage of the platform
- classrooms: categorical variable that divides schools in quartiles based on the number of classrooms per school
* ntotal_cluster are the total amount of clusters, in other words, 255 schools
* ntrt_cluster refers to the amount of clusters that should be allocated to the treatment group, in this case, 192 schools (roughly 75%)
* categorical specifies which variables are categorical (size, sizeqompas, qualitylifecat, qompas_int_cat classrooms)
* stratify: we specify which categorical variables on which to stratify: size, sizeqompas, qualitylifecat, qompas_int_cat, classrooms. Each of them has 5 categories: 4 quartiles and missing values. They represent the number of students the school has, the number of students in Qompas platform, the quality of life indicator and the share of students that complete all tests in the platform
* seed: we set the randomisation seed to 12345, to make sure every time that the randomisation is the same
We check the summary statistics for the variables taken into consideration for the randomisation, by treatment or not. We also conducted a variance ratio test (sdtest) to check whether the variances of the two subgroups are equal or not, in order to take it into account in the t test below
bys _allocation: summarize qompas_intensity, detail
sdtest qompas_intensity, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
histogram qompas_intensity, by (_allocation)
bys _allocation: summarize qualitylife, detail
sdtest qualitylife, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
histogram qualitylife, by (_allocation)
bys _allocation: summarize aantal_leerlingen, detail
sdtest aantal_leerlingen, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
histogram aantal_leerlingen, by (_allocation)
bys _allocation: summarize aantalklassen, detail
sdtest aantalklassen, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
histogram aantalklassen, by (_allocation)
bys _allocation: summarize aantalleerlingen20212022, detail
sdtest aantalleerlingen20212022, by(_allocation) // we reject the null hypothesis that the variances are equal: adjust for this in the t test
histogram aantalleerlingen20212022, by(_allocation)
sdtest em, by(_allocation) // we reject the null hypothesis that the variances are equal: adjust for this in the t test
sdtest cm, by(_allocation) // we reject the null hypothesis that the variances are equal: adjust for this in the t test
sdtest nt, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
sdtest ng, by(_allocation) // we fail to reject the null hypothesis that the variances are equal
bys _allocation: egen school_classrooms = total(aantalklassen)
tab school_classrooms // check the total number of classrooms by treatment group: 367 classrooms in control group, 1102 in treatment group
bys _allocation: summarize cm, detail //
bys _allocation: summarize em, detail //
bys _allocation: summarize ng, detail //
bys _allocation: summarize nt, detail //
We then run some balancing tests:
tabstat qualitylife, by(_allocation) statistics(mean sd p25 p50 p75)
ttest qualitylife, by (_allocation) // difference is not significant
ttest qompas_intensity, by(_allocation) // difference is not significant
ttest aantal_leerlingen, by(_allocation) // difference is not significant
ttest aantalleerlingen20212022, by(_allocation) unequal // difference is not significant
ttest aantalklassen, by (_allocation) // difference is not significant
ttest em, by(_allocation) unequal // difference is not significant
ttest cm, by(_allocation) unequal // difference is not significant
ttest nt, by(_allocation) // difference is not significant
ttest ng, by(_allocation) // difference is not significant
Later in time, we received a list of new schools that have just hired Qompas' services for the first time and for which there is no historical data. Therefore, these schools get allocated using the command randtreat from STATA:
randtreat, generate(_allocation) setseed(12345) unequal(1/4 3/4) misfits(global)
Randomisation at the classroom level regarding the format in which information is displayed:
It is done within Qompas' platform using the roll of a dice.