Title: | Inference in Graphical Gaussian Models with Edge and Vertex Symmetries |
---|---|
Description: | Estimation, model selection and other aspects of statistical inference in Graphical Gaussian models with edge and vertex symmetries (Graphical Gaussian models with colours). Documentation about 'gRc' is provided in the paper by Hojsgaard and Lauritzen (2007, <doi:10.18637/jss.v023.i06>) and the paper by Hojsgaard and Lauritzen (2008, <doi:10.1111/j.1467-9868.2008.00666.x>). |
Authors: | Steffen Lauritzen [aut, cph], Søren Højsgaard [aut, cre, cph] |
Maintainer: | Søren Højsgaard <[email protected]> |
License: | GPL |
Version: | 0.5.1 |
Built: | 2025-01-13 03:47:58 UTC |
Source: | https://github.com/hojsgaard/grc |
Make a test for adding/dropping all colour classes in scope for an RCOX model.
## S3 method for class 'rcox' add1(object, scope, details = 0, trace = 0, ...) ## S3 method for class 'rcox' drop1(object, scope, details = 0, trace = 0, stat = "wald", ...)
## S3 method for class 'rcox' add1(object, scope, details = 0, trace = 0, ...) ## S3 method for class 'rcox' drop1(object, scope, details = 0, trace = 0, stat = "wald", ...)
object |
An RCOX model, an object of class 'rcox' |
scope |
A set of edge colour classes to be considered for addition or deletion, see 'details'. |
details |
Control the amount of output created. |
trace |
For debugging purposes |
... |
Additional arguments, currently unused. |
stat |
Either "wald" for a Wald statistic or "dev" for a deviance statistic. |
A list with entries * tab: A dataframe with the test results * cc: A list of colour classes
* Note that the keyword 'stat' is not available for add1 because this function expands the current model and hence the Wald statistic is not available.
* Based on fitting a new model for each new ecc, and may hence be slow.
Søren Højsgaard, [email protected]
comparecc
, stepadd1
,
stepdrop1
.
data(math) gc.sat <- ~me:ve:al:st:an gc.1 <- ~me+ve+al+st+an m.sat <- rcox(gm=gc.sat, data=math) m.1 <- rcox(gm=gc.1, data=math) t.sat <- drop1(m.sat) t.sat$tab t.sat$cc t.1 <- add1(m.1) t.1$tab t.1$cc
data(math) gc.sat <- ~me:ve:al:st:an gc.1 <- ~me+ve+al+st+an m.sat <- rcox(gm=gc.sat, data=math) m.1 <- rcox(gm=gc.1, data=math) t.sat <- drop1(m.sat) t.sat$tab t.sat$cc t.1 <- add1(m.1) t.1$tab t.1$cc
Calculate trace of various matrix products.
trA(A) trAW(rA, rW) trAWB(rA, rW, rB) trAWBW(rA, rW, rB) trAWBV(rA, rW, rB, rV) trAWBlist(Alist, W, Blist, mode = 0L) trAWBWlist(Alist, W, Blist, mode = 0L)
trA(A) trAW(rA, rW) trAWB(rA, rW, rB) trAWBW(rA, rW, rB) trAWBV(rA, rW, rB, rV) trAWBlist(Alist, W, Blist, mode = 0L) trAWBWlist(Alist, W, Blist, mode = 0L)
A |
A matrix |
rA , rB
|
Square matrices represented as "sparse" matrices. The dimension is inferred from dimension of V,W. |
rW , rV , W
|
Square matrices; must be of same dimension. |
Alist , Blist
|
Lists of such "sparse" matrices. |
mode |
0 or 1. |
A number
Søren Højsgaard, [email protected]
## Turn list into "sparse" matrix to_sp <- function(x){ ans <- do.call("rbind", x) storage.mode(ans)<-"double" return(ans) } ## Turn "sparse" matrix into dense matrix ## to_de <- function(A,d){ if (nrow(A) < 1) stop("need non-empty matrix\n") ans <- matrix(0,nr=d,nc=d) for (i in 1:nrow(A)){ e <- A[i,] if (length(e) == 1){ ans[e,e] <- 1 } else { ans[e[1],e[2]] <- ans[e[2],e[1]] <- 1 } } return(ans) } d <- 5 W <- matrix(rnorm(d * d), nr=d, nc=d); V <- matrix(rnorm(d * d), nr=d, nc=d); W <- W + t(W) V <- V + t(V) A1.lst <- list(c(1,2),c(1,3)) A2.lst <- list(1,3,5) A1.sp <- to_sp(A1.lst) A2.sp <- to_sp(A2.lst) A1.de <- to_de(A1.sp, d) A2.de <- to_de(A2.sp, d) trAW(A1.sp, W) sum(diag(A1.de %*% W)) trAW(A2.sp, W) sum(diag(A2.de %*% W)) trAWB(A1.sp, W, A2.sp) trAWB(A2.sp, W, A1.sp) sum(diag(A1.de %*% W %*% A2.de)) trAWBW(A1.sp, W, A2.sp) trAWBW(A2.sp, W, A1.sp) sum(diag(A1.de %*% W %*% A2.de %*% W)) trAWBV(A1.sp, W, A2.sp, V) trAWBV(A2.sp, W, A1.sp, V) sum(diag(A1.de %*% W %*% A2.de %*% V))
## Turn list into "sparse" matrix to_sp <- function(x){ ans <- do.call("rbind", x) storage.mode(ans)<-"double" return(ans) } ## Turn "sparse" matrix into dense matrix ## to_de <- function(A,d){ if (nrow(A) < 1) stop("need non-empty matrix\n") ans <- matrix(0,nr=d,nc=d) for (i in 1:nrow(A)){ e <- A[i,] if (length(e) == 1){ ans[e,e] <- 1 } else { ans[e[1],e[2]] <- ans[e[2],e[1]] <- 1 } } return(ans) } d <- 5 W <- matrix(rnorm(d * d), nr=d, nc=d); V <- matrix(rnorm(d * d), nr=d, nc=d); W <- W + t(W) V <- V + t(V) A1.lst <- list(c(1,2),c(1,3)) A2.lst <- list(1,3,5) A1.sp <- to_sp(A1.lst) A2.sp <- to_sp(A2.lst) A1.de <- to_de(A1.sp, d) A2.de <- to_de(A2.sp, d) trAW(A1.sp, W) sum(diag(A1.de %*% W)) trAW(A2.sp, W) sum(diag(A2.de %*% W)) trAWB(A1.sp, W, A2.sp) trAWB(A2.sp, W, A1.sp) sum(diag(A1.de %*% W %*% A2.de)) trAWBW(A1.sp, W, A2.sp) trAWBW(A2.sp, W, A1.sp) sum(diag(A1.de %*% W %*% A2.de %*% W)) trAWBV(A1.sp, W, A2.sp, V) trAWBV(A2.sp, W, A1.sp, V) sum(diag(A1.de %*% W %*% A2.de %*% V))
Coerce parameters in RCOX models. These functions should not be called directly by the user.
theta2K(object, theta, scale = "original") K2theta(object, K, scale = "original") ## S3 method for class 'rcon' theta2K(object, theta, scale = "original") ## S3 method for class 'rcor' theta2K(object, theta, scale = "original") ## S3 method for class 'rcon' K2theta(object, K, scale = "original") ## S3 method for class 'rcor' K2theta(object, K, scale = "original")
theta2K(object, theta, scale = "original") K2theta(object, K, scale = "original") ## S3 method for class 'rcon' theta2K(object, theta, scale = "original") ## S3 method for class 'rcor' theta2K(object, theta, scale = "original") ## S3 method for class 'rcon' K2theta(object, K, scale = "original") ## S3 method for class 'rcor' K2theta(object, K, scale = "original")
object |
Model object. |
theta |
Parameter. |
scale |
On which scales are the parameters computed. |
K |
Concentration matrix. |
Søren Højsgaard, [email protected]
A general function for pairwise comparisons of colour classes in an RCOX model, i.e. for testing whether the corresponding parameters are significantly different
comparecc( object, cc1 = NULL, cc2 = NULL, type = "ecc", stat = "wald", details = 1 )
comparecc( object, cc1 = NULL, cc2 = NULL, type = "ecc", stat = "wald", details = 1 )
object |
An RCOX model, an object of class 'rcox' |
cc1 , cc2
|
Lists of colour classes of type 'type', see 'details' for an explanation of the defaults. |
type |
Either "ecc" for edge colour classes or "vcc" for vertex colour classes |
stat |
Base the comparison on either "wald" for a Wald statistic or "dev" for a deviance statistic |
details |
Control the amount of output created. |
All colour classes specified in cc1
are compared
with all those given in cc2
(duplicate entries are not
compared). If cc2=NULL
(the default) then all colour
classes specified in cc1
are compared with all colour
classes in the model except those specified in cc1
. If
cc1=NULL
(the default) and cc2=NULL
then all
pairwise comparisons are made.
A list with entries:
tab |
A data frame with the test results |
cc1 , cc2
|
Lists of colour classes |
Søren Højsgaard, [email protected]
add1.rcox
, drop1.rcox
,
stepadd1
, stepdrop1
,
join1
, split1
,
stepjoin1
, stepsplit1
data (math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math) m1 comparecc(m1, type="vcc") comparecc(m1, type="ecc")
data (math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math) m1 comparecc(m1, type="vcc") comparecc(m1, type="ecc")
This is a general function for fitting RCOX models (i.e.\ RCON and RCOR models) using different estimation algorithms.
## S3 method for class 'rcox' fit( object, Kstart = object$Kstart, method = object$method, control = object$control, details = object$details, trace = object$trace, returnModel = TRUE, ... ) matching(object, control = object$control, trace = object$trace) ipm(object, K0, control = object$control, trace = object$trace) scoring( object, K0, control = object$control, maxit = control$maxouter, trace = object$trace )
## S3 method for class 'rcox' fit( object, Kstart = object$Kstart, method = object$method, control = object$control, details = object$details, trace = object$trace, returnModel = TRUE, ... ) matching(object, control = object$control, trace = object$trace) ipm(object, K0, control = object$control, trace = object$trace) scoring( object, K0, control = object$control, maxit = control$maxouter, trace = object$trace )
object |
An RCOX model object (an object of class 'rcox') |
Kstart |
An initial value for the concentration matrix. |
method |
The specific estimation method. Can be either "scoring", (a modified Fisher scoring algorithm), "ipm" (iterative partial maximization), "matching" (score matching) or "user" (currently not used). |
control |
A list controlling the fitting algorithms. See the 'details' section. |
details |
The amount of details printed on the screen. 0 means no details at all. |
trace |
Controls various diagnostics print outs. A debugging feature not intended for the user. |
returnModel |
If TRUE the model object m is returned with fitting info added to it. If FALSE only the fitting info is returned. |
... |
Additional arguments; currently not used. |
K0 |
Initial value for concentration matrix. |
maxit |
Maximum number of iterations. |
The fitted parameters etc. can be extracted using 'fitInfo(m)'. The control argument is a list with named entries. Most important are the entries 'maxouter' and 'maxinner' (which both defaults to 25) for controlling the estimation algorithms. For other components please refer to the code.
An RCOX model object.
Søren Højsgaard, [email protected]
data(math) gm = ~al:an:st vcc = list(~me + st, ~ve + an, ~al) ecc = list(~me:ve + me:al, ~ve:al + al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, fit=FALSE) fit(m1, method="matching") fit(m1, method="scoring") fit(m1, method="ipm")
data(math) gm = ~al:an:st vcc = list(~me + st, ~ve + an, ~al) ecc = list(~me:ve + me:al, ~ve:al + al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, fit=FALSE) fit(m1, method="matching") fit(m1, method="scoring") fit(m1, method="ipm")
Implementation of generating classes for RCOX models. These functions are not intended to be called by the user.
Søren Højsgaard, [email protected]
Get slots from RCOX model object.
getSlot(object, slot) dimension(object) logL(object) getSlot(object, slot) dataRep(object, slot = NULL) intRep(object, slot = NULL) fitInfo(object, slot = NULL) getcc(object, type) getecc(object) getvcc(object) getedges(object, complement = FALSE)
getSlot(object, slot) dimension(object) logL(object) getSlot(object, slot) dataRep(object, slot = NULL) intRep(object, slot = NULL) fitInfo(object, slot = NULL) getcc(object, type) getecc(object) getvcc(object) getedges(object, complement = FALSE)
object |
RCOX model object. |
slot |
slot. |
type |
Type of colour class. |
complement |
If FALSE, the edges of the model is returned. If TRUE, the edges not in the model is returned. |
Søren Højsgaard, [email protected]
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math) getecc(m1) getSlot(m1,"type") fitInfo(m1) fitInfo(m1,"K")
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math) getecc(m1) getSlot(m1,"type") fitInfo(m1) fitInfo(m1,"K")
This package is for statistical inference in RCOX models. That is, graphical Gaussian models where specific entries of the inverse covariance matrix or partial correlation matrix have been restricted to being equal. Entries which are restricted to being identical are displayed with identical colours in the independence graph. Hence the name of the package gRc: The "c" stands for colours.
#' @author Søren Højsgaard, [email protected]
The function for specifying RCOX models is rcox, and we refer to the help page for that function for examples.
Test for joining of two colour classes (of a specific type) by testing if their corresponding parameters are not significantly different. Split a colour class and test how much this changes the fit of the model.
object |
An RCOX model, an object of class RCOX |
scope |
A specification of colour classes which should be considered for joining/splitting. If NULL, then all colour classes are considered. |
type |
Either "ecc" for edge colour classes or "vcc" for vertex colour classes. |
stat |
Either "wald" for a Wald statistic or "dev" for deviance statistic. |
details |
Control the amount of output |
A list with entries:
tab |
A data frame with the test results |
cc |
A list of colour classes |
Note that the keyword 'stat' is not available for split1 because this function expands the current and hence the Wald statistic is not available. Note also that join1 is simply a wrapper for comparecc applied to edge colour classes.
Søren Højsgaard, [email protected]
data(math) g1 <- ~me:ve:al+al:st:an m1 <- rcox(gm=g1, data=math) join1(m1) gm = ~al:an:st vcc = list(~me+st, ~ve+an) ecc = list(~me:ve+me:al, ~ve:al+al:st) m2 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, type="rcon") split1(m2)
data(math) g1 <- ~me:ve:al+al:st:an m1 <- rcox(gm=g1, data=math) join1(m1) gm = ~al:an:st vcc = list(~me+st, ~ve+an) ecc = list(~me:ve+me:al, ~ve:al+al:st) m2 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, type="rcon") split1(m2)
Plot rcox object
## S3 method for class 'rcox' plot(x, y, ...)
## S3 method for class 'rcox' plot(x, y, ...)
x |
An rcox object |
y |
Ignored |
... |
Currently not used |
gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching') plot(m1)
gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching') plot(m1)
This is the main function for specifying and fitting RCON/RCOR models in the package along with certain utility functions.
rcox( gm = NULL, vcc = NULL, ecc = NULL, type = c("rcon", "rcor"), method = "ipm", fit = TRUE, data = NULL, S = NULL, n = NULL, Kstart = NULL, control = list(), details = 1, trace = 0 )
rcox( gm = NULL, vcc = NULL, ecc = NULL, type = c("rcon", "rcor"), method = "ipm", fit = TRUE, data = NULL, S = NULL, n = NULL, Kstart = NULL, control = list(), details = 1, trace = 0 )
gm |
Generating class for a grapical Gaussian model, see 'Examples' for an illustration |
vcc |
List of vertex colour classes for the model |
ecc |
List of edge colour classes for the model |
type |
Type of model. Default is RCON |
method |
Estimation method; see 'Details' below. |
fit |
Should the model be fitted |
data |
A dataframe |
S |
An empirical covariance matrix (as alternative to giving data as a dataframe) |
n |
The number of observations (which is needed if data is specified as an empirical covariance matrix) |
Kstart |
An initial value for K. Can be omitted. |
control |
Controlling the fitting algorithms |
details |
Controls the amount of output |
trace |
Debugging info |
Estimation methods:
* 'ipm' (default) is iterative partial maximization which when finished calculates the information matrix so that approximate variances of the parameters can be obtained using vcov().
* 'ipms' is iterative partial maximization without calculating the information matrix. This is the fastest method.
* 'scoring' is stabilised Fisher scoring.
* 'matching' is score matching followed by one step with Fisher scoring.
* 'hybrid1' is for internal use and should not be called directly
A model object of type 'RCOX'.
Søren Højsgaard, [email protected]
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching') m2 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='scoring') m3 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='ipm') m1 m2 m3 summary(m1) summary(m2) summary(m3) coef(m1) coef(m2) coef(m3) vcov(m1) vcov(m2) vcov(m3)
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching') m2 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='scoring') m3 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='ipm') m1 m2 m3 summary(m1) summary(m2) summary(m3) coef(m1) coef(m2) coef(m3) vcov(m1) vcov(m2) vcov(m3)
Get score and information for RCOX models.
getScore(m, K, scale = "original") ## S3 method for class 'rcon' getScore(m, K, scale = "original") ## S3 method for class 'rcor' getScore(m, K, scale = "original")
getScore(m, K, scale = "original") ## S3 method for class 'rcon' getScore(m, K, scale = "original") ## S3 method for class 'rcor' getScore(m, K, scale = "original")
m |
Model obect. |
K |
Concentration matrix |
scale |
On which scales are the parameters computed. |
Søren Højsgaard, [email protected]
These allow for stepwise model selection in RCOX models by. Model expansion (i.e. forward selection) is obtained by adding edge colour classes and by splitting edge/vertex colour classes. Model reduction (i.e. backward selection) is obtained by dropping edge colour classes and by joining edge/vertex colour classes.
object |
An RCOX model, an object of class RCOX |
scope |
A set (list) of items (edge colour classes or vertex colour classes) to be considered. If missing, then all items are considered. |
criterion |
Either "aic" (the default), "bic" or "test" (for significance test) |
type |
Either "ecc" for edge colour classes or "vcc" for vertex colour classes. |
k |
The multiple of the number of degrees of freedom used for the penalty when criterion is "aic". Ignored when criterion is "bic" or "test". Only k = 2 gives the genuine AIC. |
steps |
The maximum number of steps to be considered. The default is 1000 (essentially as many as required). It is typically used to stop the process early |
stat |
Either "wald" for a Wald statistic or "dev" for a deviance statistic. |
alpha |
Critical value if 'criterion' is "test". If criterion is "aic" or "bic", the critical value is 0. |
headlong |
If TRUE then at each step the first encountered edge that may be removed/added according to the current criterion is done so. |
random |
If TRUE, then the edges are examined in random order |
details |
Control the amount of output created. |
trace |
For debugging purposes |
... |
Additional arguments, currently not used. |
Either NULL or a new RCOX model.
Note that the keyword 'stat' is not available for stepadd1 and stepsplit1 because these functions expand the current model and hence the Wald statistic is not available.
Søren Højsgaard, [email protected]
split1
join1
add1.rcox
drop1.rcox
comparecc
For printing in lisp style
toLisp(v)
toLisp(v)
v |
Object to be printed |
update will update and (by default) re-fit an RCOX model. It does this by extracting the call stored in the object, updating the call and (by default) evaluating that call. Sometimes it is useful to call update with only one argument, for example if the data frame has been corrected
object |
An RCOX model, an object of class RCOX |
vcc |
Specification of the vertex colour classes in the model |
ecc |
Specification of the edge colour classes in the model |
splitvcc |
Existing vertex colour class to be split |
splitecc |
Existing edge colour class to be split |
joinvcc |
Existing vertex colour classes to be joined |
joinecc |
Existing vertex colour classes to be joined |
addecc |
New edge colour classes to be added |
dropecc |
Existing vertex color classes to be dropped (deleted) |
Kstart |
A start value for K |
fit |
Should the updated model be fitted. |
control |
A list of control parameters. |
trace |
For debugging purposes |
... |
Additional arguments, currently not used. |
A new model object of class 'rcox'.
Only one of the arguments pertaining to edge colour classes (i.e. ecc, splitecc, joinecc, dropecc, addecc) should be applied at the time. Likewise for the arguments pertaining to the vertex colour classes.
The result will otherwise be highly unpredictable and is likely to cause an error.
Søren Højsgaard, [email protected]
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching', trace=0) update(m1, joinvcc=list(~me+st, ~ve+an)) update(m1, joinecc=list(~al:an, ~an:st)) update(m1, splitvcc=~ve+an) update(m1, splitecc=~me:ve+me:al) update(m1, dropecc=list(~me:st+st:an,~al:an,~st:al)) update(m1, addecc=list(~an:me+st:ve))
data(math) gm = ~al:an:st vcc = list(~me+st, ~ve+an, ~al) ecc = list(~me:ve+me:al, ~ve:al+al:st) m1 <- rcox(gm=gm, vcc=vcc, ecc=ecc, data=math, method='matching', trace=0) update(m1, joinvcc=list(~me+st, ~ve+an)) update(m1, joinecc=list(~al:an, ~an:st)) update(m1, splitvcc=~ve+an) update(m1, splitecc=~me:ve+me:al) update(m1, dropecc=list(~me:st+st:an,~al:an,~st:al)) update(m1, addecc=list(~an:me+st:ve))
Conversions of the type xxx2yyy.
Søren Højsgaard, [email protected]