set.seed(2025)
n3 <- 400
treat3 <- sample(c(0L, 1L), n3, replace = TRUE)
# ── Shared factor structure (same phi_pop as Case 1) ──────────────────────────
latent3 <- MASS::mvrnorm(n3, mu = c(0, 0, 0), Sigma = phi_pop)
EC_lat3 <- latent3[, 1]
BA_lat3 <- latent3[, 3]
lam_GPI3 <- c(0.80, 0.76, 0.82, 0.78)
item_shift <- c(0.80, 0.80, 0.00, 0.00) # GPI1 and GPI2 shift; GPI3/GPI4 do not
# ── EC and BA: fully invariant across scenarios ────────────────────────────────
EC3_items <- gen_items(EC_lat3, c(0.78, 0.82, 0.74, 0.76))
BA3_items <- gen_items(BA_lat3, c(0.72, 0.76, 0.70))
# ── Scenario A: item shift ONLY — true latent GPI is unchanged by treatment ───
GPI_lat3a <- latent3[, 2] # NO construct shift
GPI3a <- sapply(seq_along(lam_GPI3), function(i) {
lam_GPI3[i] * GPI_lat3a +
sqrt(1 - lam_GPI3[i]^2) * rnorm(n3) +
item_shift[i] * treat3
})
df3a <- data.frame(
condition = factor(treat3, labels = c("Control", "Green Marketing")),
EC1 = EC3_items[,1], EC2 = EC3_items[,2], EC3 = EC3_items[,3], EC4 = EC3_items[,4],
GPI1 = GPI3a[,1], GPI2 = GPI3a[,2], GPI3 = GPI3a[,3], GPI4 = GPI3a[,4],
BA1 = BA3_items[,1], BA2 = BA3_items[,2], BA3 = BA3_items[,3]
)
# ── Scenario B: item shift + construct shift — TRUE effect = 0.40 SD ──────────
GPI_lat3b <- latent3[, 2] + 0.40 * treat3 # construct shift
GPI3b <- sapply(seq_along(lam_GPI3), function(i) {
lam_GPI3[i] * GPI_lat3b +
sqrt(1 - lam_GPI3[i]^2) * rnorm(n3) +
item_shift[i] * treat3
})
df3b <- data.frame(
condition = factor(treat3, labels = c("Control", "Green Marketing")),
EC1 = EC3_items[,1], EC2 = EC3_items[,2], EC3 = EC3_items[,3], EC4 = EC3_items[,4],
GPI1 = GPI3b[,1], GPI2 = GPI3b[,2], GPI3 = GPI3b[,3], GPI4 = GPI3b[,4],
BA1 = BA3_items[,1], BA2 = BA3_items[,2], BA3 = BA3_items[,3]
)