## Announcements

**Extra**office hours:Fri (3/15) 1-2pm,

Mon (3/18) 11am-12:30pm

## Non-linear regression

\[ y_i = \eta(\mathbf{x_i}, \pmb{\beta}) + \epsilon_i \quad \epsilon_i \sim N(0, \sigma^2) \]

where \(\eta\) is a known function \(\mathbf{x}_i\) is a vector of covariates and \(\pmb{\beta}\) a vector of \(p\) unknown parameters.

Distinctions:

- If \(\eta(\mathbf{x}, \pmb{\beta}) = \mathbf{x}^T\pmb{\beta}\) then we are in the usual linear regression setting.
- If \(\eta(\mathbf{x}, \pmb{\beta})\) is unknown but we are willing to represent it using basis functions, we are in the smooth regression setting.

## Example: `MASS::wtloss`

The data frame gives the weight, in kilograms, of an obese patient at 52 time points over an 8 month period of a weight rehabilitation programme.

## Example: A potential model

\[ y_t = \beta_0 + \beta_1 2^{-t/\theta} + \epsilon_t \] \(\beta_0\), \(\beta_1\) are linear parameters, \(\theta\) is a non-linear parameter.

**Your turn**

- When \(t = 0\), what is \(\E{y_i}\)?

- When \(t = \infty\), what is \(\E{y_i}\)?

- If \(\E{y_i} = \beta_0 + \tfrac{1}{2}\beta_1\), what is \(t\)?

## Fitting non-linear models

Under the Normal error assumption, the MLE of \(\pmb{\beta}\), minimizes \[ \sum_{i = 1}^n (y_i - \eta(\mathbf{x_i}, \pmb{\beta}))^2 \] (the sum of squared residuals) a.k.a non-linear least squares.

There isn’t in general a closed form solution, so iterative procedures are used.

This means you need to provide starting values from the parameters and check that the procedure converged.

## Your turn

What might be reasonable values for \(\beta_0\), \(\beta_1\) and \(\theta\)?

## In R: `nls()`

```
wtloss.st <- c(b0 = 100, b1 = 80, th = 100)
fit_nls <- nls(Weight ~ b0 + b1*2^(-Days/th),
data = wtloss, start = wtloss.st)
fit_nls
```

```
## Nonlinear regression model
## model: Weight ~ b0 + b1 * 2^(-Days/th)
## data: wtloss
## b0 b1 th
## 81.37 102.68 141.91
## residual sum-of-squares: 39.24
##
## Number of iterations to convergence: 4
## Achieved convergence tolerance: 5.259e-08
```

`summary(fit_nls)`

```
##
## Formula: Weight ~ b0 + b1 * 2^(-Days/th)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## b0 81.374 2.269 35.86 <2e-16 ***
## b1 102.684 2.083 49.30 <2e-16 ***
## th 141.910 5.295 26.80 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.8949 on 49 degrees of freedom
##
## Number of iterations to convergence: 4
## Achieved convergence tolerance: 5.259e-08
```

```
ggplot(wtloss, aes(Days, Weight)) +
geom_line(aes(y = fitted(fit_nls)))
```

## Example: `MASS::muscle`

The purpose of this experiment was to assess the influence of calcium in solution on the contraction of heart muscle in rats. The left auricle of 21 rat hearts was isolated and on several occasions a constant-length strip of tissue was electrically stimulated and dipped into various concentrations of calcium chloride solution, after which the shortening of the strip was accurately measured as the response.

Strip | Conc | Length | |
---|---|---|---|

3 |
S01 | 1 | 15.8 |

4 |
S01 | 2 | 20.8 |

5 |
S01 | 3 | 22.6 |

6 |
S01 | 4 | 23.8 |

9 |
S02 | 1 | 20.6 |

10 |
S02 | 2 | 26.8 |

## Example: `MASS::muscle`

```
ggplot(muscle, aes(Conc, log(Length))) +
geom_point() +
facet_wrap(~ Strip)
```

## Example: The same parameters for every strip

\[ \log{y_{ij}} = \alpha + \beta \rho^{x_{ij}} + \epsilon_{ij} \] \(j\) indexes Strip, \(i\) the ith measurement on a strip.

```
fit_all <- nls(log(Length) ~ cbind(1, rho^Conc), muscle,
start = list(rho = 0.05), algorithm = "plinear")
pred_grid <- with(muscle, expand.grid(Conc = seq(0, 4, 0.1),
Strip = unique(Strip)))
pred_grid$fit_all <- predict(fit_all, pred_grid)
```

The `plinear`

algorithm takes advantage of the linear parameters.

## Example: The same parameters for every strip

## Example: Different parameters for every strip

\[ \log{y_{ij}} = \alpha_j + \beta_j \rho^{x_{ij}} + \epsilon_{ij} \]

```
fit_each <- nls(log(Length) ~ alpha[Strip] + beta[Strip] * rho^Conc,
muscle,
start = list(rho = coef(fit_all)[1], alpha = rep(coef(fit_all)[2], 21),
beta = rep(coef(fit_all)[3], 21)))
pred_grid$fit_each <- predict(fit_each, pred_grid)
```