这是我之前关于孟德尔随机化
相关课题的一个简单笔记。其中包括了关于孟德尔随机化的简单介绍,以及一些one-sample MR 的R 语言实战。
之前也上传到gitbook 上了:1-复杂的关联性研究 - Peng的孟德尔随机化笔记[1]
y = α + βx + ε
尝试通过简单回归,来判断x 与 y 的关系。
可是这样做,都不能排除潜在的(potential confounders,C)、无法测量的混杂因素(unmeasured confounders,U)的影响。
它们可能同时会对x 与y 产生影响。
举例来说,如果想要研究教育程度(接受教育年份)对未来收入(薪资)的影响,我们的确可以对二者进行回归,假定我们也的确发现了二者的相关性。
但此时,我们得到的相关系数beta,并不能用来评价这个教育程度对未来收入的影响。因为还有很多的混淆因素,并没有被考虑,比如家庭背景等等。
因此,这样得到的相关有非常大的“虚假关联”的可能。这里换个例子,比如说,我们发现冰淇淋的销量增长,溺水的人数也在增长,直觉上我们就可以发现有一些不对劲,如果你得到结论,“冰淇淋销量与溺水人数是正相关的”,我们不可以再卖冰淇淋了,那么这里就落入了虚假关联的圈套。比如说,这里“温度“就是一个混淆因素:温度升高,买冰淇淋的人多了,冰淇淋销量升高;人们同样为了解暑,去游泳的人多了,那么溺水的人数自然也就上升了。
此外,小时候在院子里种了一棵桃树,随着时间的推移,你的个子在长,桃树也在变高,如果说“我长桃树也长”是有关系的,那么同样也是被”虚假关联“给骗了。这里的混淆变量是什么呢?
如果去探索医学科研中的“暴露”与“结局”之间的因果性呢?比如控制变量,比如广泛收集每个样本的各种暴露与结局?
然而,现实研究的案例,往往比上述案例要复杂。我们也未必能确定这些混淆因素的种类;另外,即便我们收集了这些混淆因素,我们也不便对它们控制变量。
那么我们该如何进行呢?
队列虽好,却是可望不可及的。而更加省时省力的病例对照研究,受限于其研究设计,只能得到相关系,而无法得到因果性。为了解决这一问题,统计学家们就设计了孟德尔随机化(Mendelian Randomization, MR)。——孟德尔随机化 | Mendelian randomization - Life·Intelligence - 博客园 (cnblogs.com)[2]
如果这时候,我们可以找到一个变量Z,它与我们研究的X (暴露因素) 高度相关(强相关),甚至只与它相关;且这个Z 与我们研究的Y(结局变量)有非常大的相关性。
那么我们就可以利用这个变量Z,来研究X 和Y 的关系,同时排除其他的无关混淆变量的干扰。
这里,这个变量Z 就是一个工具变量(instrumental variable,Ⅳ)。
而这个工具变量的选择,也有一些限制:
目前,工具变量已广泛应用于计量经济学中,研究如上述提到的研究教育程度(接受教育年份)对未来收入(薪资)的影响等。
那么,什么是孟德尔随机化呢?
虽然说这个方法叫做”孟德尔随机化“,也确实因为这个名字困惑了我一段时间,但实际上,它相比起我们所熟知的孟德尔的遗传规律,其主要作用还是在于相关与因果推断上。
我们姑且可以将孟德尔随机化(Mendelian Randomization,MR)理解为工具变量在流行病学与生物医学上的推广。
为什么叫孟德尔随机化呢?因为我们选择的基因变异,遵循“亲代等位基因随机分配给子代”的孟德尔遗传定律,通过测量遗传变异与暴露因素、遗传变异与疾病结局之间的关联,进而推断暴露因素与疾病结局之间的关联。
遗传变异作为工具变量有以下优点:
孟德尔随机在实验设计上也是和随机对照试验高度相似的。
在随机对照实验上,我们通过随机、盲法、对照试验,保证组间的可比性,以消除不同个体差异的干扰;而在孟德尔随机化中我们认为等位基因的分配就是一个天然的随机过程,所以如果我们找到了影响暴露的等位基因,此时我们选择不同基因型的个体进行比较就可以直接得到暴露所造成的效果。
那么我们为什么不直接使用随机对照试验,而“多此一举”的进行孟德尔随机化呢?
个人理解主要还是受限于人类医学伦理和诸多试验设计的局限。如果想要研究某药对治疗某病的效果,我们确实可以让治疗组与安慰剂组对比;但如果是酒精对心血管疾病影响,我们不可能强迫让试验人群酗酒,并查看其心血管疾病影响。
然而,我们却可以找到和酒精代谢高度相关的基因ALDH2,查看该突变结果;在人群中,我仅需要根据ALDH2 的突变类型将他们进行分组,研究二者的结果(心血管疾病发生)即可。
ps:这里我自己理解上还是有一些问题。
除了上述提到的SNP突变外,其他突变类型如INDEL(插入、缺失),或是CNV(拷贝数变异)等其他类型的变异,理论上都可以作为工具变量,应用于孟德尔随机化上。
建立遗传工具变量的方法一般包括两种。
单一样本孟德尔随机化(One-sample MR),利用单一研究样本,即暴露与结局信息来自于同一类型样本。
其核心思想还是由Z-X和Z-Y的关联来推断X-Y的关联:
目前进行单一样本孟德尔随机化的方法包括:
囿于我的统计学水平有限,这里以two-stage least-squares regression(两阶段最小二乘法),进行介绍。
比如我们想要研究教育程度(接受教育年份,暴露因素X)对未来收入(薪资,结局变量Y)的影响。
这里我使用ivreg 中的数据集:
data("SchoolingReturns", package = "ivreg")
my_data <- SchoolingReturns[, 1:8]
Rows: 3,010
Columns: 8
$ wage <dbl> 548, 481, 721, 250, 729, 500, 565, 608…
$ education <dbl> 7, 12, 12, 11, 12, 12, 18, 14, 12, 12,…
$ experience <dbl> 16, 9, 16, 10, 16, 8, 9, 9, 10, 11, 13…
$ ethnicity <fct> afam, other, other, other, other, othe…
$ smsa <fct> yes, yes, yes, yes, yes, yes, yes, yes…
$ south <fct> no, no, no, no, no, no, no, no, no, no…
$ age <dbl> 29, 27, 34, 27, 34, 26, 33, 29, 28, 29…
$ nearcollege <fct> no, no, no, yes, yes, yes, yes, yes, y…
代码部分简单带过,这里主要以原理介绍为主。
我们首先发现教育程度与未来收入确实是显著相关的p-value: < 2.2e-16
。
> summary(lm(formula = wage ~ education, data = my_data))
Call:
lm(formula = wage ~ education, data = my_data)
Residuals:
Min 1Q Median 3Q Max
-576.09 -173.36 -34.12 127.82 1686.25
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 183.949 23.104 7.962 2.38e-15 ***
education 29.655 1.708 17.368 < 2e-16 ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 250.7 on 3008 degrees of freedom
Multiple R-squared: 0.09114, Adjusted R-squared: 0.09084
F-statistic: 301.6 on 1 and 3008 DF, p-value: < 2.2e-16
接下来,我们就要使用两阶段最小二乘估计,来定量估计暴露因素X与Y之间的关联效应大小。
两阶段最小二乘估计分为两个阶段,第一阶段是将自变量的变异分解,使用工具变量对暴露因素建立回归;第二步再通过暴露因素预测值(predicted value,P)构建和结局变量Y之间的回归方程。
比如说这里我们发现有一个变量,即距离学校距离是否近。我们发现,与学校距离远近,不仅与教育程度(接受教育年份,暴露因素X)相关,它同样与未来收入(薪资,结局变量Y)相关。那么,这里学校距离远近就是一个潜在的工具变量。
我们首先需要明确工具变量对暴露因素的作用。
这里首先需要构建Z-X 回归模型:X = α + dZ + ε
。除了要看工具变量以外,还要加上外生变量做回归。
这里主要有两个目的:
第二阶段就是用工具变量对自变量的预测值来估计回归系数:Y=α + βX(Z对X的预测值) +ε
因此这个式子实际可以合并为Y = α + dZ + ε
即:
其实R 包ivreg
已经提供了方法进行最小二乘法(2SLS),不过为了了解整个R 的操作过程,这里我还是使用最基本的lm 进行二次拟合,实现整个过程。
这里我使用ivreg 中的数据集:
my_packages<- c("ggplot2", "tidyverse",
"RColorBrewer", "paletteer", "ivreg")
tmp <- sapply(my_packages, function(x) library(x, character.only = T)); rm(tmp, my_packages)
data("SchoolingReturns", package = "ivreg")
my_data <- SchoolingReturns[, 1:8]
glimpse(my_data)
Rows: 3,010
Columns: 8
$ wage <dbl> 548, 481, 721, 250, 729, 500, 565, 608…
$ education <dbl> 7, 12, 12, 11, 12, 12, 18, 14, 12, 12,…
$ experience <dbl> 16, 9, 16, 10, 16, 8, 9, 9, 10, 11, 13…
$ ethnicity <fct> afam, other, other, other, other, othe…
$ smsa <fct> yes, yes, yes, yes, yes, yes, yes, yes…
$ south <fct> no, no, no, no, no, no, no, no, no, no…
$ age <dbl> 29, 27, 34, 27, 34, 26, 33, 29, 28, 29…
$ nearcollege <fct> no, no, no, yes, yes, yes, yes, yes, y…
首先是第一阶段,通过工具变量,对暴露因素求回归:
# stage 1
tsls1 <- lm(formula = education ~ nearcollege, data = my_data)
summary(tsls1)
Call:
lm(formula = education ~ nearcollege, data = my_data)
Residuals:
Min 1Q Median 3Q Max
-11.698 -1.527 -0.527 2.473 5.302
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 12.69801 0.08564 148.269 < 2e-16 ***
nearcollegeyes 0.82902 0.10370 7.994 1.84e-15 ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.649 on 3008 degrees of freedom
Multiple R-squared: 0.02081, Adjusted R-squared: 0.02048
F-statistic: 63.91 on 1 and 3008 DF, p-value: 1.838e-15
接下来获得每一项的预测值:
d.hat <- fitted.values(tsls1) # 获得每一项的预测值
利用第一阶段的预测值结果,进行第二阶段回归分析:
# stage 2
tsls2 <- lm(formula = my_data$wage ~ d.hat)
summary(tsls2)
Call:
lm(formula = my_data$wage ~ d.hat)
Residuals:
Min 1Q Median 3Q Max
-505.64 -180.64 -35.05 121.50 1798.36
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -849.50 162.70 -5.221 1.9e-07 ***
d.hat 107.57 12.26 8.773 < 2e-16 ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 259.7 on 3008 degrees of freedom
Multiple R-squared: 0.02495, Adjusted R-squared: 0.02463
F-statistic: 76.97 on 1 and 3008 DF, p-value: < 2.2e-16
不难发现,ivreg 的拟合结果,实际上就是我们6.2 步骤里计算的结果:
# ivreg
ivreg_iv <- ivreg(wage ~ education | nearcollege, data = my_data)
summary(ivreg_iv)
> summary(ivreg_iv)
Call:
ivreg(formula = wage ~ education | nearcollege, data = my_data)
Residuals:
Min 1Q Median 3Q Max
-867.231 -205.763 -9.156 198.343 1673.630
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -849.5 204.3 -4.157 3.31e-05 ***
education 107.6 15.4 6.985 3.48e-12 ***
Diagnostic tests:
df1 df2 statistic p-value
Weak instruments 1 3008 63.91 1.84e-15 ***
Wu-Hausman 1 3007 44.89 2.48e-11 ***
Sargan 0 NA NA NA
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 326.2 on 3008 degrees of freedom
Multiple R-Squared: -0.538, Adjusted R-squared: -0.5385
Wald test: 48.8 on 1 and 3008 DF, p-value: 3.482e-12
除此之外,你可能还会注意到ivreg 的summary 结果中,默认配置了三种Diagnostic tests,下面会进行简单介绍。
据有的作者所言,2SLS 的诊断,通常来说是一个容易被忽视的话题,但在书:Regression Diagnostics | Wiley Series in Probability and Statistics[7],作者也提到了一些策略。
因为我的能力有限,就直接参考ivreg 模型诊断的结果:
异常数据诊断(Unusual-Data Diagnostics),比如通过遍历的去除每个样本数据,看最终对回归拟合结果与原来拟合结果的影响。
ivreg的内建方法提供了一个便捷的操作:
ivreg_iv <- ivreg(wage ~ education | nearcollege, data = my_data)
ivreg:::influence.ivreg(ivreg_iv)
> names(tmp)
[1] "model" "coefficients" "dfbeta"
[4] "sigma" "dffits" "cookd"
[7] "hatvalues" "rstudent" "df.residual"
其会返回多个检验方法计算出的结果列表。
亦或是我们直接查看随机去除某个样本后的拟合差异:
> car::compareCoefs(ols, tsls2, tsls2.20)
Calls:
1: lm(formula = wage ~ education, data = my_data)
2: lm(formula = my_data$wage ~ d.hat)
3: lm(formula = my_data$wage ~ d.hat, subset = -20)
Model 1 Model 2 Model 3
(Intercept) 183.9 -849.5 -849.2
SE 23.1 162.7 162.7
education 29.66
SE 1.71
d.hat 107.6 107.5
SE 12.3 12.3
具体内容参考:Diagnostics for 2SLS Regression • ivreg (john-d-fox.github.io)[8]
非线性诊断(Nonlinearity Diagnostics)。这一步大大超出了我的能力,因此仅仅展示一些R 的可视化分析结果:
# Nonlinearity Diagnostics
car::crPlots(ivreg_iv, smooth=list(span=1))
此外还有crPlots。
我们还可以可视化的展示一些结果:
par(mfrow=c(2, 2))
plot(ivreg_iv)
亦或是比较不同的拟合结果:
# ols
ols <- lm(formula = wage ~ education, data = my_data)
# stage 1
tsls1 <- lm(formula = education ~ nearcollege, data = my_data)
summary(tsls1)
d.hat <- fitted.values(tsls1) # 获得每一项的预测值
# stage 2
tsls2 <- lm(formula = my_data$wage ~ d.hat)
summary(tsls2)
car::compareCoefs(ols, tsls2)
Calls:
1: lm(formula = wage ~ education, data = my_data)
2: lm(formula = my_data$wage ~ d.hat)
Model 1 Model 2
(Intercept) 183.9 -849.5
SE 23.1 162.7
education 29.66
SE 1.71
d.hat 107.6
SE 12.3
比如在上述举例中,我们的问题是:研究教育程度(接受教育年份,暴露因素X)对未来收入(薪资,结局变量Y)的影响。
其中找到了一个关键的变量(距离学校远近,工具变量Z)。
其实推广到遗传突变上,这个布尔值可以表示野生型和突变型。
比如我们想要利用单样本孟德尔随机来研究酒精和心血管疾病的关系。那么这时候就可以使用上述类似的思路,比如将与酒精代谢高度相关的基因ALDH2作为工具变量,进行探究。
除此之外,GWAS数据库也提供了大量的暴露与结局的数据。
只不过,许多的SNPs与相应表型有唯一关联,可以从中筛选合适的工具变量通常有多个:
library(TwoSampleMR)
bmi_exp_dat <- extract_instruments(outcomes='ieu-a-2')
#> API: public: http://gwas-api.mrcieu.ac.uk/
chd_out_dat <- extract_outcome_data(snps = bmi_exp_dat$SNP, outcomes = 'ieu-a-7')
此外,这些数据也是给定了拟合值的,如果需要进行单样本的MR,直接进行二阶段拟合即可。
当然,真实世界纳入的因素也更加复杂,可以参考文章:Association Between Telomere Length and Risk of Cancer and Non-Neoplastic Diseases: A Mendelian Randomization Study | Cancer Screening, Prevention, Control | JAMA Oncology | JAMA Network[9]
因为我本人能力有限,基本统计学与因果推断的概念这几天算是看的头大,望各位指正。当然,也希望未来的我自己手下留情。
在 An example of two-stage least squares (2SLS) method with R (rstudio-pubs-static.s3.amazonaws.com)[10] 中。
作者是先预设了一组满足关系的数据:y=a+bx+cd+ey<-10+1*x+1*d+e
接着通过制作假数据,来让假数据分别按照OLS 与2SLS 来计算拟合值,并最终发现2SLS 的拟合值最为接近。
可是,在真实研究中,比如oneSampleMR,我们如何得到这个真阳性的标准呢?
即便我们可以通过判断工具变量与我们的解释变量是强相关的,是可以被使用的,这个2SLS 可以更好的拟合,那么如何来评价它有多好呢?难道仅仅是和一个相对较差的方法比?(OLS)
除此之外,在twoSampleMR 的包中采用的过程里:
我看到有教程直接通过这个pval 来判断是否存在因果。
那么是否说明,我们的2SLS 的Wald test,也可以作为判断因果的标准呢:
Residual standard error: 326.2 on 3008 degrees of freedom
Multiple R-Squared: -0.538, Adjusted R-squared: -0.5385
Wald test: 48.8 on 1 and 3008 DF, p-value: 3.482e-12
我发现,目前生命科学领域结合GWAS 公共数据分析,主要采用的还是twosampleMR,可以参见:Using published data in Mendelian randomization: a blueprint for efficient identification of causal risk factors[11]
而同样也有包提供了相关的方法:Perform MR • TwoSampleMR (mrcieu.github.io)[12]
我们可以直接利用这个R 包获得GWAS 上与感兴趣暴露因素和结局相关的遗传突变作为工具变量,直接利用内置的函数和统计方法进行分析。
mr_method_list()
#> obj
#> 1 mr_wald_ratio
#> 2 mr_two_sample_ml
#> 3 mr_egger_regression
#> 4 mr_egger_regression_bootstrap
#> 5 mr_simple_median
#> 6 mr_weighted_median
#> 7 mr_penalised_weighted_median
#> 8 mr_ivw
#> 9 mr_ivw_radial
#> 10 mr_ivw_mre
#> 11 mr_ivw_fe
#> 12 mr_simple_mode
#> 13 mr_weighted_mode
#> 14 mr_weighted_mode_nome
#> 15 mr_simple_mode_nome
#> 16 mr_raps
#> 17 mr_sign
#> 18 mr_uwr
比如上述提到的twoSampleMR 就包括了如此之多的方法。
除了方法上的oneSampleMR 选择同一类型样本对应的暴露与结局数据,而twoSampleMR 则选择不同的(不对应的)暴露与结局数据外,二者有什么本质区别呢?
此外,不同的思路下的统计方法,该如何选择呢?
另外的双向MR(Bidirectional MR)、 两阶段MR(Two-step MR)、基因-暴露交互作用MR(Gene-exposure interactions)又有什么选择和应用呢?
这里摘自:孟德尔随机化法在因果推断中的应用 (rhhz.net)[13]
近年来各种统计新方法、大样本GWAS数据、分子表观遗传学以及各种“组学”技术的应用,MR仍然有些问题比较棘手:
1、R语言工具变量与两阶段最小二乘法 - 云+社区 - 腾讯云 (tencent.com)[19]2、R数据分析:工具变量回归的做法和解释,实例解析 - 知乎 (zhihu.com)[20]3、二阶最小二乘法理论概述 - 知乎 (zhihu.com)[21]4、09 孟德尔随机化 Mendelian randomization – GWAS实验室 – GWASLab[22]5、An example of two-stage least squares (2SLS) method with R (rstudio-pubs-static.s3.amazonaws.com)[23]6、One Sample Mendelian Randomization and Instrumental Variable Analyses • OneSampleMR (remlapmot.github.io)[24]7、Perform MR • TwoSampleMR (mrcieu.github.io)[25]
8、计量经济学助教课试讲3 工具变量 IV 和 两阶段最小二乘法 2SLS_哔哩哔哩_bilibili[26]9、Mendelian Randomization - Home[27]10、孟德尔随机化系列文章 (qq.com)11、孟德尔随机化法在因果推断中的应用 (rhhz.net)[28]
[1]
1-复杂的关联性研究 - Peng的孟德尔随机化笔记: https://peng-6.gitbook.io/mendelian_randomization/jie-shao/1-fu-za-de-guan-lian-xing-yan-jiu
[2]
孟德尔随机化 | Mendelian randomization - Life·Intelligence - 博客园 (cnblogs.com): https://www.cnblogs.com/leezx/p/13357787.html
[3]
Hernán and Robins, 2006: https://doi.org/10.1097/01.ede.0000222409.00878.37
[4]
Terza, 2008: https://doi.org/10.1016/j.jhealeco.2007.09.009
[5]
Terza, 2008: https://doi.org/10.1016/j.jhealeco.2007.09.009
[6]
two-stage least-squares regression: https://academic.oup.com/ajcn/article/103/4/965/4564602#110160675
[7]
Regression Diagnostics | Wiley Series in Probability and Statistics: https://onlinelibrary.wiley.com/doi/book/10.1002/0471725153
[8]
Diagnostics for 2SLS Regression • ivreg (john-d-fox.github.io): https://john-d-fox.github.io/ivreg/articles/Diagnostics-for-2SLS-Regression.html#nonlinearity-diagnostics-1
[9]
Association Between Telomere Length and Risk of Cancer and Non-Neoplastic Diseases: A Mendelian Randomization Study | Cancer Screening, Prevention, Control | JAMA Oncology | JAMA Network: https://jamanetwork.com/journals/jamaoncology/fullarticle/2604820
[10]
An example of two-stage least squares (2SLS) method with R (rstudio-pubs-static.s3.amazonaws.com): https://rstudio-pubs-static.s3.amazonaws.com/332491_1a839b62d1ed404dbef681d83f5d01c4.html
[11]
Using published data in Mendelian randomization: a blueprint for efficient identification of causal risk factors: DOI:10.1007/s10654-015-0011-z
[12]
Perform MR • TwoSampleMR (mrcieu.github.io): https://mrcieu.github.io/TwoSampleMR/articles/perform_mr.html#mr-methods-1
[13]
孟德尔随机化法在因果推断中的应用 (rhhz.net): http://html.rhhz.net/zhlxbx/20170427.htm
[14]
[32: http://html.rhhz.net/zhlxbx/20170427.htm#b32
[15]
[33: http://html.rhhz.net/zhlxbx/20170427.htm#b33
[16]
[34: http://html.rhhz.net/zhlxbx/20170427.htm#b34
[17]
[16: http://html.rhhz.net/zhlxbx/20170427.htm#b16
[18]
[35: http://html.rhhz.net/zhlxbx/20170427.htm#b35
[19]
R语言工具变量与两阶段最小二乘法 - 云+社区 - 腾讯云 (tencent.com): https://cloud.tencent.com/developer/article/1664196
[20]
R数据分析:工具变量回归的做法和解释,实例解析 - 知乎 (zhihu.com): https://zhuanlan.zhihu.com/p/395596177
[21]
二阶最小二乘法理论概述 - 知乎 (zhihu.com): https://zhuanlan.zhihu.com/p/255209094
[22]
09 孟德尔随机化 Mendelian randomization – GWAS实验室 – GWASLab: https://gwaslab.com/category/gwas-%e5%85%a8%e5%9f%ba%e5%9b%a0%e7%bb%84%e5%85%b3%e8%81%94%e5%88%86%e6%9e%90/09-%e5%ad%9f%e5%be%b7%e5%b0%94%e9%9a%8f%e6%9c%ba%e5%8c%96-mendelian-randomization/
[23]
An example of two-stage least squares (2SLS) method with R (rstudio-pubs-static.s3.amazonaws.com): https://rstudio-pubs-static.s3.amazonaws.com/332491_1a839b62d1ed404dbef681d83f5d01c4.html
[24]
One Sample Mendelian Randomization and Instrumental Variable Analyses • OneSampleMR (remlapmot.github.io): https://remlapmot.github.io/OneSampleMR/index.html
[25]
Perform MR • TwoSampleMR (mrcieu.github.io): https://mrcieu.github.io/TwoSampleMR/articles/perform_mr.html#mr-methods-1
[26]
计量经济学助教课试讲3 工具变量 IV 和 两阶段最小二乘法 2SLS_哔哩哔哩_bilibili: https://www.bilibili.com/video/BV1Dh411n7pR
[27]
Mendelian Randomization - Home: http://www.mendelianrandomization.com/index.php
[28]
孟德尔随机化法在因果推断中的应用 (rhhz.net): http://html.rhhz.net/zhlxbx/20170427.htm