---
title: "Working with survey weights"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Working with survey weights}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

The Malawi Integrated Household Survey (IHS) series uses complex sampling designs rather than Simple Random Sampling (SRS). To obtain unbiased, population-representative estimates, survey weights, stratification, and clustering must be accounted for. This vignette describes how to set up and use survey designs with `ihsMW`.

## 1. Why Survey Weights Matter

To reduce fieldwork costs and improve accuracy, the Malawi National Statistical Office (NSO) designs the IHS using a **stratified two-stage cluster sample**.
- **Strata**: Usually defined by districts split into urban and rural areas.
- **Primary Sampling Units (PSUs)**: The Enumeration Areas (EAs) selected in the first stage.
- **Survey Weights**: Inverted probabilities of selection, adjusted for non-response.

Because different households have different probabilities of selection (e.g. rural households might be over- or under-sampled relative to urban ones), unweighted statistics will be biased. Standard errors computed without accounting for clustering and stratification will also be incorrectly narrow.

## 2. Setting Up the Design

The `ihs_svydesign()` function creates a survey design object by wrapping `survey::svydesign()`. It automatically detects standard weight, strata, and PSU columns inside your harmonised dataset:

```{r eval=FALSE}
library(ihsMW)
library(haven)

# Load and harmonise IHS5 data
raw_data <- read_dta("path/to/IHS5/hh_mod_a_filt.dta")
harmonised_data <- ihs_harmonise(raw_data, round = "IHS5")

# Create survey design object
# Automatically detects: hh_wgt/hhweight, stratum (IHS2-IHS5) or strata
# (IHS6), and ea_id/psu
design <- ihs_svydesign(harmonised_data)
```

If the standard columns are named differently in your data, you can specify them explicitly:

```{r eval=FALSE}
design <- ihs_svydesign(
  data = harmonised_data,
  weight_col = "custom_weight",
  strata_col = "custom_strata",
  psu_col = "custom_ea"
)
```

## 3. Weighted Analysis

Once you have the survey design object, you can compute representative statistics using the `survey` package:

```{r eval=FALSE}
library(survey)

# Nationally representative mean of household size
svymean(~hhsize, design = design, na.rm = TRUE)

# Nationally representative total of expenditure
svytotal(~food_exp, design = design, na.rm = TRUE)

# Calculate means grouped by a factor variable (e.g., region)
svyby(~food_exp, ~region, design = design, svymean, na.rm = TRUE)
```

## 4. Using srvyr

If you prefer `dplyr`-like syntax, the `srvyr` package works seamlessly with the survey design objects generated by `ihs_svydesign()`:

```{r eval=FALSE}
library(srvyr)

# Convert to srvyr design object
srvyr_design <- as_survey(design)

# Calculate summary statistics using dplyr verbs
summary_stats <- srvyr_design |>
  group_by(region) |>
  summarise(
    mean_exp = survey_mean(food_exp, na.rm = TRUE),
    total_exp = survey_total(food_exp, na.rm = TRUE)
  )
```

## 5. Summary Statistics

`ihsMW` provides `ihs_report()`, which computes a clean summary statistics table for publication. It supports survey weights directly:

```{r eval=FALSE}
# Generate a summary statistics table with survey weights
report_tbl <- ihs_report(
  data = harmonised_data,
  vars = c("hhsize", "food_exp", "nonfood_exp"),
  weights = "hh_wgt"
)
print(report_tbl)
```

You can also compute these weighted tables grouped by another variable:

```{r eval=FALSE}
# Grouped weighted summary statistics
report_grouped <- ihs_report(
  data = harmonised_data,
  vars = c("hhsize", "food_exp"),
  by = "region",
  weights = "hh_wgt"
)
```

## 6. Common Pitfalls

- **Subsetting Data Naively**: Never subset your dataframe with standard `[ ]` or `dplyr::filter()` before creating the survey design, as this breaks the cluster/strata structure and results in incorrect standard errors. Instead, define the design on the full dataset first, and then use `subset()` from the `survey` package or `srvyr::filter()` on the design object.
- **Ignoring Strata or PSU**: Using only survey weights (e.g. `weighted.mean()`) without specifying clustering (PSUs) and stratification will yield correct point estimates but incorrect (usually too small) standard errors. Always use a full survey design object for inference.
