## ----eval=FALSE, citation-----------------------------------------------------
# @article{guo2024average,
#   title={Average Causal Effect Estimation in DAGs with Hidden Variables: Extensions of Back-Door and Front-Door Criteria},
#   author={Guo, Anna and Nabi, Razieh},
#   journal={arXiv preprint arXiv:2409.03962},
#   year={2024}
# }

## ----eval=FALSE, citation_frontdoor-------------------------------------------
# @article{guo2023targeted,
#   title={Targeted Machine Learning for Average Causal Effect Estimation Using the Front-Door Functional},
#   author={Guo, Anna and Benkeser, David and Nabi, Razieh},
#   journal={arXiv preprint arXiv:2312.10234},
#   year={2023}
# }

## ----load-pkg, warning=F, message=F-------------------------------------------

library(flexCausal) # load the package
data(data_example_a) # load the simulated dataset for example (a)
head(data_example_a) # take a glance of the data, which is a simulated dataset under above figure (a).


## ----eval=T, warning=F, message=F---------------------------------------------

# create a graph object for the ADMG in example (a)
graph_a <- make.graph(vertices=c('A','M','L','Y','X'), # specify the vertices
                bi_edges=list(c('A','Y')), # specify the bi-directed edges
                di_edges=list(c('X','A'), c('X','M'), c('X','L'),c('X','Y'), c('M','Y'), c('A','M'), c('A','L'), c('M','L'), c('L','Y')), # specify the directed edges, with each pair of variables indicating an directed edge from the first variable to the second. For example, c('X', 'A') represents a directed edge from X to A.
                multivariate.variables = list(M=c('M.1','M.2'))) # specify the components of the multivariate variable M


## ----eval=T, warning=F, message=F---------------------------------------------

f.adj_matrix(graph_a) # get the adjacency matrix of the ADMG in example (a)


## ----quick-start, warning=F, message=T----------------------------------------

est <- estADMG(a=c(1,0),
                data=data_example_a, 
                graph=graph_a,
                treatment='A', outcome='Y')

## ----quick-start-option2, warning=F, message=T--------------------------------

est <- estADMG(a=c(1,0),data=data_example_a, 
                vertices=c('A','M','L','Y','X'), # specify the vertices
                bi_edges=list(c('A','Y')), # specify the bi-directed edges
                di_edges=list(c('X','A'), c('X','M'), c('X','L'),c('X','Y'), c('M','Y'), c('A','M'), c('A','L'), c('M','L'), c('L','Y')), # specify the directed edges
                multivariate.variables = list(M=c('M.1','M.2')), # specify the components of the multivariate variable M
                treatment='A', outcome='Y')

## ----onestep-eg, warning=F, message=F, eval=F---------------------------------
# 
# est <- estADMG(a=c(1,0),
#                 data=data_example_a,
#                 graph = graph_a,
#                treatment='A', outcome='Y',
#                 lib.seq = c("SL.glm", "SL.earth", "SL.ranger", "SL.mean"),
#                 lib.Y = c("SL.glm", "SL.earth", "SL.ranger", "SL.mean"),
#                 lib.A = c("SL.glm", "SL.earth", "SL.ranger", "SL.mean"),
#                 crossfit = TRUE,
#                 K=5)

## ----tmle-eg, warning=F, message=F, eval=F------------------------------------
# 
# est <- estADMG(a=c(1,0),
#                 data=data_example_a,
#                 graph = graph_a,
#                 ratio.method.M = "dnorm")

## ----output, eval=F-----------------------------------------------------------
# 
# est <- estADMG(a=1,
#                 data=data_example_a,
#                 graph = graph_a,
#                 treatment='A', outcome='Y')
# 
# # TMLE and Onestep estimator
# est$TMLE # a list contains the estimation result from TMLE estimator
# est$Onestep # a list contains the estimation result from Onestep estimator
# 
# # For either the TMLE or Onestep estimator, the output is a list that contains the following elements:
# est$TMLE$EYa # the estimated average counterfactual outcome
# est$TMLE$lower.ci # the lower bound of the 95% confidence interval
# est$TMLE$upper.ci # the upper bound of the 95% confidence interval
# est$TMLE$EIF # the estimated efficient influence function
# est$TMLE.Ya$EIF.Y # the estimated efficient influence function at the tangent space associated with the outcome
# est$TMLE.Ya$EIF.A # the estimated efficient influence function at the tangent space associated with the treatment
# est$TMLE.Ya$EIF.v # the estimated efficient influence function at the tangent space associated with the rest of the variables
# est$TMLE.Ya$p.a1.mpA # the estimated propensity score for treatment
# est$TMLE.Ya$mu.next.A # the estimated sequential regression associated with variable that comes right after the treatment according to the topological ordering of the ADMG
# est$TMLE.Ya$EDstar # mean of the estimated efficient influence function
# est$TMLE.Ya$iter # iterations take for TMLE estimator to converge
# est$TMLE.Ya$EDstar.record # the mean of the estimated efficient influence function at each iteration
# 

## ----make-graph, warning=F, message=F, eval=F---------------------------------
# 
# graph_a <- make.graph(vertices=c('A','M','L','Y','X'), # specify the vertices
#                 bi_edges=list(c('A','Y')), # specify the bi-directed edges
#                 di_edges=list(c('X','A'), c('X','M'), c('X','L'),c('X','Y'), c('M','Y'), c('A','M'), c('A','L'), c('M','L'), c('L','Y')), # specify the directed edges, with each pair of variables indicating an directed edge from the first variable to the second. For example, c('X', 'A') represents a directed edge from X to A.
#                 multivariate.variables = list(M=c('M.1','M.2'))) # specify the components of the multivariate variable M
# 

## ----f-adj-matrix, warning=F, message=F, eval=F-------------------------------
# f.adj_matrix(graph_a)

## ----f-top-order, warning=F, message=F, eval=F--------------------------------
# f.top_order(graph_a)

## ----f-parents, warning=F, message=F, eval=F----------------------------------
# f.parents(graph_a, 'Y')

## ----f-children, warning=F, message=F, eval=F---------------------------------
# f.children(graph_a, 'A')
# 

## ----f-descendants, warning=F, message=F, eval=F------------------------------
# f.descendants(graph_a, 'A')
# 

## ----f-district, warning=F, message=F, eval=F---------------------------------
# f.district(graph_a, 'A')
# 

## ----f-markov-blanket, warning=F, message=F, eval=F---------------------------
# f.markov_blanket(graph_a, 'A')
# 

## ----f-markov-pillow, warning=F, message=F, eval=F----------------------------
# f.markov_pillow(graph_a, 'A')
# 

## ----is-fix, warning=F, message=F, eval=F-------------------------------------
# is.fix(graph_a, 'A')

## ----is-p-fix, warning=F, message=F, eval=F-----------------------------------
# is.p.fix(graph_a, 'A')

## ----is-np-saturated, warning=F, message=F, eval=F----------------------------
# is.np.saturated(graph_a)
# 

## ----is-mb-shielded, warning=F, message=F, eval=F-----------------------------
# is.mb.shielded(graph_a)
# 

