set.seed(123)
N <- 400
n <- 200 # Number of labeled observations
labeled_indices <- sample(1:N, n)
# Generate covariates and treatment
X <- rnorm(N)
A <- rbinom(N, 1, plogis(X))
# True potential outcomes
Y0_true <- X + rnorm(N)
Y1_true <- X + 1 + rnorm(N)
# Observed outcomes
Y_full <- ifelse(A == 1, Y1_true, Y0_true)
# Only labeled samples have observed Y
Y <- rep(NA, N)
Y[labeled_indices] <- Y_full[labeled_indices]
R <- rep(0, N); R[labeled_indices] <- 1
# Nuisance parameter estimates (can be replaced by actual model predictions)
mu1 <- X + 0.5
mu0 <- X - 0.5
pi1 <- plogis(X)
pi0 <- 1 - pi1
imp.A <- plogis(X)
imp.A1Y1 <- plogis(X) * (X + 0.5)
imp.A0Y1 <- (1 - plogis(X)) * (X - 0.5)
# Estimate ATE
result <- ate.SSL(
Y = Y,
A = A,
R = R,
mu1 = mu1,
mu0 = mu0,
pi1 = pi1,
pi0 = pi0,
imp.A = imp.A,
imp.A1Y1 = imp.A1Y1,
imp.A0Y1 = imp.A0Y1
)
print(result$est)
print(result$se)
Run the code above in your browser using DataLab