if (FALSE) {
set.seed(42)
n <- 2000; p <- 10
Sigma <- outer(1:p, 1:p, function(i, j) 0.5^abs(i - j))
Q_raw <- mvtnorm::rmvnorm(n, rep(0, p), Sigma)
pis <- 1 / (1 + exp(-2 * Q_raw))
Q <- matrix(rbinom(n * p, 1, pis), nrow = n)
beta <- c(0.8 / (1:4), rep(0, 5))
W <- rnorm(n); U <- rnorm(n); V <- rnorm(n)
D <- as.numeric(Q[, 1:9] %*% beta + Q[, p] + V > 0)
Y <- D + Q[, 1:9] %*% beta + W + U # Q[, p] has no direct effect on Y
# Mode 1: test a pre-specified instrument (last column) directly
res1 <- detectIV(y = Y, d = D, z = Q[, p], x = Q[, 1:9])
cat("Mode 1 p-value:", round(res1$pval, 3), "\n")
# Mode 2: learn instruments and controls from Q
res2 <- detectIV(y = Y, d = D, q = Q, alpha = 0.1 / log(n))
cat("Mode 2 column indices of detected valid IVs:", res2$valid_IVs, "\n")
}
Run the code above in your browser using DataLab