---
title: "Workflow"
author: "Dr Jeremiah MF Kelly"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Workflow}
  %\VignetteEngine{knitr::rmarkdown}
  \usepackage[utf8]{inputenc}
---

The following describes the work flow for the analysis of dark adaptation data. The data were extracted from Figure 1 in Rushton's paradox: rod dark adaptation after flash photolysis, E.N.Pugh Jr. \emph{The Journal of Physiology,} 1975. 

A 'dark' object can have up to 16 elements and no fewer than 2. 

```{r, eval=FALSE}
library(Dark)
tmp <- dark
names(tmp)
```
```{r, echo=FALSE}
load("dark.rda")
tmp<-dark
Names <- c("time", "thrs", "fit", "resid", "R2", "Bootstrap", "weight", 
"valid", "Mod", "Pn", "AIC", "data", "opt", "call", "val")
print(Names)
```

The raw data are shown below
```{r, fig.width=6, fig.height=6, fig.align='center'}
par(las=1, bty='n',mfrow=c(1,1))
XL <- expression(bold(Time~(min)))
YL <- expression(bold(Threshold~(LU)))
plot(tmp$time, tmp$thrs, xlab = XL, ylab=YL)
```


The function `Start` generates an array of possible parameter values, *P*, calculated from the data, which are then passed to `ModelSelect`. 

```{r, eval=FALSE}
set.seed(1234)
P <-Start(tmp, 2000)
head(P,3)
```
The first three rows are shown below

```{r, echo=FALSE} 
Pd <- structure(c(-1.93048394296102, -0.966243347355156, -0.990918795667905, 
0.253616641335044, 0.420301711722179, 1.32959014056482, 3.97646484343339, 
0.763150661132819, 0.905683974690625, -0.389894947473737, -0.4064032016008, 
-0.182491245622811, 2.52208104052026, 6.96883941970985, 3.12198099049525, 
0.130565282641321, 0.207403701850925, 0.0885442721360681, 32.5607121101566, 
32.9919673191487, 29.4211741886944), .Dim = c(3L, 7L), .Dimnames = list(
    NULL, c("CT", "CC", "Tau", "S2", "Alph", "S3", "Beta")))
print.table(Pd,3)
```

The data frame `P` is processed by `ModelSelect`, this finds the row of parameters that give the lowest sum of squared errors and calculates an `AIC` score. This is not calculated again. 

```{r, eval=FALSE}
MSC<-ModelSelect(tmp,P)
MSC
```

```{r, echo=FALSE}

MSCd <- structure(list(AIC = c(0, 0, -347.688152541027, 0, -353.337417397606, 
-556.296993756504, -561.687551083725), param = structure(c(-7.03677859813905, 
-4.84533369033486, -5.52767312215107, -1.97221068357342, 6.23084047079413, 
4.01859727139177, 1.43155445018767, 1.39834034016783, 28.1212523680337, 
17.2254594347471, 0.557811726205019, 1.62283784201578, 0, -0.0365810342284519, 
9.61920222958987, -0.227896945728703, 0, 9.40371211032976, 3.50297041829524, 
8.73599874809917, 0, 0, 0.0972021474126348, 0.180809685149208, 
0, 0, 0, 19.4250494832971), .Dim = c(4L, 7L))), .Names = c("AIC", 
"param"))
print(MSCd, 3)
```
Then the function `BestFit` optimises the model using the lowest `AIC` score to select the model and the best initial estimate of the parameters for that model.

```{r, eval =FALSE}
tmp<-BestFit(tmp,MSC)
```


A further function `MultiStart` ensures that the estimated parameter values are optimal by repeatedly optimising the model with starting locations in the vicinity of the initial estimate. Finally `BootDark` uses bootstrap methods to calculate confidence intervals for the parameter estimates.


```{r, eval=FALSE}
tmp<-MultiStart(tmp,repeats = 25)
tmp<-BootDark(tmp,R = 500)
```

The data and model are shown in the figure below;
```{r, fig.width=6, fig.height=6, fig.align='center', echo=FALSE}
source("../R/H.R")
source("../R/P7c.R")
par(las=1, bty='n',mfrow=c(1,1))
XL <- expression(bold(Time~(min)))
YL <- expression(bold(Threshold~(LU)))
plot(tmp$time, tmp$thrs, xlab = XL, ylab=YL)
X <- tmp$time
lines(X, tmp$fit)
lines(X, P7c(tmp$Bootstrap[,1], X), col = 2)
lines(X, P7c(tmp$Bootstrap[,3], X), col = 2)

```

The final `dark` object with 15 elements:

```{r}
print(tmp,2)
```
