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.
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
- Complete Download the MICS Data so each survey folder
under
data/MICS_Datasets/holdsfs.sav. Parent education and school type also needhl.savin the same folder. - Obtain
harmonize-mics-fs-v1.0.R(for example from the AFLEARN GitHub assets for this guide) and save it asdata/harmonize-mics-fs-v1.0.R. - Set the R working directory to the folder that contains
data/(not todata/itself). - 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/:
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_glasses … sad_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_privileges … disc_beat_hard |
FCD2A–FCD2K |
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 FCD2L–N 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, andschool_typekeep 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, andprevious_graderestart within each education level. Pair them with*_level_hbefore 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.savand 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:
- Read
Why current_grade is not the child’s grade before
using
current_gradeas a year of schooling. - Build or refresh reading outcomes with
Harmonising MICS6 reading outcomes and merge on
country_iso3,year,HH1/HH2/LN(orcluster/hhno/linech). - Follow R Tutorial or Stata Tutorial for analysis.
The same keys also support merges onto an IPUMS-MICS extract for additional household background variables.