# lmfit: Fitter Functions for Linear Models

## Description

These are the basic computing engines called by `lm` used to fit linear models. These should usually not be used directly unless by experienced users. `.lm.fit()` is bare bone wrapper to the innermost QR-based C code, on which `glm.fit` and `lsfit` are based as well, for even more experienced users.

## Usage

 ```1 2 3 4 5 6 7``` ```lm.fit (x, y, offset = NULL, method = "qr", tol = 1e-7, singular.ok = TRUE, ...) lm.wfit(x, y, w, offset = NULL, method = "qr", tol = 1e-7, singular.ok = TRUE, ...) .lm.fit(x, y, tol = 1e-7) ```

## Arguments

 `x` design matrix of dimension `n * p`. `y` vector of observations of length `n`, or a matrix with `n` rows. `w` vector of weights (length `n`) to be used in the fitting process for the `wfit` functions. Weighted least squares is used with weights `w`, i.e., `sum(w * e^2)` is minimized. `offset` (numeric of length `n`). This can be used to specify an a priori known component to be included in the linear predictor during fitting. `method` currently, only `method = "qr"` is supported. `tol` tolerance for the `qr` decomposition. Default is 1e-7. `singular.ok` logical. If `FALSE`, a singular model is an error. `...` currently disregarded.

## Value

a `list` with components (for `lm.fit` and `lm.wfit`)

 `coefficients` `p` vector `residuals` `n` vector or matrix `fitted.values` `n` vector or matrix `effects` `n` vector of orthogonal single-df effects. The first `rank` of them correspond to non-aliased coefficients, and are named accordingly. `weights` `n` vector — only for the `*wfit*` functions. `rank` integer, giving the rank `df.residual` degrees of freedom of residuals `qr` the QR decomposition, see `qr`.

Fits without any columns or non-zero weights do not have the `effects` and `qr` components.

`.lm.fit()` returns a subset of the above, the `qr` part unwrapped, plus a logical component `pivoted` indicating if the underlying QR algorithm did pivot.

`lm` which you should use for linear least squares regression, unless you know better.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19``` ```require(utils) set.seed(129) n <- 7 ; p <- 2 X <- matrix(rnorm(n * p), n, p) # no intercept! y <- rnorm(n) w <- rnorm(n)^2 str(lmw <- lm.wfit(x = X, y = y, w = w)) str(lm. <- lm.fit (x = X, y = y)) if(require("microbenchmark")) { mb <- microbenchmark(lm(y~X), lm.fit(X,y), .lm.fit(X,y)) print(mb) boxplot(mb, notch=TRUE) } ```