tests/test_pag2conf.R

library(pcalg)
(doExtras <- pcalg:::doExtras())
if (doExtras) {
##################################################
## Mooij et al. (2020), Fig. 43(a), p. 97
##################################################

# Encode ADMG as adjacency matrix
p <- 8 # total number of variables
V <- c("Ca","Cb","Cc","X0","X1","X2","X3","X4") # 3 context variables, 5 system variables
# amat[i,j] = 0 iff no edge btw i,j
# amat[i,j] = 1 iff i *-o j
# amat[i,j] = 2 iff i *-> j
# amat[i,j] = 3 iff i *-- j
amat <- rbind(c(0,2,2,2,0,0,0,0),
              c(2,0,2,0,2,0,0,0),
              c(2,2,0,0,2,2,0,0),
              c(3,0,0,0,0,0,2,0),
              c(0,3,3,0,0,3,0,2),
              c(0,0,3,0,2,0,0,0),
              c(0,0,0,3,0,0,0,2),
              c(0,0,0,0,2,0,3,0))
rownames(amat)<-V
colnames(amat)<-V

# Make use of d-separation oracle as "independence test"
indepTest <- dsepAMTest
suffStat<-list(g=amat,verbose=FALSE)

# Derive PAG that represents the Markov equivalence class of the ADMG with the FCI algorithm
# (assuming no selection bias)
fci.pag <- fci(suffStat,indepTest,alpha = 0.5,labels = V,verbose=TRUE,selectionBias=FALSE)

# Read off causal features from the FCI PAG
cat('Identified absence (-1) and presence (+1) of pairwise latent confounding from FCI PAG:\n')
fci.conf <- pag2conf(fci.pag@amat)
print(fci.conf)

true.conf <- rbind(c(-1, 0, 0, 0,-1,-1,-1,-1),
                   c( 0,-1, 0,-1, 0,-1,-1,-1),
                   c( 0, 0,-1,-1, 0, 0,-1,-1),
                   c( 0,-1,-1,-1,-1,-1, 0,-1),
                   c(-1, 0, 0,-1,-1, 0,-1, 0),
                   c(-1,-1, 0,-1, 0,-1,-1,-1),
                   c(-1,-1,-1, 0,-1,-1,-1, 0),
                   c(-1,-1,-1,-1, 0,-1, 0,-1))

rownames(true.conf)<-V
colnames(true.conf)<-V

stopifnot(identical(true.conf,fci.conf))
}

Try the pcalg package in your browser

Any scripts or data that you put into this service are public.

pcalg documentation built on Sept. 26, 2023, 9:06 a.m.