dgm <- function(n, b1, b2, b3, b4, bf, bf2) {
dat <- tibble(
fid = rep(1:(n/2), each=2), # family id
id = rep(1:2, n/2),
g1 = rbinom(n/2, 2, 0.4) %>% rep(., each=2),
g2 = rbinom(n/2, 2, 0.4) %>% rep(., each=2),
g3 = rbinom(n/2, 2, 0.4) %>% rep(., each=2),
g4 = rbinom(n/2, 2, 0.4) %>% rep(., each=2),
f = rnorm(n),
e = rnorm(n),
v = rnorm(n, 0, g3 * b3),
covar = rnorm(n, 0, 0.5),
y = drop(covar + scale(g1) * b1 + scale(g2) * b2 + f * bf + f * drop(scale(g2)) * bf2 + v + e + scale(g4) * b4),
ysq = y^2,
ysq_norm = inormal(ysq),
l = drop(exp(scale(y) * 0.1)),
l_norm = inormal(l),
score = rpois(n, l),
score_norm = inormal(score),
score_res = residuals(lm(y ~ covar)),
score_res_norm = inormal(score_res)
)
dat2 <- dat %>%
group_by(fid) %>%
summarise(
g1 = g1[1],
g2 = g2[1],
g3 = g3[1],
g4 = g4[1],
yraw = y[1]-y[2],
y = abs(yraw),
ysq = abs(ysq[1]+ysq[2]),
ysq_norm = abs(ysq_norm[1]+ysq_norm[2]),
l = abs(l[1]-l[2]),
l_norm = abs(l_norm[1]-l_norm[2]),
score = abs(score[1]-score[2]),
score_norm = abs(score_norm[1]-score_norm[2]),
score_res = abs(score_res[1]-score_res[2]),
score_res_norm = abs(score_res_norm[1]-score_res_norm[2])
)
return(list(dat=dat, dat2=dat2))
}
est <- function(out) {
dat <- out$dat
dat2 <- out$dat2
o <- bind_rows(
reg("y ~ g1", dat, "pop"),
reg("y ~ g2", dat, "pop"),
reg("y ~ g3", dat, "pop"),
reg("y ~ g4", dat, "pop"),
reg("yraw ~ g1", dat2, "mz"),
reg("yraw ~ g2", dat2, "mz"),
reg("yraw ~ g3", dat2, "mz"),
reg("yraw ~ g4", dat2, "mz"),
reg("y ~ g1", dat2, "mz"),
reg("y ~ g2", dat2, "mz"),
reg("y ~ g3", dat2, "mz"),
reg("y ~ g4", dat2, "mz"),
reg("ysq ~ g1", dat2, "mz"),
reg("ysq ~ g2", dat2, "mz"),
reg("ysq ~ g3", dat2, "mz"),
reg("ysq ~ g4", dat2, "mz"),
reg("ysq_norm ~ g1", dat2, "mz"),
reg("ysq_norm ~ g2", dat2, "mz"),
reg("ysq_norm ~ g3", dat2, "mz"),
reg("ysq_norm ~ g4", dat2, "mz"),
reg("l ~ g1", dat2, "mz"),
reg("l ~ g2", dat2, "mz"),
reg("l ~ g3", dat2, "mz"),
reg("l ~ g4", dat2, "mz"),
reg("l_norm ~ g1", dat2, "mz"),
reg("l_norm ~ g2", dat2, "mz"),
reg("l_norm ~ g3", dat2, "mz"),
reg("l_norm ~ g4", dat2, "mz"),
reg("score ~ g1", dat2, "mz"),
reg("score ~ g2", dat2, "mz"),
reg("score ~ g3", dat2, "mz"),
reg("score ~ g4", dat2, "mz"),
reg("score_norm ~ g1", dat2, "mz"),
reg("score_norm ~ g2", dat2, "mz"),
reg("score_norm ~ g3", dat2, "mz"),
reg("score_norm ~ g4", dat2, "mz"),
reg("score_res ~ g1", dat2, "mz"),
reg("score_res ~ g2", dat2, "mz"),
reg("score_res ~ g3", dat2, "mz"),
reg("score_res ~ g4", dat2, "mz"),
reg("score_res_norm ~ g1", dat2, "mz"),
reg("score_res_norm ~ g2", dat2, "mz"),
reg("score_res_norm ~ g3", dat2, "mz"),
reg("score_res_norm ~ g4", dat2, "mz")
)
return(o)
}