get_restricted_ou {glinvci} | R Documentation |
Convenience function for constructing restricted/reparameterised OU parameterisation function.
Description
get_restricted_ou
is a convenience function for constructing restricted/reparameterised
OU parameterisation.
Usage
get_restricted_ou(H = NULL, theta = NULL, Sig = NULL, lossmiss = "halt")
Arguments
H |
One of |
theta |
One of |
Sig |
One of |
lossmiss |
One of |
Details
get_restricted_ou
is intended to provide a more convenient way to construct the
restrictions functions, restricted Jacobian and Hessian, than the more flexible methods
described in parameter_restriction
.
If either one of H
, theta
is 'zero' but not both, the function stops with error.
This is because former is statistically not sensible, and the latter can be done by directly
passing a vector of zero to the theta
argument.
If lossmiss is NULL
, the returned functions does not have capability to handle missing or
lost values.
Value
A list containing the following elements:
par |
A reparameterisation function conforming to the format required by the |
jac |
A Jacobian function of the above reparameterisation function conforming to the format
required by the |
hess |
A Hessian function of the above reparameterisation function conforming to the format
required by the |
nparams |
A function which accepts one integer argument, the total number of dimensions of the multivariate traits, and returns the number of parameters of the restricted model. |
Examples
### --- STEP 1: Make an example tree
set.seed(0x5EEDL, kind='Super-Duper')
ntips = 200
k = 2 # No. of trait dimensions
tr = ape::rtree(ntips)
x0 = rnorm(k)
### --- STEP 2: Make a model which has unrestricted H, fixed theta and diagonal Sigma_x'.
repar = get_restricted_ou(H=NULL, theta=c(3,1), Sig='diag', lossmiss=NULL)
mod = glinv(tr, x0, X=NULL,
pardims =repar$nparams(k),
parfns =repar$par,
parjacs =repar$jac,
parhess =repar$hess)
# Actually, to save typing, the following short-cut call is the same as the above:
# mod = glinv(tr, x0, X=NULL, repar=repar)
### --- STEP 3: Set up parameters; H, theta, and sig_x needs to be concatenated
H = matrix(c(1,0,0,-1), k)
theta = c(3,1)
sig = matrix(c(0.25,0,0,0.25), k)
sig_x = t(chol(sig))
par_truth = c(H=H, sig_x=c(0.5,0.5))
### --- STEP 4: Get a simulated data set to toy with
X = rglinv(mod, par=par_truth)
set_tips(mod, X)
### --- STEP 5: Make an unrestricted model object to compare with the one
### whose parameters are restricted.
mod_unrestricted = glinv(tr, x0, X,
pardims=nparams_ou(k),
parfns=oupar,
parjacs=oujac,
parhess=ouhess)
### --- STEP 6: Confirm this is indeed the same as typing everything manually
## Does the restricted model gives the same likelihood as the unrestricted? (Yes, it does.)
LIK = lik(mod)(par_truth)
LIK_unrestricted = lik(mod_unrestricted)(c(H,theta,sig_x[lower.tri(sig_x, diag=TRUE)]))
print(LIK == LIK_unrestricted)
# [1] TRUE
## We can as well type everything manually as follows. This mod_manual should be
## the same as the mod object; just a different way of calling the glinv function.
mod_manual = glinv(tr, x0, X,
pardims = nparams_ou_fixedtheta_diagSig(k),
parfns = ou_fixedtheta_diagSig(oupar, theta=c(3,1)),
parjacs = dou_fixedtheta_diagSig(oujac, theta=c(3,1)),
parhess = hou_fixedtheta_diagSig(ouhess, theta=c(3,1)))
LIK_manual = lik(mod_manual)(par_truth)
print(LIK == LIK_manual) #It's really the same
# [1] TRUE