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.
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.
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).
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:
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 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. |
Code Boilerplate for Stata, R & Python
Standardized code snippets to load, clean, and weight PLFS microdata correctly in statistical packages:
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)