Learn R Programming

npreg (version 1.1.0)

gsm: Fit a Generalized Smooth Model

Description

Fits a generalized semi- or nonparametric regression model with the smoothing parameter selected via one of seven methods: GCV, OCV, GACV, ACV, PQL, AIC, or BIC.

Usage

gsm(formula, family = gaussian, data, weights, types = NULL, tprk = TRUE, 
    knots = NULL, skip.iter = TRUE, spar = NULL, lambda = NULL, control = list(),
    method = c("GCV", "OCV", "GACV", "ACV", "PQL", "AIC", "BIC"),
    xrange = NULL, thetas = NULL, mf = NULL)
    
# S3 method for gsm
family(object, ...)

Value

An object of class "gsm" with components:

linear.predictors

the linear fit on link scale. Use fitted.gsm to obtain the fitted values on the response scale.

se.lp

the standard errors of the linear predictors.

deviance

up to a constant, minus twice the maximized log-likelihood. Where sensible, the constant is chosen so that a saturated model has deviance zero.

cv.crit

the cross-validation criterion.

nsdf

the degrees of freedom (Df) for the null space.

df

the estimated degrees of freedom (Df) for the fit model.

df.residual

the residual degrees of freedom = nobs - df

r.squared

the squared correlation between response and fitted values.

dispersion

the estimated dispersion parameter.

logLik

the log-likelihood.

aic

Akaike's Information Criterion.

bic

Bayesian Information Criterion.

spar

the value of spar computed or given, i.e., \(s = 1 + \log_{256}(\lambda)/3\)

lambda

the value of \(\lambda\) corresponding to spar, i.e., \(\lambda = 256^{3*(s-1)}\).

penalty

the smoothness penalty \(\alpha' Q \alpha\).

coefficients

the basis function coefficients used for the fit model.

cov.sqrt

the square-root of the covariance matrix of coefficients. Note: tcrossprod(cov.sqrt) reconstructs the covariance matrix.

specs

a list with information used for prediction purposes:

knots

the spline knots used for each predictor.

thetas

the "extra" tuning parameters used to weight the penalties.

xrng

the ranges of the predictor variables.

xlev

the factor levels of the predictor variables (if applicable).

tprk

logical controlling the formation of tensor product smooths.

data

the data used to fit the model.

types

the type of smooth used for each predictor.

terms

the terms included in the fit model.

method

the method used for smoothing parameter selection. Will be NULL if lambda was provided.

formula

the formula specifying the fit model.

weights

the weights used for fitting (if applicable)

call

the matched call.

family

the input family evaluated as a function using .

iter

the number of iterations of IRPLS used.

residuals

the working (IRPLS) residuals from the fitted model.

null.deviance

the deviance of the null model (i.e., intercept only).

Arguments

Arguments for gsm:

formula

Object of class "formula" (or one that can be coerced to that class): a symbolic description of the model to be fitted. Uses the same syntax as lm and glm.

family

Description of the error distribution and link function to be used in the model. This can be a character string naming a family function, a family function, or the result of a call to a family function. See the "Family Objects" section for details.

data

Optional data frame, list or environment (or object coercible by as.data.frame to a data frame) containing the variables in the model. If not found in data, the variables are taken from environment(formula), typically the environment from which sm is called.

weights

Optional vector of weights to be used in the fitting process. If provided, weighted (penalized) likelihood estimation is used. Defaults to all 1.

types

Named list giving the type of smooth to use for each predictor. If NULL, the type is inferred from the data. See "Types of Smooths" section for details.

tprk

Logical specifying how to parameterize smooth models with multiple predictors. If TRUE (default), a tensor product reproducing kernel function is used to represent the function. If FALSE, a tensor product of marginal kernel functions is used to represent the function. See the "Multiple Smooths" section for details.

knots

Spline knots for the estimation of the nonparametric effects. For models with multiple predictors, the knot specification will depend on the tprk input. See the "Choosing Knots" section for details

skip.iter

Set to FALSE for deep tuning of the hyperparameters. Only applicable when multiple smooth terms are included. See the "Parameter Tuning" section for details.

spar

Smoothing parameter. Typically (but not always) in the range \((0,1]\). If specified lambda = 256^(3*(spar-1)).

lambda

Computational smoothing parameter. This value is weighted by \(n\) to form the penalty coefficient (see Details). Ignored if spar is provided.

control

Optional list with named components that control the optimization specs for the smoothing parameter selection routine.

Note that spar is only searched for in the interval \([lower, upper]\).

lower:

lower bound for spar; defaults to 0.

upper:

upper bound for spar; defaults to 1.

tol:

the absolute precision (tolerance) used by optimize; defaults to 1e-8.

iterlim:

the iteration limit used by nlm; defaults to 5000.

print.level:

the print level used by nlm; defaults to 0 (no printing).

epsilon:

relative convergence tolerance for IRPLS algorithm; defaults to 1e-8

maxit:

maximum number of iterations for IRPLS algorithm; defaults to 25

epsilon.out:

relative convergence tolerance for iterative NegBin update; defaults to 1e-6

maxit.out:

maximum number of iterations for iterative NegBin update; defaults to 10

method

Method for selecting the smoothing parameter. Ignored if lambda is provided.

xrange

Optional named list containing the range of each predictor. If NULL, the ranges are calculated from the input data.

thetas

Optional vector of hyperparameters to use for smoothing. If NULL, these are tuned using the requested method.

mf

Optional model frame constructed from formula and data (and potentially weights).

Note: the last two arguments are not intended to be called by the typical user of this function. These arguments are included primarily for internal usage by the boot.gsm function.

Arguments for family.gsm:

object

an object of class "gsm"

...

additional arguments (currently ignored)

Author

Nathaniel E. Helwig <helwig@umn.edu>

Family Objects

Supported families and links include:

familylink
binomiallogit, probit, cauchit, log, cloglog
gaussianidentity, log, inverse
Gammainverse, identity, log
inverse.gaussian1/mu^2, inverse, identity, log
poissonlog, identity, sqrt
NegBinlog, identity, sqrt

See NegBin for information about the Negative Binomial family.

Methods

The smoothing parameter can be selected using one of seven methods:
Generalized Cross-Validation (GCV)
Ordinary Cross-Validation (OCV)
Generalized Approximate Cross-Validation (GACV)
Approximate Cross-Validation (ACV)
Penalized Quasi-Likelihood (PQL)
Akaike's Information Criterion (AIC)
Bayesian Information Criterion (BIC)

Types of Smooths

The following codes specify the spline types:

parParametric effect (factor, integer, or numeric).
ranRandom effect/intercept (unordered factor).
nomNominal smoothing spline (unordered factor).
ordOrdinal smoothing spline (ordered factor).
linLinear smoothing spline (integer or numeric).
cubCubic smoothing spline (integer or numeric).
quiQuintic smoothing spline (integer or numeric).
perPeriodic smoothing spline (integer or numeric).
sphSpherical spline (matrix with \(d = 2\) columns: lat, long).
tpsThin plate spline (matrix with \(d \ge 1\) columns).

For finer control of some specialized spline types:

per.linLinear periodic spline (\(m = 1\)).
per.cubCubic periodic spline (\(m = 2\)).
per.quiQuintic periodic spline (\(m = 3\)).
sph.22nd order spherical spline (\(m = 2\)).
sph.33rd order spherical spline (\(m = 3\)).
sph.44th order spherical spline (\(m = 4\)).
tps.linLinear thin plate spline (\(m = 1\)).
tps.cubCubic thin plate spline (\(m = 2\)).
tps.quiQuintic thin plate spline (\(m = 3\)).

For details on the spline kernel functions, see basis.nom (nominal), basis.ord (ordinal), basis.poly (polynomial), basis.sph (spherical), and basis.tps (thin plate).

Note: "ran" is default for unordered factors when the number of levels is 20 or more, whereas "nom" is the default for unordered factors otherwise.

Choosing Knots

If tprk = TRUE, the four options for the knots input include:

1.a scalar giving the total number of knots to sample
2.a vector of integers indexing which rows of data are the knots
3.a list with named elements giving the marginal knot values for each predictor (to be combined via expand.grid)
4.a list with named elements giving the knot values for each predictor (requires the same number of knots for each predictor)

If tprk = FALSE, the three options for the knots input include:

1.a scalar giving the common number of knots for each continuous predictor
2.a list with named elements giving the number of marginal knots for each predictor
3.a list with named elements giving the marginal knot values for each predictor

Multiple Smooths

Suppose formula = y ~ x1 + x2 so that the model contains additive effects of two predictor variables.

The \(k\)-th predictor's marginal effect can be denoted as $$f_k = X_k \beta_k + Z_k \alpha_k$$ where \(X_k\) is the \(n\) by \(m_k\) null space basis function matrix, and \(Z_k\) is the \(n\) by \(r_k\) contrast space basis function matrix.

If tprk = TRUE, the null space basis function matrix has the form \(X = [1, X_1, X_2]\) and the contrast space basis function matrix has the form $$Z = \theta_1 Z_1 + \theta_2 Z_2$$ where the \(\theta_k\) are the "extra" smoothing parameters. Note that \(Z\) is of dimension \(n\) by \(r = r_1 = r_2\).

If tprk = FALSE, the null space basis function matrix has the form \(X = [1, X_1, X_2]\), and the contrast space basis function matrix has the form $$Z = [\theta_1 Z_1, \theta_2 Z_2]$$ where the \(\theta_k\) are the "extra" smoothing parameters. Note that \(Z\) is of dimension \(n\) by \(r = r_1 + r_2\).

Parameter Tuning

When multiple smooth terms are included in the model, there are smoothing (hyper)parameters that weight the contribution of each combination of smooth terms. These hyperparameters are distinct from the overall smoothing parameter lambda that weights the contribution of the penalty.

skip.iter = TRUE (default) estimates the smoothing hyperparameters using Algorithm 3.2 of Gu and Wahba (1991), which typically provides adequate results when the model form is correctly specified. The lambda parameter is tuned via the specified smoothing parameter selection method.

skip.iter = FALSE uses Algorithm 3.2 as an initialization, and then the nlm function is used to tune the hyperparameters via the specified smoothing parameter selection method. Setting skip.iter = FALSE can (substantially) increase the model fitting time, but should produce better results---particularly if the model formula is misspecified.

Details

Letting \(\eta_i = \eta(x_i)\) with \(x_i = (x_{i1}, \ldots, x_{ip})\), the function is represented as $$\eta = X \beta + Z \alpha$$ where the basis functions in \(X\) span the null space (i.e., parametric effects), and \(Z\) contains the kernel function(s) of the contrast space (i.e., nonparametric effects) evaluated at all combinations of observed data points and knots. The vectors \(\beta\) and \(\alpha\) contain unknown basis function coefficients.

Let \(\mu_i = E(y_i)\) denote the mean of the \(i\)-th response. The unknown function is related to the mean \(\mu_i\) such as $$g(\mu_i) = \eta_i$$ where \(g()\) is a known link function. Note that this implies that \(\mu_i = g^{-1}(\eta_i)\) given that the link function is assumed to be invertible.

The penalized likelihood estimation problem has the form $$ - \sum_{i = 1}^n [y_i \xi_i - b(\xi_i)] + n \lambda \alpha' Q \alpha $$ where \(\xi_i\) is the canonical parameter, \(b()\) is a known function that depends on the chosen family, and \(Q\) is the penalty matrix. Note that \(\xi_i = g_0(\mu_i)\) where \(g_0\) is the canonical link function. This implies that \(\xi_i = \eta_i\) when the chosen link function is canonical, i.e., when \(g = g_0\).

References

Berry, L. N., & Helwig, N. E. (2021). Cross-validation, information theory, or maximum likelihood? A comparison of tuning methods for penalized splines. Stats, 4(3), 701-724. tools:::Rd_expr_doi("10.3390/stats4030042")

Craven, P. and Wahba, G. (1979). Smoothing noisy data with spline functions: Estimating the correct degree of smoothing by the method of generalized cross-validation. Numerische Mathematik, 31, 377-403. tools:::Rd_expr_doi("10.1007/BF01404567")

Gu, C. (2013). Smoothing spline ANOVA models, 2nd edition. New York: Springer. tools:::Rd_expr_doi("10.1007/978-1-4614-5369-7")

Gu, C. and Wahba, G. (1991). Minimizing GCV/GML scores with multiple smoothing parameters via the Newton method. SIAM Journal on Scientific and Statistical Computing, 12(2), 383-398. tools:::Rd_expr_doi("10.1137/0912021")

Helwig, N. E. (2020). Multiple and Generalized Nonparametric Regression. In P. Atkinson, S. Delamont, A. Cernat, J. W. Sakshaug, & R. A. Williams (Eds.), SAGE Research Methods Foundations. tools:::Rd_expr_doi("10.4135/9781526421036885885")

Helwig, N. E. (2021). Spectrally sparse nonparametric regression via elastic net regularized smoothers. Journal of Computational and Graphical Statistics, 30(1), 182-191. tools:::Rd_expr_doi("10.1080/10618600.2020.1806855")

Helwig, N. E. (2024). Precise tensor product smoothing via spectral splines. Stats,

See Also

Related Modeling Functions:

ss for fitting a smoothing spline with a single predictor (Gaussian response).

sm for fitting smooth models with multiple predictors of mixed types (Gaussian response).

S3 Methods and Related Functions for "gsm" Objects:

boot.gsm for bootstrapping gsm objects.

coef.gsm for extracting coefficients from gsm objects.

cooks.distance.gsm for calculating Cook's distances from gsm objects.

cov.ratio for computing covariance ratio from gsm objects.

deviance.gsm for extracting deviance from gsm objects.

dfbeta.gsm for calculating DFBETA from gsm objects.

dfbetas.gsm for calculating DFBETAS from gsm objects.

diagnostic.plots for plotting regression diagnostics from gsm objects.

family.gsm for extracting family from gsm objects.

fitted.gsm for extracting fitted values from gsm objects.

hatvalues.gsm for extracting leverages from gsm objects.

model.matrix.gsm for constructing model matrix from gsm objects.

plot.gsm for plotting effects from gsm objects.

predict.gsm for predicting from gsm objects.

residuals.gsm for extracting residuals from gsm objects.

rstandard.gsm for computing standardized residuals from gsm objects.

rstudent.gsm for computing studentized residuals from gsm objects.

smooth.influence for calculating basic influence information from gsm objects.

smooth.influence.measures for convenient display of influential observations from gsm objects.

summary.gsm for summarizing gsm objects.

vcov.gsm for extracting coefficient covariance matrix from gsm objects.

weights.gsm for extracting prior weights from gsm objects.

Examples

Run this code
##########   EXAMPLE 1   ##########
### 1 continuous predictor

# generate data
n <- 1000
x <- seq(0, 1, length.out = n)
fx <- 3 * x + sin(2 * pi * x) - 1.5

# gaussian (default)
set.seed(1)
y <- fx + rnorm(n, sd = 1/sqrt(2))
mod <- gsm(y ~ x, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# compare to result from sm (they are identical)
mod.sm <- sm(y ~ x, knots = 10)
plot(mod.sm)
mean((mod$linear.predictors - mod.sm$fitted.values)^2)

# binomial (no weights)
set.seed(1)
y <- rbinom(n = n, size = 1, p = 1 / (1 + exp(-fx)))
mod <- gsm(y ~ x, family = binomial, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# binomial (w/ weights)
set.seed(1)
w <- as.integer(rep(c(10,20,30,40,50), length.out = n))
y <- rbinom(n = n, size = w, p = 1 / (1 + exp(-fx))) / w
mod <- gsm(y ~ x, family = binomial, weights = w, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# poisson
set.seed(1)
y <- rpois(n = n, lambda = exp(fx))
mod <- gsm(y ~ x, family = poisson, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# negative binomial (known theta)
set.seed(1)
y <- rnbinom(n = n, size = 1/2, mu = exp(fx))
mod <- gsm(y ~ x, family = NegBin(theta = 1/2), knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)
mod$family$theta    # fixed theta

# negative binomial (unknown theta)
set.seed(1)
y <- rnbinom(n = n, size = 1/2, mu = exp(fx))
mod <- gsm(y ~ x, family = NegBin, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx)^2)
mod$family$theta    # estimated theta

# gamma
set.seed(1)
y <- rgamma(n = n, shape = 2, scale = (1 / (2 + fx)) / 2)
mod <- gsm(y ~ x, family = Gamma, knots = 10)
plot(mod)
mean((mod$linear.predictors - fx - 2)^2)

# inverse.gaussian (not run; requires statmod)
##set.seed(1)
##y <- statmod::rinvgauss(n = n, mean = sqrt(1 / (2 + fx)), shape = 2)
##mod <- gsm(y ~ x, family = inverse.gaussian, knots = 10)
##plot(mod)
##mean((mod$linear.predictors - fx - 2)^2)



##########   EXAMPLE 2   ##########
### 1 continuous and 1 nominal predictor
### additive model

# generate data
n <- 1000
x <- seq(0, 1, length.out = n)
z <- factor(sample(letters[1:3], size = n, replace = TRUE))
fun <- function(x, z){
  mu <- c(-2, 0, 2)
  zi <- as.integer(z)
  fx <- mu[zi] + 3 * x + sin(2 * pi * x) - 1.5
}
fx <- fun(x, z)

# define marginal knots
probs <- seq(0, 0.9, by = 0.1)
knots <- list(x = quantile(x, probs = probs),
              z = letters[1:3])
              
# gaussian (default)
set.seed(1)
y <- fx + rnorm(n, sd = 1/sqrt(2))
mod <- gsm(y ~ x + z, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# compare to result from sm (they are identical)
mod.sm <- sm(y ~ x + z, knots = knots)
plot(mod.sm)
mean((mod$linear.predictors - mod.sm$fitted.values)^2)

# binomial (no weights)
set.seed(1)
y <- rbinom(n = n, size = 1, p = 1 / (1 + exp(-fx)))
mod <- gsm(y ~ x + z, family = binomial, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# binomial (w/ weights)
set.seed(1)
w <- as.integer(rep(c(10,20,30,40,50), length.out = n))
y <- rbinom(n = n, size = w, p = 1 / (1 + exp(-fx))) / w
mod <- gsm(y ~ x + z, family = binomial, weights = w, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# poisson
set.seed(1)
y <- rpois(n = n, lambda = exp(fx))
mod <- gsm(y ~ x + z, family = poisson, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)

# negative binomial (known theta)
set.seed(1)
y <- rnbinom(n = n, size = 1/2, mu = exp(fx))
mod <- gsm(y ~ x + z, family = NegBin(theta = 1/2), knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)
mod$family$theta    # fixed theta

# negative binomial (unknown theta)
set.seed(1)
y <- rnbinom(n = n, size = 1/2, mu = exp(fx))
mod <- gsm(y ~ x + z, family = NegBin, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx)^2)
mod$family$theta    # estimated theta

# gamma
set.seed(1)
y <- rgamma(n = n, shape = 2, scale = (1 / (4 + fx)) / 2)
mod <- gsm(y ~ x + z, family = Gamma, knots = knots)
plot(mod)
mean((mod$linear.predictors - fx - 4)^2)

# inverse.gaussian (not run; requires statmod)
##set.seed(1)
##y <- statmod::rinvgauss(n = n, mean = sqrt(1 / (4 + fx)), shape = 2)
##mod <- gsm(y ~ x + z, family = inverse.gaussian, knots = knots)
##plot(mod)
##mean((mod$linear.predictors - fx - 4)^2)

Run the code above in your browser using DataLab