# 10. Model Formulae

Formulae are Splus expressions that state the structural form of a model in terms of the variables involved. For example, the formula

cholesterol ~ systol + age

tells us that the response variable, cholesterol, is to be modeled by an additive model in two predictors, systol and age. This model is the same as

cholesterol ~ 1 + systol + age

where the 1 indicates that an intercept is to be included in the model and is included by default. To exclude the intercept, the model is written as

cholesterol ~ -1 + systol + age

The terms in a formula can be any Splus expression which, when evaluated, can be interpreted as a variable. For example:

log(cholesterol) ~ systol + age

Expressions appearing in a model formula are interpreted as ordinary Splus expressions except for the following operators:

+
used to separate items in a list of terms to be included in the model
:
denotes interaction
*
expansion operator for interaction
eg.: systol*age is equivalent to systol + age + systol:age
-
used to delete terms in a model
eg.: systol*diastol*age - systol:diastol:age deletes the third-order interaction term
%in%
denotes nesting
eg.: smoke%in%sex where smoke corresponds to the number of cigarettes smoked, and smoke is nested within sex
The model morbidity ~ sex + smoke%in%sex would be of the form:
morbidity = intercept + (beta1)*sex + (alpha1)*sex1*smoke + (alpha2)*sex2*smoke
where beta1 corresponds to the contrast for sex.
/
expansion operator for nesting
eg.: sex/smoke (sex and then smoke within sex) is equivalent to sex + smoke%in%sex
^
crosses all the terms to the specified order
eg.: (sex + smoke + diabetes)^2 is equivalent to
sex + smoke + diabetes + sex:smoke + sex:diabetes + smoke:diabetes
poly()
generates a basis for polynomial regression
eg.: poly(x,2), poly(x,y,3) where the last argument is the degree of the polynomial
Model formulas can be saved in the same way as any other Splus object. The formula can then be reused and/or modified using the update() function. The first argument to the update() function is any object with a component named call. This can either be a saved model formula or a model fitted from a model formula. The next argument is a modelling formula, such as y ~ a + b. A single . on either side of the ~ gets replaced by the left or right side of the formula in the first argument.

```> chol1_chol~systol*bmi*age

> update(chol1, .~. -systol:bmi:age)
chol ~ systol + bmi + age + systol:bmi + systol:age + bmi:age
```