library(dplyr)
library(ggplot2)
library(simulateGP)
library(dplyr)
library(TwoSampleMR)

Simulate a model where genotypes influence X and U and U has some influence on X. What are the effects of genotypes on X? What fraction of GWAS hits are direct effects for each percentile of magnitude of G-X assoc?

nd <- 1000
nc <- 1000
np <- 100

bxy <- 0.5
bgx <- abs(rnorm(nd))
bgu <- abs(rnorm(nc))

bgux <- bgu * bxy

d <- tibble(b = c(bgx, bgux), path=c(rep("direct", nd), rep("confounder", each=nc))) %>%
    arrange(b) %>%
    mutate(ord=1:n(), perc = ntile(b, np)) %>%
    group_by(perc) %>%
    summarise(b=mean(b), n=n(), prop=sum(path=="direct")/n())

d %>%
ggplot(., aes(x=perc, y=b)) +
geom_jitter(aes(colour=prop)) +
scale_colour_gradient(low="red", high="blue") +
labs(y="Genetic effect on X", x="Percentile", colour="Probability of GWAS hit being a direct effect") +
theme(legend.position="bottom")

Figure is used here: https://drive.google.com/file/d/1XW9f0cUUt8jGZWmea11Nb3kN2JsR0sQ5/view?usp=sharing

Bias from G-U instruments

This is the expected effect estimate of X on Y using an instrument that arises via U:

\[ \beta_{IV,u} = \frac{\beta_{gu} \beta_{uy} + \beta_{gu} \beta_{ux} \beta_{xy}}{\beta_{gu} \beta_{ux}} \] which simplifies to

\[ \beta_{IV,u} = \frac{\beta_{uy}}{\beta_{ux}} + \beta_{xy} \] Check that this is correct

nid <- 10000
gx <- rbinom(nid, 2, 0.3)
gu <- rbinom(nid, 2, 0.3)

u <- gu + rnorm(nid)
xl <- gx + rnorm(nid)

param <- expand.grid(
    bux = seq(-1, 1, by=0.2),
    buy = seq(-1, 1, by=0.2),
    bxy = c(0, 0.5)
)

out <- lapply(1:nrow(param), function(i)
{
    x <- xl + u * param$bux[i]
    y <- x * param$bxy[i] + u * param$buy[i] + rnorm(nid)
    p <- param[i,]
    p$bgx <- get_effs(x, y, matrix(gx, nid, 1)) %>% mr() %>% {.$b}
    p$bgu <- get_effs(x, y, matrix(gu, nid, 1)) %>% mr() %>% {.$b}
    return(p)
}) %>% bind_rows()

out$exp_gu <- out$buy / out$bux + out$bxy
plot(bgu ~ exp_gu, subset(out, !is.infinite(exp_gu)))

LS0tCnRpdGxlOiAiRGlyZWN0IHZzIGNvbmZvdW5kZXIgaW5zdHJ1bWVudHMiCmF1dGhvcjogIkdpYnJhbiBIZW1hbmkiCmRhdGU6ICIyMDIyLTAyLTA5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNpbXVsYXRlR1ApCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoVHdvU2FtcGxlTVIpCmBgYAoKClNpbXVsYXRlIGEgbW9kZWwgd2hlcmUgZ2Vub3R5cGVzIGluZmx1ZW5jZSBYIGFuZCBVIGFuZCBVIGhhcyBzb21lIGluZmx1ZW5jZSBvbiBYLiBXaGF0IGFyZSB0aGUgZWZmZWN0cyBvZiBnZW5vdHlwZXMgb24gWD8gV2hhdCBmcmFjdGlvbiBvZiBHV0FTIGhpdHMgYXJlIGRpcmVjdCBlZmZlY3RzIGZvciBlYWNoIHBlcmNlbnRpbGUgb2YgbWFnbml0dWRlIG9mIEctWCBhc3NvYz8KCmBgYHtyfQpuZCA8LSAxMDAwCm5jIDwtIDEwMDAKbnAgPC0gMTAwCgpieHkgPC0gMC41CmJneCA8LSBhYnMocm5vcm0obmQpKQpiZ3UgPC0gYWJzKHJub3JtKG5jKSkKCmJndXggPC0gYmd1ICogYnh5CgpkIDwtIHRpYmJsZShiID0gYyhiZ3gsIGJndXgpLCBwYXRoPWMocmVwKCJkaXJlY3QiLCBuZCksIHJlcCgiY29uZm91bmRlciIsIGVhY2g9bmMpKSkgJT4lCglhcnJhbmdlKGIpICU+JQoJbXV0YXRlKG9yZD0xOm4oKSwgcGVyYyA9IG50aWxlKGIsIG5wKSkgJT4lCglncm91cF9ieShwZXJjKSAlPiUKCXN1bW1hcmlzZShiPW1lYW4oYiksIG49bigpLCBwcm9wPXN1bShwYXRoPT0iZGlyZWN0IikvbigpKQoKZCAlPiUKZ2dwbG90KC4sIGFlcyh4PXBlcmMsIHk9YikpICsKZ2VvbV9qaXR0ZXIoYWVzKGNvbG91cj1wcm9wKSkgKwpzY2FsZV9jb2xvdXJfZ3JhZGllbnQobG93PSJyZWQiLCBoaWdoPSJibHVlIikgKwpsYWJzKHk9IkdlbmV0aWMgZWZmZWN0IG9uIFgiLCB4PSJQZXJjZW50aWxlIiwgY29sb3VyPSJQcm9iYWJpbGl0eSBvZiBHV0FTIGhpdCBiZWluZyBhIGRpcmVjdCBlZmZlY3QiKSArCnRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKYGBgCgpGaWd1cmUgaXMgdXNlZCBoZXJlOiBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzFYVzlmMGNVVXQ4akdaV21lYTExTmIza04ySnNSMHNRNS92aWV3P3VzcD1zaGFyaW5nCgojIyBCaWFzIGZyb20gRy1VIGluc3RydW1lbnRzCgpUaGlzIGlzIHRoZSBleHBlY3RlZCBlZmZlY3QgZXN0aW1hdGUgb2YgWCBvbiBZIHVzaW5nIGFuIGluc3RydW1lbnQgdGhhdCBhcmlzZXMgdmlhIFU6CgokJApcYmV0YV97SVYsdX0gPSBcZnJhY3tcYmV0YV97Z3V9IFxiZXRhX3t1eX0gKyBcYmV0YV97Z3V9IFxiZXRhX3t1eH0gXGJldGFfe3h5fX17XGJldGFfe2d1fSBcYmV0YV97dXh9fQokJAp3aGljaCBzaW1wbGlmaWVzIHRvCgokJApcYmV0YV97SVYsdX0gPSBcZnJhY3tcYmV0YV97dXl9fXtcYmV0YV97dXh9fSArIFxiZXRhX3t4eX0KJCQKQ2hlY2sgdGhhdCB0aGlzIGlzIGNvcnJlY3QKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpuaWQgPC0gMTAwMDAKZ3ggPC0gcmJpbm9tKG5pZCwgMiwgMC4zKQpndSA8LSByYmlub20obmlkLCAyLCAwLjMpCgp1IDwtIGd1ICsgcm5vcm0obmlkKQp4bCA8LSBneCArIHJub3JtKG5pZCkKCnBhcmFtIDwtIGV4cGFuZC5ncmlkKAoJYnV4ID0gc2VxKC0xLCAxLCBieT0wLjIpLAoJYnV5ID0gc2VxKC0xLCAxLCBieT0wLjIpLAoJYnh5ID0gYygwLCAwLjUpCikKCm91dCA8LSBsYXBwbHkoMTpucm93KHBhcmFtKSwgZnVuY3Rpb24oaSkKewoJeCA8LSB4bCArIHUgKiBwYXJhbSRidXhbaV0KCXkgPC0geCAqIHBhcmFtJGJ4eVtpXSArIHUgKiBwYXJhbSRidXlbaV0gKyBybm9ybShuaWQpCglwIDwtIHBhcmFtW2ksXQoJcCRiZ3ggPC0gZ2V0X2VmZnMoeCwgeSwgbWF0cml4KGd4LCBuaWQsIDEpKSAlPiUgbXIoKSAlPiUgey4kYn0KCXAkYmd1IDwtIGdldF9lZmZzKHgsIHksIG1hdHJpeChndSwgbmlkLCAxKSkgJT4lIG1yKCkgJT4lIHsuJGJ9CglyZXR1cm4ocCkKfSkgJT4lIGJpbmRfcm93cygpCgpvdXQkZXhwX2d1IDwtIG91dCRidXkgLyBvdXQkYnV4ICsgb3V0JGJ4eQpwbG90KGJndSB+IGV4cF9ndSwgc3Vic2V0KG91dCwgIWlzLmluZmluaXRlKGV4cF9ndSkpKQpgYGAKCgo=