sim_vcpsr | R Documentation |
sim_vcpsr
is a varying-coefficient single-index
signal regression approach that allows both the signal coefficients
and the unknown link function to vary with
an indexing variable t
, e.g. temperature. Two surfaces
are estimated (coefficent and link) that can be sliced at arbitary t
.
Anisotripic penalization with P-splines is used on both.
sim_vcpsr(
y,
X,
t_var,
x_index = c(1:ncol(X)),
nsegs = rep(10, 4),
bdegs = rep(3, 4),
lambdas = rep(1, 4),
pords = rep(2, 4),
max_iter = 100,
mins = c(min(x_index), min(t_var)),
maxs = c(max(x_index), max(t_var))
)
y |
a response vector of length |
X |
the signal regressors with dimension |
t_var |
the varying coeffient indexing variable of length |
x_index |
an index of length |
nsegs |
a vector of length 4 containing
the number of evenly spaced segments between min and max, for each
the coefficient surface (row and col) and
link surface (row and col), resp. (default |
bdegs |
a vector of length 4 containing
the degree of B-splines, for each
the coefficient surface (row and col) and link surface (row and col), resp.
(default cubic |
lambdas |
a vector of length 4 containing
the positive tuning parameters, for each
the coefficient surface (row and col) and link surface (row and col), resp.
(default |
pords |
a vector of length 4 containing
the difference penalty order, for each
the coefficient surface (row and col) and link surface (row and col), resp.
(default |
max_iter |
a scalar for the maximum number of iterations (default 100) |
mins |
A vector length 2, containing min for signal index and |
maxs |
A vector length 2, containing max for signal index and |
y |
the response vector of length |
alpha |
the P-spline coefficient vector (unfolded) of length |
iter |
the number of iterations used for the single-index fit. |
yint |
the estimated y-intercept for the single-index model. |
Bx |
the B-spline matrix built along the signal index, using |
By |
the B-spline matrix built along the |
Q |
the effective regressors from the |
t_var |
the VC indexing variable of length |
nsegs |
a vector of length 4 containing the number of evenly spaced segments between min and max, for each the coefficient surface (row and col) and link surface (row and col). |
bdegs |
a vector of length 4 containing the degree of B-splines, for each the coefficient surface (row and col) and link surface (row and col). |
lambdas |
a vector of length 4 containing the positive tuning parameters, for each the coefficient surface (row and col) and link surface (row and col). |
pords |
a vector of length 4 containing the difference penalty order, for each the coefficient surface (row and col) and link surface (row and col). |
mins |
a vector length 2, containing min for signal index and |
maxs |
a vector length 2, containing max for signal index and |
eta |
the estimated linear predictor for the single-index fit. |
Pars |
a matrix of 2 rows associated with the signal coefficient surface
design parameters, each row: |
pPars |
a matrix of 2 rows associated with the link function
design parameters, each row: |
cv |
the leave-one-out cross-validation statistic or the standard error of prediction for the single-index fit. |
delta_alpha |
change measure in signal-coefficent parameters at convergence. |
fit2D |
|
Paul Eilers and Brian Marx
Marx, B. D. (2015). Varying-coefficient single-index signal regression. Chemometrics and Intelligent Laboratory Systems, 143, 111–121.
Eilers, P.H.C. and Marx, B.D. (2021). Practical Smoothing, The Joys of P-splines. Cambridge University Press.
# Load libraries
library(fields) # Needed for plotting
# Get the data
Dat <- Mixture
# Dimensions: observations, temperature index, signal
m <- 34
p1 <- 401
p2 <- 12
# Stacking mixture data, each mixture has 12 signals stacked
# The first differenced spectra are also computed.
mixture_data <- matrix(0, nrow = p2 * m, ncol = p1)
for (ii in 1:m)
{
mixture_data[((ii - 1) * p2 + 1):(ii * p2), 1:p1] <-
t(as.matrix(Dat$xspectra[ii, , ]))
d_mixture_data <- t(diff(t(mixture_data)))
}
# Response (typo fixed) and index for signal
y_mixture <- Dat$fractions
y_mixture[17, 3] <- 0.1501
index_mixture <- Dat$wl
# Select response and replicated for the 12 temps
# Column 1: water; 2: ethanediol; 3: amino-1-propanol
y <- as.vector(y_mixture[, 2])
y <- rep(y, each = p2)
bdegs = c(3, 3, 3, 3)
pords <- c(2, 2, 2, 2)
nsegs <- c(12, 5, 5, 5) # Set to c(27, 7, 7 ,7) for given lambdas
mins <- c(700, 30)
maxs <- c(1100, 70)
lambdas <- c(1e-11, 100, 0.5, 1) # based on svcm search
x_index <- seq(from = 701, to = 1100, by = 1) # for dX
t_var_sub <- c(30, 35, 37.5, 40, 45, 47.5, 50, 55, 60, 62.5, 65, 70)
t_var <- rep(t_var_sub, m)
max_iter <- 2 # Set higher in practice, e.g. 100
int <- TRUE
# Defining x as first differenced spectra, number of channels.
x <- d_mixture_data
# Single-index VC model using optimal tuning
fit <- sim_vcpsr(y, x, t_var, x_index, nsegs, bdegs, lambdas, pords,
max_iter = max_iter, mins = mins, maxs = maxs)
plot(fit, xlab = "Wavelength (nm)", ylab = "Temp C")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.