umxMR
(umxTwoStage
) implements a Mendelian randomization or instrumental variable Structural Equation Model.
For ease of learning, the parameters follow the tsls()
function in the sem package.
umxTwoStage(
formula = Y ~ X,
instruments = ~qtl,
data,
std = FALSE,
subset,
contrasts = NULL,
name = "IV_model",
tryHard = c("no", "yes", "ordinal", "search"),
...
)
mxModel()
The structural equation to be estimated (default = Y ~ X). A constant is implied if not explicitly deleted.
A one-sided formula specifying instrumental variables (default = qtl).
Frame containing the variables in the model.
Standardize the manifests before running model (default is FALSE)
(optional) vector specifying a subset of observations to be used in fitting the model.
An optional list (not supported)
The model name (default is "IVmodel")
Default ('no') uses normal mxRun. "yes" uses mxTryHard. Other options: "ordinal", "search"
arguments to be passed along. (not supported)
The example is a Mendelian Randomization analysis showing the utility of SEM over two-stage regression.
The following figure shows how the MR model appears as a path diagram:
Fox, J. (1979) Simultaneous equation models and two-stage least-squares. In Schuessler, K. F. (ed.) Sociological Methodology, Jossey-Bass.
Greene, W. H. (1993) Econometric Analysis, Second Edition, Macmillan.
Sekula, P., Del Greco, M. F., Pattaro, C., & Kottgen, A. (2016). Mendelian Randomization as an Approach to Assess Causality Using Observational Data. Journal of the American Society of Nephrology, 27), 3253-3265. tools:::Rd_expr_doi("10.1681/ASN.2016010098")
umx_make_MR_data()
, umxDiffMZ()
, umxDoC()
, umxDiscTwin()
Other Super-easy helpers:
umxEFA()
,
umx
if (FALSE) {
# ====================================
# = Mendelian Randomization analysis =
# ====================================
library(umx)
df = umx_make_MR_data(10e4)
m1 = umxMR(Y ~ X, instruments = ~ qtl, data = df)
parameters(m1)
plot(m1, means = FALSE, min="") # help DiagrammR layout the plot.
m2 = umxModify(m1, "qtl_to_X", comparison=TRUE, tryHard="yes", name="QTL_affects_X") # yip
m3 = umxModify(m1, "X_to_Y" , comparison=TRUE, tryHard="yes", name="X_affects_Y") # nope
plot(m3, means = FALSE)
# Errant analysis using ordinary least squares regression (WARNING this result is CONFOUNDED!!)
m1 = lm(Y ~ X , data = df); coef(m1) # incorrect .35 effect of X on Y
m1 = lm(Y ~ X + U, data = df); coef(m1) # Controlling U reveals the true 0.1 beta weight
df = umx_make_MR_data(10e4)
m1 = umxMR(Y ~ X, instruments = ~ qtl, data = df)
coef(m1)
# ======================
# = Now with sem::tsls =
# ======================
# library(sem) # may require you to install X11
m2 = sem::tsls(formula = Y ~ X, instruments = ~ qtl, data = df)
coef(m2)
# Try with missing value for one subject: A benefit of the FIML approach in OpenMx.
m3 = tsls(formula = Y ~ X, instruments = ~ qtl, data = (df[1, "qtl"] = NA))
}
Run the code above in your browser using DataLab