glm and
gam. Families that already exist in S-PLUS include
Gamma,
binomial,
gaussian,
inverse.gaussian,
poisson and
quasi.
make.family(name, link, variance, name.link, name.variance)
link defining the link function for the family; a function named
inverse defining the inverse of the link;
a function named
deriv defining the derivative of the link;
and, an expression named
initialize which provides initial values for the fitting algorithm.
See the
family.object help file for more details on
initialize.
The
link list can also have a
names component, which is a character string giving the name of the link.
If
name.link is not specified, the
names component is required.
To use a link that is already included in S-PLUS, specify the appropriate column of
glm.links.
variance defining the variance function for the family;
and, a function named
deviance defining the deviance.
The
variance list can also have a
names component, which is a character string giving the name of the variance.
If
name.variance is not specified, the
names component is required.
To use a variance that is already included in S-PLUS, specify the appropriate column of
glm.variances.
link does not have a
names component, then
name.link is required.
variance does not have a
names component, then
name.variance is required.
family argument to
glm and
gam. For more details on the structure of a family, see the
family.object help file.
The combination of a link and variance comprise a family in generalized linear models and generalized additive models.
There are many common combinations of link and variance functions, but only some are included in S-PLUS.
If you would like to use a family in your analysis that is not yet part of S-PLUS, you will need to use the
make.family function. The example data sets
glm.links and
glm.variances provide the necessary information for the link and variance functions already included in S-PLUS.
The information in these data sets can be used as templates when defining your own custom links and variances.
# A family object for the negative binomial distribution
# with link log(mu/(mu+theta)) and variance mu + mu^2/theta,
# for a parameter theta.
neg.binomial <- function(theta = stop("theta must be given"))
{
nb.link <- list(
names = "log(mu/(mu + theta))",
link = substitute(function(mu, th = .Theta) {
log(mu/(mu + th))
},
frame = list(.Theta = theta)),
inverse = substitute(function(eta, th = .Theta)
{
tmp <- care.exp(eta)
return((tmp * th) / (1 - tmp))
},
frame = list(.Theta = theta)),
deriv = substitute(function(mu, th = .Theta)
{
d <- mu * (mu + th)
if(any(tiny <- (d < .Machine$double.eps))) {
warning("Model unstable")
d[tiny] <- .Machine$double.eps
}
return(th / d)
},
frame = list(.Theta = theta)),
initialize = expression(mu <- y + (y==0)/6))
nb.variance <- list(
names = "mu + mu^2/theta",
variance = substitute(function(mu, th = .Theta) {
mu * (1 - mu/th)
},
frame = list(.Theta = theta)),
deviance = substitute(
function(mu, y, w, residuals = F, th = .Theta)
{
devi <- 2 * w * (y * log(pmax(1,y) / mu) -
(y + th) * log((y + th) / (mu + th)))
if(residuals)
return(sign(y - mu) * sqrt(abs(devi)))
else
return(sum(devi))
},
frame = list(.Theta = theta)))
make.family(
name = "Negative binomial",
link = nb.link,
variance = nb.variance)
}