Pedagogical Reference Infrastructure / Official Microdata Handbooks

MoSPI Survey School: The Microdata Methodology Handbook

A rigorous guide to understanding two-stage stratified sampling designs, survey weighting multipliers, interpenetrating sub-sample variance calculations, and statistical concept boundaries in Indian official microdata.

01

Two-Stage Stratified Sampling Architecture

Official nationwide household surveys conducted by the Ministry of Statistics and Programme Implementation (MoSPI) and the National Statistical Office (NSO)—including the Periodic Labour Force Survey (PLFS) and the Time Use Survey (TUS)—use a stratified two-stage sampling design.

Design Stages

  • First Stage Units (FSUs): Census villages in rural sectors and Urban Frame Survey (UFS) blocks in urban sectors, selected with Probability Proportional to Size with Replacement (PPSWR) or Circular Systematic Sampling (CSS).
  • Second Stage Units (SSUs): Households listed within each sample FSU (or sub-divided hamlet-groups / sub-blocks for large FSUs), stratified into Second Stage Strata (SSS) by economic criteria (e.g. household land possessed, MPCE, or presence of educated members).
  • Third Stage (Members): All usual members residing in sampled households are listed in the demographic roster.
02

Survey Multipliers & Weighting Rules

Microdata records are accompanied by design weights (multipliers). Estimating population totals or ratios without multipliers yields unweighted sample frequencies that do not represent national or state aggregates.

Combined Sample Multiplier Rule
Weight = MULT / 100 (if multiplier has 2 implicit decimals) or Weight = MULT / 200 for sub-sample combined annual pools.

In the Annual Survey of Industries (ASI), the design comprises a Census Sector (establishments employing ≥ 100 workers or located in specified smaller states, where Multiplier = 1.0) and a Sample Sector (strata sampled with probability proportional to size, where Multiplier > 1.0).

03

Interpenetrating Sub-sample Variance & Standard Errors

MoSPI surveys draw two independent, interpenetrating sub-samples (s = 1, 2) from each stratum. The variance of an estimated aggregate Ŷ is derived directly from the divergence between sub-sample totals:

Sub-sample Variance Estimator
V̂(Ŷ) = Σs=1..S [(Ŷs1 − Ŷs2)2 / 4]

SE(Ŷ) = √V̂(Ŷ),   RSE(%) = [SE(Ŷ) / Ŷ] × 100

For ratio estimators R̂ = Ŷ / X̂ (such as WPR or LFPR), the Relative Standard Error is computed using the combined-ratio mean squared error formula across all strata S.

V̂(R̂) = (1 / X̂2) Σs=1..S [(ΔYs)2 + R̂2(ΔXs)2 − 2R̂(ΔYs)(ΔXs)] / 4
04

The Concept Ladder: UPS vs UPSS vs CWS vs CDS

Labour force statistics in India are classified under four distinct reference concepts:

Concept Reference Period Work Definition Analytical Purpose
Usual Principal Status (UPS) 365 Days (Major time) Activity occupying the largest duration (>183 days) of the preceding year. Measures stable, primary workforce attachment.
Usual Status (UPSS) 365 Days (UPS + Subsidiary) Includes principal workers + individuals with ≥ 30 days of subsidiary economic activity. Official headline indicator for total economic participation.
Current Weekly Status (CWS) 7 Days (Preceding week) Activity of ≥ 1 hour on any single day during the 7-day reference week. Captures short-term, seasonal, and urban rotational dynamics.
Current Daily Status (CDS) Each half-day of 7 days 1–4 hours = 0.5 day; >4 hours = 1.0 day. Measures underemployment and person-day intensity of work.
05

Code Boilerplate for Stata, R & Python

Standardized code snippets to load, clean, and weight PLFS microdata correctly in statistical packages:

Python (Pandas + MoSPI Survey Multipliers)
import pandas as pd
import numpy as np

# Load PLFS person-level dataset
df = pd.read_parquet('plfs_person_records.parquet')

# Construct normalized sample weight (MULT / 100 for single annual pool)
df['weight'] = df['MULT'] / 100.0

# Working-age population universe (Age 15+)
age15_plus = df[df['age'] >= 15]

# Activity Status Codes:
# Workers (WPR): Self-Employed (11,12,21), Regular Salaried (31), Casual Labour (41,51)
is_worker = age15_plus['status_upss'].isin([11, 12, 21, 31, 41, 51])

# Unemployed: Seeking / available for work (81)
is_unemployed = age15_plus['status_upss'].isin([81])

# Labour Force (LFPR): Workers + Unemployed
is_labour_force = is_worker | is_unemployed

# Calculate Design-Weighted UPSS Estimates
weighted_pop = age15_plus['weight'].sum()
weighted_workers = age15_plus.loc[is_worker, 'weight'].sum()
weighted_lf = age15_plus.loc[is_labour_force, 'weight'].sum()

wpr_upss = (weighted_workers / weighted_pop) * 100
lfpr_upss = (weighted_lf / weighted_pop) * 100
ur_upss = ((weighted_lf - weighted_workers) / weighted_lf) * 100

print("National LFPR (UPSS, Age 15+): %.2f%%" % lfpr_upss)
print("National WPR  (UPSS, Age 15+): %.2f%%" % wpr_upss)
print("National UR   (UPSS, Age 15+): %.2f%%" % ur_upss)