Learn R Programming

VGAM (version 1.0-2)

amlnormal: Asymmetric Least Squares Quantile Regression

Description

Asymmetric least squares, a special case of maximizing an asymmetric likelihood function of a normal distribution. This allows for expectile/quantile regression using asymmetric least squares error loss.

Usage

amlnormal(w.aml = 1, parallel = FALSE, lexpectile = "identitylink", iexpectile = NULL, imethod = 1, digw = 4)

Arguments

w.aml
Numeric, a vector of positive constants controlling the percentiles. The larger the value the larger the fitted percentile value (the proportion of points below the ``w-regression plane''). The default value of unity results in the ordinary least squares (OLS) solution.

parallel
If w.aml has more than one value then this argument allows the quantile curves to differ by the same amount as a function of the covariates. Setting this to be TRUE should force the quantile curves to not cross (although they may not cross anyway). See CommonVGAMffArguments for more information.

lexpectile, iexpectile
See CommonVGAMffArguments for more information.

imethod
Integer, either 1 or 2 or 3. Initialization method. Choose another value if convergence fails.

digw
Passed into Round as the digits argument for the w.aml values; used cosmetically for labelling.

Value

An object of class "vglmff" (see vglmff-class). The object is used by modelling functions such as vglm and vgam.

Details

This is an implementation of Efron (1991) and full details can be obtained there. Equation numbers below refer to that article. The model is essentially a linear model (see lm), however, the asymmetric squared error loss function for a residual $r$ is $r^2$ if $r <= 0$="" and="" $w*r^2$="" if="" $r=""> 0$. The solution is the set of regression coefficients that minimize the sum of these over the data set, weighted by the weights argument (so that it can contain frequencies). Newton-Raphson estimation is used here.

References

Efron, B. (1991) Regression percentiles using asymmetric squared error loss. Statistica Sinica, 1, 93--125.

See Also

amlpoisson, amlbinomial, amlexponential, bmi.nz, alaplace1, denorm, lms.bcn and similar variants are alternative methods for quantile regression.

Examples

Run this code
## Not run: 
# # Example 1
# ooo <- with(bmi.nz, order(age))
# bmi.nz <- bmi.nz[ooo, ]  # Sort by age
# (fit <- vglm(BMI ~ sm.bs(age), amlnormal(w.aml = 0.1), data = bmi.nz))
# fit@extra  # Gives the w value and the percentile
# coef(fit, matrix = TRUE)
# 
# # Quantile plot
# with(bmi.nz, plot(age, BMI, col = "blue", main =
#      paste(round(fit@extra$percentile, digits = 1),
#            "expectile-percentile curve")))
# with(bmi.nz, lines(age, c(fitted(fit)), col = "black"))
# 
# # Example 2
# # Find the w values that give the 25, 50 and 75 percentiles
# find.w <- function(w, percentile = 50) {
#   fit2 <- vglm(BMI ~ sm.bs(age), amlnormal(w = w), data = bmi.nz)
#   fit2@extra$percentile - percentile
# }
# # Quantile plot
# with(bmi.nz, plot(age, BMI, col = "blue", las = 1, main =
#      "25, 50 and 75 expectile-percentile curves"))
# for (myp in c(25, 50, 75)) {
# # Note: uniroot() can only find one root at a time
#   bestw <- uniroot(f = find.w, interval = c(1/10^4, 10^4), percentile = myp)
#   fit2 <- vglm(BMI ~ sm.bs(age), amlnormal(w = bestw$root), data = bmi.nz)
#   with(bmi.nz, lines(age, c(fitted(fit2)), col = "orange"))
# }
# 
# # Example 3; this is Example 1 but with smoothing splines and
# # a vector w and a parallelism assumption.
# ooo <- with(bmi.nz, order(age))
# bmi.nz <- bmi.nz[ooo, ]  # Sort by age
# fit3 <- vgam(BMI ~ s(age, df = 4), data = bmi.nz, trace = TRUE,
#              amlnormal(w = c(0.1, 1, 10), parallel = TRUE))
# fit3@extra  # The w values, percentiles and weighted deviances
# 
# # The linear components of the fit; not for human consumption:
# coef(fit3, matrix = TRUE)
# 
# # Quantile plot
# with(bmi.nz, plot(age, BMI, col="blue", main =
#      paste(paste(round(fit3@extra$percentile, digits = 1), collapse = ", "),
#            "expectile-percentile curves")))
# with(bmi.nz, matlines(age, fitted(fit3), col = 1:fit3@extra$M, lwd = 2))
# with(bmi.nz, lines(age, c(fitted(fit )), col = "black"))  # For comparison
# ## End(Not run)

Run the code above in your browser using DataLab