# fastLm

##### Bare-bones linear model fitting function

`fastLm`

estimates the linear model using the `solve`

function of `Armadillo`

linear algebra library.

- Keywords
- regression

##### Usage

```
fastLmPure(X, y)
fastLm(X, ...)
"fastLm"(X, y, ...)
"fastLm"(formula, data = list(), ...)
```

##### Arguments

- y
- a vector containing the explained variable.
- X
- a model matrix.
- formula
- a symbolic description of the model to be fit.
- data
- an optional data frame containing the variables in the model.
- ...
- not used

##### Details

Linear models should be estimated using the `lm`

function. In
some cases, `lm.fit`

may be appropriate.

The `fastLmPure`

function provides a reference use case of the `Armadillo`

library via the wrapper functions in the RcppArmadillo package.
The `fastLm`

function provides a more standard implementation of
a linear model fit, offering both a default and a formula interface as
well as `print`

, `summary`

and `predict`

methods.

Lastly, one must be be careful in timing comparisons of
`lm`

and friends versus this approach based on
`Armadillo`

. The reason that `Armadillo`

can do something
like `lm.fit`

faster than the functions in the stats
package is because `Armadillo`

uses the Lapack version of the QR
decomposition while the stats package uses a *modified* Linpack
version. Hence `Armadillo`

uses level-3 BLAS code whereas the
stats package uses level-1 BLAS. However, `Armadillo`

will
either fail or, worse, produce completely incorrect answers
on rank-deficient model matrices whereas the functions from the stats
package will handle them properly due to the modified Linpack code.

An example of the type of situation requiring extra care in checking
for rank deficiency is a two-way layout with missing cells (see the
examples section). These cases require a special pivoting scheme of
“pivot only on (apparent) rank deficiency” which is not part of
conventional linear algebra software.

##### Value

##### References

Armadillo project: http://arma.sourceforge.net/

##### See Also

##### Examples

```
data(trees, package="datasets")
## bare-bones direct interface
flm <- fastLmPure( cbind(1, log(trees$Girth)), log(trees$Volume) )
print(flm)
## standard R interface for formula or data returning object of class fastLm
flmmod <- fastLm( log(Volume) ~ log(Girth), data=trees)
summary(flmmod)
## case where fastLm breaks down
dd <- data.frame(f1 = gl(4, 6, labels = LETTERS[1:4]),
f2 = gl(3, 2, labels = letters[1:3]))[-(7:8), ]
xtabs(~ f2 + f1, dd) # one missing cell
mm <- model.matrix(~ f1 * f2, dd)
kappa(mm) # large, indicating rank deficiency
set.seed(1)
dd$y <- mm %*% seq_len(ncol(mm)) + rnorm(nrow(mm), sd = 0.1)
summary(lm(y ~ f1 * f2, dd)) # detects rank deficiency
summary(fastLm(y ~ f1 * f2, dd)) # some huge coefficients
```

*Documentation reproduced from package RcppArmadillo, version 0.7.200.2.0, License: GPL (>= 2)*