## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 6,
  fig.height = 4
)
library(WMAP)

## ----install, eval=FALSE------------------------------------------------------
# # Install from CRAN
# install.packages("WMAP")
# 
# # Load package
# library(WMAP)

## ----load-data----------------------------------------------------------------
# Load demonstration dataset
data(demo)

# The demo data contains:
# S - Study/site indicators (7 hospitals)
# Z - Group indicators (2 groups: IDC vs ILC)
# X - Patient covariates (clinical variables)
# Y - Outcomes (8 gene expression measurements)
# naturalGroupProp - Known population group proportions

## ----basic-analysis-----------------------------------------------------------
# Estimate causal effects
result <- causal.estimate(
  S = S,                           # Study indicators
  Z = Z,                           # Group indicators
  X = X,                           # Covariates
  Y = Y,                           # Outcomes
  B = 20,                          # Bootstrap samples (use 100+ in practice)
  method = "IC",                   # Weighting method
  naturalGroupProp = naturalGroupProp,
  seed = 123                       # For reproducibility
)

## ----results------------------------------------------------------------------
# Print summary
summary(result)

# Visualize bootstrap ESS distribution
plot(result)

## ----methods, eval=FALSE------------------------------------------------------
# # Compare methods
# result_ic <- causal.estimate(S, Z, X, Y, B = 100, method = "IC", naturalGroupProp)
# result_igo <- causal.estimate(S, Z, X, Y, B = 100, method = "IGO", naturalGroupProp)
# result_flexor <- causal.estimate(S, Z, X, Y, B = 100, method = "FLEXOR", naturalGroupProp)
# 
# # Compare ESS
# result_ic$percentESS
# result_igo$percentESS
# result_flexor$percentESS

## ----outcome-model, eval=FALSE------------------------------------------------
# # Default: use observed outcomes directly
# result <- causal.estimate(S, Z, X, Y, B = 100, method = "IC",
#                           naturalGroupProp = naturalGroupProp)
# 
# # RF predictions substituted for observed Y
# result <- causal.estimate(S, Z, X, Y, B = 100, method = "IC",
#                           naturalGroupProp = naturalGroupProp,
#                           outcome_model = TRUE)

## ----crossfit, eval=FALSE-----------------------------------------------------
# # Enable 5-fold cross-fitting
# result <- causal.estimate(S, Z, X, Y, B = 100, method = "IC",
#                           naturalGroupProp = naturalGroupProp,
#                           outcome_model = TRUE,
#                           crossfit_folds = 5)

## ----bootstrap-size, eval=FALSE-----------------------------------------------
# # Minimum for stable CIs
# result <- causal.estimate(S, Z, X, Y, B = 50, method = "IC", naturalGroupProp)
# 
# # Recommended for publication
# result <- causal.estimate(S, Z, X, Y, B = 200, method = "IC", naturalGroupProp)
# 
# # High precision
# result <- causal.estimate(S, Z, X, Y, B = 500, method = "IC", naturalGroupProp)

## ----no-bootstrap, eval=FALSE-------------------------------------------------
# # Point estimates only (no confidence intervals)
# result <- causal.estimate(S, Z, X, Y, B = 0, method = "IC", naturalGroupProp)
# summary(result)  # Shows point estimates without CIs

## ----parallel, eval=FALSE-----------------------------------------------------
# # Install required packages first
# install.packages(c("future", "future.apply"))
# 
# # Define n_cores based on your system (e.g., 4)
# result <- causal.estimate(
#   S, Z, X, Y,
#   B = 100,
#   method = "IC",
#   naturalGroupProp = naturalGroupProp,
#   parallel = TRUE,
#   n_cores = 4
# )

## ----low-ess-demo, eval=FALSE-------------------------------------------------
# # Example warning:
# # Warning message:
# # Low effective sample size: 3.1% (threshold: 5%).

## ----extreme-weights-demo, eval=FALSE-----------------------------------------
# # Example warning:
# # Warning message:
# # Extreme weights: max/mean ratio = 45.2 (threshold: 20).

## ----positivity-demo, eval=FALSE----------------------------------------------
# # Example warning:
# # Warning message:
# # Sparse study-group cells: 2 cell(s) with < 5 observations.
# 
# # Example warning:
# # Warning message:
# # Near-zero propensity scores: 6.3% of subjects truncated.

## ----standard-workflow, eval=FALSE--------------------------------------------
# # 1. Load and check data
# data(demo)
# table(S, Z)  # Check all cells have observations
# sum(is.na(cbind(S, Z, X, Y)))  # Check for missing values
# 
# # 2. Run analysis
# result <- causal.estimate(
#   S, Z, X, Y,
#   B = 100,
#   method = "FLEXOR",
#   naturalGroupProp = naturalGroupProp,
#   seed = 123
# )
# 
# # 3. Check diagnostics
# summary(result)
# plot(result)

## ----comparison-workflow, eval=FALSE------------------------------------------
# # Compare all three methods
# set.seed(123)
# 
# results_ic <- causal.estimate(S, Z, X, Y, B = 100, method = "IC", naturalGroupProp)
# results_igo <- causal.estimate(S, Z, X, Y, B = 100, method = "IGO", naturalGroupProp)
# results_flexor <- causal.estimate(S, Z, X, Y, B = 100, method = "FLEXOR", naturalGroupProp)
# 
# # Compare ESS
# cat("IC ESS:", results_ic$percentESS, "%\n")
# cat("IGO ESS:", results_igo$percentESS, "%\n")
# cat("FLEXOR ESS:", results_flexor$percentESS, "%\n")
# 
# # Compare estimates
# summary(results_ic)
# summary(results_igo)
# summary(results_flexor)

## ----sensitivity-workflow, eval=FALSE-----------------------------------------
# # Test sensitivity to bootstrap sample size
# result_b50 <- causal.estimate(S, Z, X, Y, B = 50, method = "IGO", naturalGroupProp, seed = 123)
# result_b100 <- causal.estimate(S, Z, X, Y, B = 100, method = "IGO", naturalGroupProp, seed = 123)
# result_b200 <- causal.estimate(S, Z, X, Y, B = 200, method = "IGO", naturalGroupProp, seed = 123)
# 
# # Compare CI widths
# summary(result_b50)
# summary(result_b100)
# summary(result_b200)

## ----weights-workflow, eval=FALSE---------------------------------------------
# # Get weights
# weights <- balancing.weights(
#   S, Z, X,
#   method = "IC",
#   naturalGroupProp = naturalGroupProp
# )
# 
# # Examine weight distribution
# summary(weights)
# 
# # Access weight vector for custom analysis
# head(weights$wt.v)

## ----reproducibility, eval=FALSE----------------------------------------------
# result1 <- causal.estimate(S, Z, X, Y, B = 100, method = "IC", naturalGroupProp, seed = 123)
# result2 <- causal.estimate(S, Z, X, Y, B = 100, method = "IC", naturalGroupProp, seed = 123)

## ----data-quality, eval=FALSE-------------------------------------------------
# # Check for missing values
# sum(is.na(cbind(S, Z, X, Y)))
# 
# # Ensure all study-group combinations have observations
# table(S, Z)

## ----help, eval=FALSE---------------------------------------------------------
# # Function documentation
# ?causal.estimate
# ?balancing.weights
# 
# # Package citation
# citation("WMAP")

