4 Harmonising MICS6 FS background themes

Cross-country analysis of schooling, labour, discipline, functioning, and numeracy needs one child-level file with stable names. Official MICS6 fs.sav files use different layouts and country codes, so they do not pool cleanly on their own.

Harmonising MICS6 reading outcomes already builds reading scores from the Foundational Learning module. This chapter covers everything else from the children aged 5–17 (FS) questionnaire: geography, parent education, schooling background, labour, parental involvement, functioning, discipline, and numeracy setup. Reading item batteries stay in the reading file; merge the two files later on shared keys.

One R script does the work: harmonize-mics-fs-v1.0.R. You do not need the full guide repository. Follow Download the MICS Data to build data/MICS_Datasets/, place the script beside that folder, and run it.

source("data/harmonize-mics-fs-v1.0.R")

The script writes:

Output Role
data/mics6_fs_harmonized.rds Analysis file (R)
data/mics6_fs_harmonized.dta Analysis file (Stata)
data/mics6_fs_variable_crosswalk.xlsx Source map, exclusions, level maps, notes

The sections below explain each theme so you can adapt the logic rather than treat the script as a black box.

4.1 What you need

  1. Complete Download the MICS Data so each survey folder under data/MICS_Datasets/ holds fs.sav. Parent education and school type also need hl.sav in the same folder.
  2. Obtain harmonize-mics-fs-v1.0.R (for example from the AFLEARN GitHub assets for this guide) and save it as data/harmonize-mics-fs-v1.0.R.
  3. Set the R working directory to the folder that contains data/ (not to data/ itself).
  4. Have R with packages the script loads through pacman: tidyverse, haven, labelled, openxlsx.

Your tree should look like this:

<your-project>/
└── data/
    ├── MICS_Datasets/
    │   └── BEN_2021_MICS6_v01_M/
    │       ├── fs.sav
    │       └── hl.sav
    └── harmonize-mics-fs-v1.0.R

The script recognises these ISO3 codes (Tunisia appears twice, 2018 and 2023):

BEN CAF COD COM GHA GMB GNB LSO MDG MWI NGA SLE STP SWZ TCD TGO TUN ZWE

Any other survey folder is skipped with a message.

4.2 Run the script

From the project folder that contains data/:

source("data/harmonize-mics-fs-v1.0.R")

The run prints one block per survey (children kept, exclusion counts). On a full set of supported surveys the pooled file has about 166,980 children and 135 variables. Exact counts depend on which surveys you prepared.

If Excel has mics6_fs_variable_crosswalk.xlsx open, Windows may lock the file. Close it before re-running, or use the _updated.xlsx / .tmp.xlsx copy the script leaves when it cannot replace the locked workbook.

4.3 The pipeline at a glance

for each survey folder
  1.  read ISO3 and year from the folder name
  2.  read fs.sav once (and hl.sav for parent education / school type)
  3.  apply themes on the child row:
        HH  geography and household size
        WT  FS sample weights (fsweight, fshweight)
        INT FS interview date and start/end times
        BG  mother/father education + school type
        CB  schooling background (+ level_h)
        CL  child labour
        PR  parental involvement
        FCF child functioning
        FCD child discipline
        FL  numeracy items + FL setup (not reading outcomes)
  4.  keep merge keys and theme columns
append all surveys
apply value and variable labels
write .rds, .dta, and the Excel crosswalk

Identifiers HH1, HH2, and LN must uniquely identify children in each fs.sav. The script also stores copies as cluster, hhno, and linech for merges with IPUMS-MICS or the reading file.

4.4 Geography and household size

Depth: rename and labels only.

Harmonized Source Meaning
urban HH6 Urban (1) / rural (2)
region HH7 First administrative area (country codes)
n_children_5_17 HH52 Number of children aged 5–17 in the household

region is not a cross-country taxonomy. Interpret codes within country_iso3. n_children_5_17 is missing in Tunisia 2018. Extra HH fields (HH3, HH4, HH6A, HH7A, …) are listed on the Excel excluded sheet.

4.5 Sample weights

Depth: keep MICS names and labels only (no wealth indices).

Harmonized Source Meaning
fsweight fsweight Children 5–17 sample weight
fshweight fshweight Children 5–17 household sample weight

Both fields are present in every supported survey in this build. Wealth scores (wscore, windex*) are not included.

4.6 Interview date and time

Depth: rename and English labels only (no derived duration or date).

Harmonized Source Meaning
interview_day FS7D Day of FS interview
interview_month FS7M Month of FS interview
interview_year FS7Y Year of FS interview
interview_start_hour FS8H Start hour
interview_start_min FS8M Start minutes
interview_end_hour FS11H End hour
interview_end_min FS11M End minutes

All seven fields are on every supported fs.sav in this build. Household interview dates (HH5D/HH5M/HH5Y) are not included.

4.7 Parent education and school type

Depth: raw parent education codes plus a common *_edu_h map (same 0–5 / 8 / 9 scheme as CB *_level_h). School type is rename only.

Harmonized Source Meaning
mother_edu FS melevel Mother’s education (country constructed codes)
mother_edu_h mapped from mother_edu Harmonised level
father_edu HL felevel Father’s education (merged on HH1/HH2/LN=HL3)
father_edu_h mapped from father_edu Harmonised level
school_type HL ED11 School ownership/type for the FS child

felevel does not appear on fs.sav; the script always reads it from hl.sav. school_type is missing in Gambia and Togo.

Most surveys code school type as public (1), religious (2), private (3), community (4), other (6). COD uses a different network taxonomy—keep raw codes and read the Excel notes sheet. Tunisia codes “other” as 4, not 6.

Parent *_edu_h maps live in the script (parent_level_map_for) and on the Excel level_map sheet (source_var = melevel or felevel). Code 9 covers missing, “no information,” and parent not in the household. Malawi raw code 5 means vocational for mothers and father-not-in-HH for fathers.

4.8 Child’s Background (schooling)

Depth: rename plus harmonised education levels highest_level_h, current_level_h, previous_level_h.

Harmonized Source
birth_month, birth_year CB2M, CB2Y
age CB3
ever_attended CB4
highest_level, highest_grade, highest_completed CB5A, CB5B, CB6
enrolled, current_level, current_grade CB7, CB8A, CB8B
attended_previous, previous_level, previous_grade CB9, CB10A, CB10B

Raw level and grade variables keep country codes. Grade value labels are generic English (Grade/year 1, …, plus DK / no response / inconsistent); they do not claim cross-country grade equivalence. Raw *_level, parent education, school_type, region, and language fields have no pooled value labels—codes stay numeric; use *_level_h / *_edu_h and the Excel level_map / notes sheets for meaning.

Warning: current_grade is the year within current_level_h, not the child’s place in the school system. Primary year 1 and secondary year 1 both carry the code 1. See Why current_grade is not the child’s grade.

The *_level_h variables use:

Code Label
0 Early childhood / pre-primary (ECE)
1 Primary
2 Lower secondary
3 Upper secondary
4 Vocational / technical
5 Higher / tertiary
8 Don’t know
9 No response / other special

Country maps sit in level_map_for() and on the Excel level_map sheet. Defaults in v1.0: nested tech/voc inside secondary → 3; standalone vocational tracks → 4; Zimbabwe vocational/tertiary subtypes collapse to 4/5; Tunisia adult education / literacy → 9.

4.9 Child Labour

Depth: rename and labels only (no ILO/MICS derived labour indicators).

Core block: economic work (work_*), hours, hazards, water/firewood, and household chores. Tunisia 2018 has no CL module—the script creates those columns as missing. Country extras (herding, night work, fishing, …) go to the excluded sheet.

4.10 Parental Involvement

Depth: rename and labels only.

Core items cover books, homework help, school governing body / PTA meetings, report cards, school visits, school closure reason slots, teacher absence, and contact with officials.

Warning: school_closed_a / b / c (PR12A–C) are not cross-country comparable as coded. Slot meanings differ by survey (for example Nigeria puts COVID-19 in slot A). Read the Excel notes sheet before pooling those three columns. Use school_closed_other (PR12X) for “any other reason.”

4.11 Child Functioning

Depth: rename and labels only (no Washington Group “any difficulty” composites).

Core aids, seeing/hearing, walking, self-care, communication, cognition, psychosocial, and affect items (uses_glassessad_depressed_freq). Walking distance wording says “yards” in some surveys and “meters” in others; codes are treated as comparable. Child Discipline (FCD*) is a separate theme, not folded into FCF exclusions.

4.12 Child Discipline

Depth: rename and labels only (no violent-discipline composites).

Harmonized Source
disc_took_privilegesdisc_beat_hard FCD2AFCD2K
phys_punish_needed FCD5 (SLE: FCD3)

Sierra Leone has no FCD5; the attitude item sits in FCD3 and maps to phys_punish_needed. Filters FCD3/FCD4 (where not consumed) and country extras FCD2LN are excluded.

4.13 Foundational Learning (numeracy only)

Depth: rename and labels only (no numeracy skill scores).

Block Harmonized examples Sources
Setup fl_consent, child_consent, lang_home, lang_school, fl_child_result FL1, FL3, FL7, FL9/FL9A+FL9B, FL28
Numeracy number_id_*, number_compare_*, number_add_*, number_pattern_* FL23*, FL24*, FL25*, FL27*

lang_school prefers FL9; otherwise FL9A with FL9B fill (for example Chad). fl_child_result is missing in Sierra Leone.

All reading FL items (word lists, practice, comprehension, B/C passages) are excluded here. Use mics6_reading_harmonized and merge on country_iso3, year, HH1, HH2, LN.

4.14 Documentation the script writes

data/mics6_fs_variable_crosswalk.xlsx has four sheets:

Sheet Content
crosswalk Theme, harmonized name, label, notes, and per-survey source
excluded Source variables left out, with reasons
level_map Raw → level_h / parent *_edu_h maps
notes Theme caveats (PR12, COD school type, SLE discipline, …)

Design history for maintainers also lives under docs/fs-harmonization-plans/ in the published guide repository. You do not need that folder to run the script.

4.15 What the harmonized dataset contains

One row per child in the FS module across supported surveys you prepared.

Block Examples
Keys country_iso3, year, cluster, hhno, linech, HH1, HH2, LN
HH urban, region, n_children_5_17
WT fsweight, fshweight
INT interview_day, interview_month, interview_year, start/end hour and minutes
BG mother_edu, mother_edu_h, father_edu, father_edu_h, school_type
CB schooling fields + *_level_h
CL work, hazards, chores, hours
PR books, school engagement, closure slots
FCF functioning items
FCD discipline methods + attitude
FL numeracy items + FL setup

4.16 Known limitations

  • region, raw education levels/grades, and school_type keep country codes; do not pool them as a single taxonomy without remapping. Pooled SPSS value labels are cleared for those fields (and for languages / line identifiers) so French or mixed dictionaries from the first survey do not appear in the shared file.
  • current_grade, highest_grade, and previous_grade restart within each education level. Pair them with *_level_h before treating them as years of schooling — see Why current_grade is not the child’s grade.
  • The script does not derive child-labour, violent-discipline, functional difficulty, or foundational numeracy skill indicators.
  • Reading outcomes are not duplicated; merge the reading file when you need them.
  • Coverage of father education and school type depends on hl.sav and on how often those fields are filled on the child’s household-list row.

4.17 Checks after running

library(tidyverse)
library(haven)

d <- read_rds("data/mics6_fs_harmonized.rds")
# or: d <- read_dta("data/mics6_fs_harmonized.dta")

count(d, country_iso3, year)
ncol(d)

# Urban / rural
count(d, urban)

# Harmonised mother education
count(d, mother_edu_h)

# SLE attitude item should not be all missing
d %>% filter(country_iso3 == "SLE") %>%
  summarise(n = n(), phys_nonmiss = sum(!is.na(phys_punish_needed)))

# GMB and TGO: school_type should be missing
d %>% filter(country_iso3 %in% c("GMB", "TGO")) %>%
  summarise(school_type_nonmiss = sum(!is.na(school_type)))

4.18 Next steps

With data/mics6_fs_harmonized.dta (or .rds) in place:

The same keys also support merges onto an IPUMS-MICS extract for additional household background variables.