This function performs RWLS iterations to find an
M-estimator of regression. When started from an S-estimated
beta.initial
, this results in an MM-estimator.
lmrob..M..fit(x, y, beta.initial, scale, control, obj,
mf = obj$model, method = obj$control$method)
design matrix (1
s for the intercept.
numeric response vector (of length
numeric vector (of length
robust residual scale estimate. Usually an S-scale estimator.
list of control parameters, as returned
by lmrob.control
. Currently, the components
c("max.it", "rel.tol","trace.lev", "psi", "tuning.psi", "mts", "subsampling")
are accessed.
an optional lmrob
-object. If specified, this is
typically used to set values for the other arguments.
unused and deprecated.
optional; the method
used for obj computation.
A list with the following elements:
the M-estimator (or MM-estim.) of regression
the control
list input used
The residual scale estimate
The random number generator seed
TRUE
if the RWLS iterations converged,
FALSE
otherwise
This function is used by lmrob.fit
(and
anova(<lmrob>, type = "Deviance")
) and typically not to be used
on its own.
Yohai, 1987
# NOT RUN {
data(stackloss)
X <- model.matrix(stack.loss ~ . , data = stackloss)
y <- stack.loss
## Compute manual MM-estimate:
## 1) initial LTS:
m0 <- ltsReg(X[,-1], y)
## 2) M-estimate started from LTS:
m1 <- lmrob..M..fit(X, y, beta.initial = coef(m0), scale = m0$scale, method = "SM",
control = lmrob.control(tuning.psi = 1.6, psi = 'bisquare'))
## no 'method' (nor 'obj'):
m1. <- lmrob..M..fit(X, y, beta.initial = coef(m0), scale = m0$scale,
control = m1$control)
stopifnot(all.equal(m1, m1., tol = 1e-15)) # identical {call *not* stored!}
cbind(m0$coef, m1$coef)
## the scale is kept fixed:
stopifnot(identical(unname(m0$scale), m1$scale))
## robustness weights: are
r.s <- with(m1, residuals/scale) # scaled residuals
m1.wts <- Mpsi(r.s, cc = 1.6, psi="tukey") / r.s
summarizeRobWeights(m1.wts)
##--> outliers 1,3,4,13,21
which(m0$lts.wt == 0) # 1,3,4,21 but not 13
# }
# NOT RUN {
## Manually add M-step to SMD-estimate (=> equivalent to "SMDM"):
m2 <- lmrob(stack.loss ~ ., data = stackloss, method = 'SMD')
m3 <- lmrob..M..fit(obj = m2)
## Simple function that allows custom initial estimates
## (Deprecated; use init argument to lmrob() instead.) %% MM: why deprecated?
lmrob.custom <- function(x, y, beta.initial, scale, terms) {
## initialize object
obj <- list(control = lmrob.control("KS2011"),
terms = terms) ## terms is needed for summary()
## M-step
obj <- lmrob..M..fit(x, y, beta.initial, scale, obj = obj)
## D-step
obj <- lmrob..D..fit(obj, x)
## Add some missing elements
obj$cov <- TRUE ## enables calculation of cov matrix
obj$p <- obj$qr$rank
obj$degree.freedom <- length(y) - obj$p
## M-step
obj <- lmrob..M..fit(x, y, obj=obj)
obj$control$method <- ".MDM"
obj
}
m4 <- lmrob.custom(X, y, m2$init$init.S$coef,
m2$init$scale, m2$terms)
stopifnot(all.equal(m4$coef, m3$coef))
## Start from ltsReg:
m5 <- ltsReg(stack.loss ~ ., data = stackloss)
m6 <- lmrob.custom(m5$X, m5$Y, coef(m5), m5$scale, m5$terms)
# }
Run the code above in your browser using DataLab