Calculates the (profile, if necessary) loglikelihood for a pair of
parameters from which confidence regions can be plotted using
plot.confreg
.
An object of class "chandwich"
returned by
adjust_loglik
.
A vector of length 2 specifying the 2 (unfixed)
parameters for which confidence region is required.
Can be either a numeric vector, specifying indices of the components
of the full parameter vector, or a character vector of
parameter names, which must be a subset of those supplied in
par_names
in the call to adjust_loglik
that
produced object
.
which_pars
must not have any parameters in common with
attr(object, "fixed_pars")
. which_pars
must not contain
all of the unfixed parameters, i.e. there is no point in profiling over
all the unfixed parameters.
If which_pars
is not supplied but the current model has exactly
two free parameters, i.e. attr(object, "p_current") = 2
then
which_pars
is set to attr(object, "free_pars") = 2
.
Numeric vectors of length 2. Respective ranges (of
the form c(lower, upper)
) of values of which_pars[1]
and
which_pars[2]
over which to profile.
Missing values in range1
and/or range2
are
filled in using conf
and mult
. See below for details.
A numeric scalar in (0, 100). The highest confidence level
of interest. This is only relevant if range1
and/or range2
are not completely specified. In that event conf
is used,
in combination with mult
, to try to set up the grid of parameter
values to include the largest confidence region of interest.
A numeric vector of length 1 or the same length as
which_pars
.
The search for the profile loglikelihood-based confidence limits is
conducted over the corresponding symmetric confidence intervals
(based on approximate normal theory), extended
by a factor of the corresponding component of mult
.
A numeric vector of length 1 or 2. The numbers of values at which
to evaluate the profile loglikelihood either side of the MLE.
num[i]
relates to which_pars[i]
. If num
has length
1 then num
is replicated to have length 2.
A character scalar. The argument type
to the function
returned by adjust_loglik
, that is, the type of adjustment
made to the independence loglikelihood function.
Further arguments to be passed to optim
.
These may include gr
, method
, lower
, upper
or control
. Any arguments that are not appropriate for
optim
, i.e. not in
methods::formalArgs(stats::optim)
,
will be removed without warning.
An object of class "confreg", a list with components
Numeric vectors. Respective values of
which_pars[1]
and which_pars[2]
in the grid over which
the (profile) loglikelihood is evaluated.
A numeric scalar. The value value of the loglikelihood at its maximum.
An 2 num
+ 1 by 2 num
+ 1
numeric matrix containing the values of the (profile) loglikelihood.
A character scalar. The input type
.
A numeric or character vector. The input
which_pars
. If the which_pars
was numeric then
it is supplemented by the parameter names, if these are available
in object
.
A character scalar. The name of the model,
stored in attr(object, "name")
.
adjust_loglik
to adjust a user-supplied
loglikelihood function.
conf_intervals
for confidence intervals for
individual parameters.
compare_models
to compare nested models using an
(adjusted) likelihood ratio test.
# -------------------------- GEV model, owtemps data -----------------------
# ------------ following Section 5.2 of Chandler and Bate (2007) -----------
gev_loglik <- function(pars, data) {
o_pars <- pars[c(1, 3, 5)] + pars[c(2, 4, 6)]
w_pars <- pars[c(1, 3, 5)] - pars[c(2, 4, 6)]
if (isTRUE(o_pars[2] <= 0 | w_pars[2] <= 0)) return(-Inf)
o_data <- data[, "Oxford"]
w_data <- data[, "Worthing"]
check <- 1 + o_pars[3] * (o_data - o_pars[1]) / o_pars[2]
if (isTRUE(any(check <= 0))) return(-Inf)
check <- 1 + w_pars[3] * (w_data - w_pars[1]) / w_pars[2]
if (isTRUE(any(check <= 0))) return(-Inf)
o_loglik <- log_gev(o_data, o_pars[1], o_pars[2], o_pars[3])
w_loglik <- log_gev(w_data, w_pars[1], w_pars[2], w_pars[3])
return(o_loglik + w_loglik)
}
# Initial estimates (method of moments for the Gumbel case)
sigma <- as.numeric(sqrt(6 * diag(var(owtemps))) / pi)
mu <- as.numeric(colMeans(owtemps) - 0.57722 * sigma)
init <- c(mean(mu), -diff(mu) / 2, mean(sigma), -diff(sigma) / 2, 0, 0)
# Log-likelihood adjustment of the full model
par_names <- c("mu[0]", "mu[1]", "sigma[0]", "sigma[1]", "xi[0]", "xi[1]")
large <- adjust_loglik(gev_loglik, data = owtemps, init = init,
par_names = par_names)
# \donttest{
# Plots like those in Figure 4 of Chandler and Bate (2007)
# (a)
which_pars <- c("mu[0]", "mu[1]")
reg_1 <- conf_region(large, which_pars = which_pars)
#> Waiting for profiling to be done...
reg_none_1 <- conf_region(large, which_pars = which_pars, type = "none")
#> Waiting for profiling to be done...
plot(reg_1, reg_none_1)
# (b)
which_pars <- c("sigma[0]", "sigma[1]")
reg_2 <- conf_region(large, which_pars = which_pars)
#> Waiting for profiling to be done...
reg_none_2 <- conf_region(large, which_pars = which_pars, type = "none")
#> Waiting for profiling to be done...
plot(reg_2, reg_none_2)
# (c)
# Note: the naive and bivariate model contours are the reversed in the paper
which_pars <- c("sigma[0]", "xi[0]")
reg_3 <- conf_region(large, which_pars = which_pars)
#> Waiting for profiling to be done...
reg_none_3 <- conf_region(large, which_pars = which_pars, type = "none")
#> Waiting for profiling to be done...
plot(reg_3, reg_none_3)
# }
# --------- Misspecified Poisson model for negative binomial data ----------
# ... following Section 5.1 of the "Object-Oriented Computation of Sandwich
# Estimators" vignette of the sandwich package
# https://cran.r-project.org/web/packages/sandwich/vignettes/sandwich-OOP.pdf
# Simulate data
set.seed(123)
x <- rnorm(250)
y <- rnbinom(250, mu = exp(1 + x), size = 1)
# Fit misspecified Poisson model
fm_pois <- glm(y ~ x + I(x^2), family = poisson)
summary(fm_pois)$coefficients
#> Estimate Std. Error z value Pr(>|z|)
#> (Intercept) 1.06326821 0.04135723 25.709367 9.184267e-146
#> x 0.99607219 0.05353446 18.606186 2.862861e-77
#> I(x^2) -0.04912373 0.02314608 -2.122335 3.380961e-02
# Contributions to the independence loglikelihood
pois_glm_loglik <- function(pars, y, x) {
log_mu <- pars[1] + pars[2] * x + pars[3] * x ^ 2
return(dpois(y, lambda = exp(log_mu), log = TRUE))
}
pars <- c("alpha", "beta", "gamma")
# Linear model (gamma fixed at 0)
pois_lin <- adjust_loglik(pois_glm_loglik, y = y, x = x, par_names = pars,
fixed_pars = "gamma")
pois_vertical <- conf_region(pois_lin)
#> Waiting for profiling to be done...
pois_none <- conf_region(pois_lin, type = "none")
#> Waiting for profiling to be done...
plot(pois_none, pois_vertical, conf = c(50, 75, 95, 99), col = 2:1, lwd = 2,
lty = 1)