library(apts.doe)
library(AlgDesign)
library(rsm)
library(dplyr)
library(plotly)

Point exchange algorithm

We will study three examples of using AlgDesign to find designs under linear models \[ Y = X\beta + \epsilon\,, \] with \(X\) the model matrix, \(\beta\) the \(p\)-vector of unknown model coefficients and \(\epsilon\) an \(n\)-vector of identically and independently normally distributed random errors, each having variance \(\sigma^2\).

A \(D\)-optimal design maximises the determinant of the information matrix \(X^T X\).

Example 1: one-factor quadratic regression

D-optimal design for the regression model

\[ Y_i = \beta_0 + \beta_1 x_i + \beta_2 x_i^2 + \epsilon_i \]

dopt1
$D
[1] 0.5088144

$A
[1] 3.139587

$Ge
[1] 0.941

$Dea
[1] 0.939

$design

$rows
[1]   1   2   3  50  51  52  99 100 101

The function returns

Example 2: a response surface design

A pharmaceutical industry experiment (Owen et al., 2001, Organic Process Research and Development) investigated four factors in \(n=30\) runs. We will find a \(V\)-optimal design for this experiment, assuming

\[ -2 \le x_1, x_2, x_3, x_4 \le 2\,. \]

Note that AlgDesign refers to \(V\)-optimality as \(I\)-optimality (\(I\) for integrated variance).

cand.list <- expand.grid(x1 = seq(-2, 2, length = 5), x2 = seq(-2, 2, length = 5), 
                         x3 = seq(-2, 2, length = 5), x4 = seq(-2, 2, length = 5))
dopt2 <- optFederov(~ quad(x1, x2, x3, x4), data = cand.list, nTrials = 30, 
                    criterion = "I")
dopt2
$D
[1] 3.952834

$A
[1] 0.7326728

$I
[1] 11.25339

$Ge
[1] 0.585

$Dea
[1] 0.492

$design

$rows
 [1]   1  13  25  55  63  71 101 103 115 121 250 255 273 303 311 313 315 361 373 396 476 503 511 515 551 573 575
[28] 605 613 621

It is interesting to compare the performance of this design under the various optimality criteria with the original design used in the study. This was a central composite design, or CCD, a common multi-factor design for fitting regression models. To do this we generate a CCD using the rsm package.

ccd_design
   run.order std.order x1.as.is x2.as.is x3.as.is x4.as.is
1          1         1       -1       -1       -1       -1
2          2         2        1       -1       -1       -1
3          3         3       -1        1       -1       -1
4          4         4        1        1       -1       -1
5          5         5       -1       -1        1       -1
6          6         6        1       -1        1       -1
7          7         7       -1        1        1       -1
8          8         8        1        1        1       -1
9          9         9       -1       -1       -1        1
10        10        10        1       -1       -1        1
11        11        11       -1        1       -1        1
12        12        12        1        1       -1        1
13        13        13       -1       -1        1        1
14        14        14        1       -1        1        1
15        15        15       -1        1        1        1
16        16        16        1        1        1        1
17        17        17        0        0        0        0
18        18        18        0        0        0        0
19        19        19        0        0        0        0
20        20        20        0        0        0        0
21        21        21        0        0        0        0
22        22        22        0        0        0        0
23         1         1       -2        0        0        0
24         2         2        2        0        0        0
25         3         3        0       -2        0        0
26         4         4        0        2        0        0
27         5         5        0        0       -2        0
28         6         6        0        0        2        0
29         7         7        0        0        0       -2
30         8         8        0        0        0        2

Data are stored in coded form using these coding formulas ...
x1 ~ x1.as.is
x2 ~ x2.as.is
x3 ~ x3.as.is
x4 ~ x4.as.is

Example 3: a multi-factor experiment with dependent factor settings

McNamara et al. (2005, Tech. Report) described an experiment to investigate the relationship between chemical yield and choice of solvent.

solvents <- read.csv("solvents.csv", header = T)
solvents

\(D\)-optimal design to estimate a quadratic regression model with \(n=20\)

dopt3 <- optFederov(~ quad(dc, dp, ws), data = rbind(solvents, solvents, solvents), 
                    nTrials = 20, criterion = "D") 
with(dopt3$design, {
  dopt3$design[order(solvent), ]
})

Notice that not all of the solvents have been selected in the design (so some have replication 0).

Compare this design to the \(D\)-optimal design that would be found if we assumed all possible combinations of descriptor values were possible (or a least a much wider range). That is, what design would be chosen if we were not restricted to our list of 13 solvents?

descrip.list <- expand.grid(dc = seq(-1, 1, len = 9), dp = seq(-1, 1, len = 9), 
                            ws = seq(-1, 1, len = 9))
dopt3b <- optFederov(~ quad(dc, dp, ws), data = descrip.list, nTrials = 20, 
                    criterion = "D")
with(dopt3b$design, {
  dopt3b$design[order(dc, dp, ws), ]  
})

This design has only one point in the interior of the design space (at the centre point), unlike the design constructed from the original candidate list. It has no replication.

dopt3b$design %>% count(dc, dp, ws)
round(100 * (dopt3$D/dopt3b$D) ^ (1 / 10))
[1] 82

Original design has low efficiency but is realisable (the solvents exist!), whereas we do not know if the combinations of the descriptors in the second design correspond to actual solvents.

plot_ly(dopt3$design %>% count(dc, dp, ws), x = ~dc, y = ~dp, z = ~ws, type = "scatter3d", mode = "markers", color = ~n)
plot_ly(dopt3b$design, x = ~dc, y = ~dp, z = ~ws, type = "scatter3d", mode = "markers")
LS0tCnRpdGxlOiAiQVBUUyBEZXNpZ24gb2YgRXhwZXJpbWVudHMgMjAyMiIKc3VidGl0bGU6ICJPcHRpbWFsIGRlc2lnbiB2aWEgYWxnb3JpdGhtaWMgc2VhcmNoIgphdXRob3I6ICJEYXZlIFdvb2RzIgpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCiAKYGBge3IgbGlicmFyaWVzLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmxpYnJhcnkoYXB0cy5kb2UpCmxpYnJhcnkoQWxnRGVzaWduKQpsaWJyYXJ5KHJzbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCmBgYAoKIyMgUG9pbnQgZXhjaGFuZ2UgYWxnb3JpdGhtCgogLSBNb3N0IGNvbW1vbiBvcHRpbWlzYXRpb24gYWxnb3JpdGhtIGZvciBvcHRpbWFsIGRlc2lnbgogLSBTd2FwcyBiZXR3ZWVuIGN1cnJlbnQgZGVzaWduIGFuZCBhIGNhbmRpZGF0ZSBsaXN0IG9mIHBvc3NpYmxlIGRlc2lnbiBwb2ludHMKIC0gQ2FuIGJlIGFwcGxpZWQgd2l0aCBtb3N0IG9wdGltYWxpdHkgY3JpdGVyaWEsIGluY2x1ZGluZyBELW9wdGltYWxpdHkKIC0gSW1wbGVtZW50ZWQgaW4gcGFja2FnZSBgQWxnRGVzaWduYAoKV2Ugd2lsbCBzdHVkeSB0aHJlZSBleGFtcGxlcyBvZiB1c2luZyBgQWxnRGVzaWduYCB0byBmaW5kIGRlc2lnbnMgdW5kZXIgbGluZWFyIG1vZGVscwokJApZID0gWFxiZXRhICsgXGVwc2lsb25cLCwKJCQKd2l0aCAkWCQgdGhlIG1vZGVsIG1hdHJpeCwgJFxiZXRhJCB0aGUgJHAkLXZlY3RvciBvZiB1bmtub3duIG1vZGVsIGNvZWZmaWNpZW50cyBhbmQgJFxlcHNpbG9uJCBhbiAkbiQtdmVjdG9yIG9mIGlkZW50aWNhbGx5IGFuZCBpbmRlcGVuZGVudGx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBlcnJvcnMsIGVhY2ggaGF2aW5nIHZhcmlhbmNlICRcc2lnbWFeMiQuIAoKQSAkRCQtb3B0aW1hbCBkZXNpZ24gbWF4aW1pc2VzIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgaW5mb3JtYXRpb24gbWF0cml4ICRYXlQgWCQuCgojIyBFeGFtcGxlIDE6IG9uZS1mYWN0b3IgcXVhZHJhdGljIHJlZ3Jlc3Npb24KCkQtb3B0aW1hbCBkZXNpZ24gZm9yIHRoZSByZWdyZXNzaW9uIG1vZGVsCgokJApZX2kgPSBcYmV0YV8wICsgXGJldGFfMSB4X2kgKyBcYmV0YV8yIHhfaV4yICsgXGVwc2lsb25faQokJAoKYGBge3IgZXgxLWFsZ2Rlc30KeCA8LSBzZXEoLTEsIDEsIGxlbmd0aCA9IDEwMSkgIyBjYW5kaWRhdGUgbGlzdApkb3B0MSA8LSBvcHRGZWRlcm92KH4gcXVhZCh4KSwgZGF0YSA9IGMoeCwgeCwgeCksIG5UcmlhbHMgPSA5LCBjcml0ZXJpb24gPSAiRCIpCmRvcHQxCmBgYApUaGUgZnVuY3Rpb24gcmV0dXJucyAKCiAtIGBEYDogdGhlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiAqbm9ybWFsaXNlZCogaW5mb3JtYXRpb24gbWF0cml4IChkaXZpZGVkIGJ5ICRuJCkgcmFpc2VkIHRvIHRoZSBwb3dlciAkMS9wJAogLSBgQWA6IHRoZSB2YWx1ZSBvZiB0aGUgdHJhY2Ugb2YgdGhlIGludmVyc2Ugb2YgdGhlIGluZm9ybWF0aW9uIG1hdHJpeCwgZGl2aWRlZCBieSAkcCQgCiAtIGBHZWAgYW5kIGBEZWFgOiB0aGUgJEckLSBhbmQgJEQkLWVmZmljaWVuY2llcyByZWxhdGl2ZSB0byB0aGUgdGhlb3JldGljYWwgb3B0aW1hbCBkZXNpZ24gKHdoaWNoIG1heSBub3QgYmUgcmVhbGlzYWJsZSkKIC0gYHJvd3NgOiB0aGUgcm93cyBvZiB0aGUgY2FuZGlkYXRlIGxpc3QgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvcHRpbWFsIGRlc2lnbi4KCiMjIEV4YW1wbGUgMjogYSByZXNwb25zZSBzdXJmYWNlIGRlc2lnbgoKQSBwaGFybWFjZXV0aWNhbCBpbmR1c3RyeSBleHBlcmltZW50IChPd2VuIGV0IGFsLiwgMjAwMSwgT3JnYW5pYyBQcm9jZXNzIFJlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCkgaW52ZXN0aWdhdGVkIGZvdXIgZmFjdG9ycyBpbiAkbj0zMCQgcnVucy4gV2Ugd2lsbCBmaW5kIGEgJFYkLW9wdGltYWwgZGVzaWduIGZvciB0aGlzIGV4cGVyaW1lbnQsIGFzc3VtaW5nIAoKJCQKLTIgXGxlIHhfMSwgeF8yLCB4XzMsIHhfNCBcbGUgMlwsLgokJCAKCgpOb3RlIHRoYXQgYEFsZ0Rlc2lnbmAgcmVmZXJzIHRvICRWJC1vcHRpbWFsaXR5IGFzICRJJC1vcHRpbWFsaXR5ICgkSSQgZm9yIGludGVncmF0ZWQgdmFyaWFuY2UpLiAKCmBgYHtyIGV4Mi1hbGdkZXN9CmNhbmQubGlzdCA8LSBleHBhbmQuZ3JpZCh4MSA9IHNlcSgtMiwgMiwgbGVuZ3RoID0gNSksIHgyID0gc2VxKC0yLCAyLCBsZW5ndGggPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB4MyA9IHNlcSgtMiwgMiwgbGVuZ3RoID0gNSksIHg0ID0gc2VxKC0yLCAyLCBsZW5ndGggPSA1KSkKZG9wdDIgPC0gb3B0RmVkZXJvdih+IHF1YWQoeDEsIHgyLCB4MywgeDQpLCBkYXRhID0gY2FuZC5saXN0LCBuVHJpYWxzID0gMzAsIAogICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbiA9ICJJIikKZG9wdDIKYGBgCgpJdCBpcyBpbnRlcmVzdGluZyB0byBjb21wYXJlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGlzIGRlc2lnbiB1bmRlciB0aGUgdmFyaW91cyBvcHRpbWFsaXR5IGNyaXRlcmlhIHdpdGggdGhlIG9yaWdpbmFsIGRlc2lnbiB1c2VkIGluIHRoZSBzdHVkeS4gVGhpcyB3YXMgYSAqY2VudHJhbCBjb21wb3NpdGUgZGVzaWduKiwgb3IgQ0NELCBhIGNvbW1vbiBtdWx0aS1mYWN0b3IgZGVzaWduIGZvciBmaXR0aW5nIHJlZ3Jlc3Npb24gbW9kZWxzLiBUbyBkbyB0aGlzIHdlIGdlbmVyYXRlIGEgQ0NEIHVzaW5nIHRoZSBgcnNtYCBwYWNrYWdlLgoKYGBge3IgZXgyLWV2YWxkZXNpZ259CmNjZF9kZXNpZ24gPC0gY2NkKDQsIG4wID0gYyg2LCAwKSwgcmFuZG9taXplID0gRiwgb25lYmxvY2sgPSBULCBhbHBoYSA9IDIpCmNjZC5ldmFsIDwtIGV2YWwuZGVzaWduKH4gcXVhZCh4MSwgeDIsIHgzLCB4NCksIGRlc2lnbiA9IGRhdGEuZnJhbWUoY2NkX2Rlc2lnbiksIFggPSBjYW5kLmxpc3QpCmNjZC5ldmFsJEkKcm91bmQoMTAwICogZG9wdDIkSS9jY2QuZXZhbCRJKQpgYGAKCiMjIEV4YW1wbGUgMzogYSBtdWx0aS1mYWN0b3IgZXhwZXJpbWVudCB3aXRoIGRlcGVuZGVudCBmYWN0b3Igc2V0dGluZ3MKCk1jTmFtYXJhIGV0IGFsLiAoMjAwNSwgVGVjaC4gUmVwb3J0KSBkZXNjcmliZWQgYW4gZXhwZXJpbWVudCB0byBpbnZlc3RpZ2F0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2hlbWljYWwgeWllbGQgYW5kIGNob2ljZSBvZiBzb2x2ZW50LgoKIC0gMTMgc29sdmVudHMgYXZhaWxhYmxlIGZvciB0aGUgZXhwZXJpbWVudAogLSBjaGFyYWN0ZXJpc2VkIGJ5IHZhbHVlcyBvZiB0aHJlZSAqY2hlbWljYWwgZGVzY3JpcHRvcnMqOiBkaWVsZWN0cmljIGNvbnN0YW50LCBkaXBvbGUgbW9tZW50IGFuZCB3YXRlciBzb2x1YmlsaXR5CiAtIFJlcGxhY2luZyBhIDEzLWxldmVsIHF1YWxpYXRpdmUgZmFjdG9yIChzb2x2ZW50KSB3aXRoIHRocmVlIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMKIC0gY29tYmluYXRpb25zIG9mIHRoZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUgZmVhc2libGUgZm9yIHRoZSBleHBlcmltZW50IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzb2x2ZW50cy4gICAKCmBgYHtyIGV4My1zb2x2ZW50c30Kc29sdmVudHMgPC0gcmVhZC5jc3YoInNvbHZlbnRzLmNzdiIsIGhlYWRlciA9IFQpCnNvbHZlbnRzCmBgYAokRCQtb3B0aW1hbCBkZXNpZ24gdG8gZXN0aW1hdGUgYSBxdWFkcmF0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoICRuPTIwJAoKIC0gdGhlIGRlc2lnbiBwcm9ibGVtIGlzIHJlYWxseSBwaWNraW5nIHRoZSByZXBsaWNhdGlvbiBvZiBlYWNoIHNvbHZlbnQKIC0gYG9wdEZlZGVyb3ZgIHJlcXVpcmVzIHRoZSBjYW5kaWRhdGUgbGlzdCB0byBoYXZlIG1vcmUgcm93cyB0aGFuICRuJCwgc28gd2UgdXNlIHRocmVlIHJlcGxpY2F0ZXMgb2YgdGhlIHNvbHZlbnQgbGlzdAoKYGBge3IgZXgzLWRlc2lnbn0KZG9wdDMgPC0gb3B0RmVkZXJvdih+IHF1YWQoZGMsIGRwLCB3cyksIGRhdGEgPSByYmluZChzb2x2ZW50cywgc29sdmVudHMsIHNvbHZlbnRzKSwgCiAgICAgICAgICAgICAgICAgICAgblRyaWFscyA9IDIwLCBjcml0ZXJpb24gPSAiRCIpIAp3aXRoKGRvcHQzJGRlc2lnbiwgewogIGRvcHQzJGRlc2lnbltvcmRlcihzb2x2ZW50KSwgXQp9KQpgYGAKCk5vdGljZSB0aGF0IG5vdCBhbGwgb2YgdGhlIHNvbHZlbnRzIGhhdmUgYmVlbiBzZWxlY3RlZCBpbiB0aGUgZGVzaWduIChzbyBzb21lIGhhdmUgcmVwbGljYXRpb24gMCkuCmBgYHtyIGV4My1jb3VudH0KZG9wdDMkZGVzaWduICU+JSBjb3VudChzb2x2ZW50KQpgYGAKQ29tcGFyZSB0aGlzIGRlc2lnbiB0byB0aGUgJEQkLW9wdGltYWwgZGVzaWduIHRoYXQgd291bGQgYmUgZm91bmQgaWYgd2UgYXNzdW1lZCBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGRlc2NyaXB0b3IgdmFsdWVzIHdlcmUgcG9zc2libGUgKG9yIGEgbGVhc3QgYSBtdWNoIHdpZGVyIHJhbmdlKS4gVGhhdCBpcywgd2hhdCBkZXNpZ24gd291bGQgYmUgY2hvc2VuIGlmIHdlIHdlcmUgbm90IHJlc3RyaWN0ZWQgdG8gb3VyIGxpc3Qgb2YgMTMgc29sdmVudHM/CgpgYGB7ciBleDMtZGVzaWduMn0KZGVzY3JpcC5saXN0IDwtIGV4cGFuZC5ncmlkKGRjID0gc2VxKC0xLCAxLCBsZW4gPSA5KSwgZHAgPSBzZXEoLTEsIDEsIGxlbiA9IDkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gc2VxKC0xLCAxLCBsZW4gPSA5KSkKZG9wdDNiIDwtIG9wdEZlZGVyb3YofiBxdWFkKGRjLCBkcCwgd3MpLCBkYXRhID0gZGVzY3JpcC5saXN0LCBuVHJpYWxzID0gMjAsIAogICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbiA9ICJEIikKd2l0aChkb3B0M2IkZGVzaWduLCB7CiAgZG9wdDNiJGRlc2lnbltvcmRlcihkYywgZHAsIHdzKSwgXSAgCn0pCmBgYAoKVGhpcyBkZXNpZ24gaGFzIG9ubHkgb25lIHBvaW50IGluIHRoZSBpbnRlcmlvciBvZiB0aGUgZGVzaWduIHNwYWNlIChhdCB0aGUgY2VudHJlIHBvaW50KSwgdW5saWtlIHRoZSBkZXNpZ24gY29uc3RydWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgY2FuZGlkYXRlIGxpc3QuIEl0IGhhcyBubyByZXBsaWNhdGlvbi4KCmBgYHtyIGV4My1kZWZmfQpkb3B0M2IkZGVzaWduICU+JSBjb3VudChkYywgZHAsIHdzKQpyb3VuZCgxMDAgKiAoZG9wdDMkRC9kb3B0M2IkRCkgXiAoMSAvIDEwKSkKYGBgCgpPcmlnaW5hbCBkZXNpZ24gaGFzIGxvdyBlZmZpY2llbmN5IGJ1dCBpcyByZWFsaXNhYmxlICh0aGUgc29sdmVudHMgZXhpc3QhKSwgd2hlcmVhcyB3ZSBkbyBub3Qga25vdyBpZiB0aGUgY29tYmluYXRpb25zIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgc2Vjb25kIGRlc2lnbiBjb3JyZXNwb25kIHRvIGFjdHVhbCBzb2x2ZW50cy4KCmBgYHtyIGV4My1wbG90LCBvdXQud2lkdGggPSAiNTAlIn0KcGxvdF9seShkb3B0MyRkZXNpZ24gJT4lIGNvdW50KGRjLCBkcCwgd3MpLCB4ID0gfmRjLCB5ID0gfmRwLCB6ID0gfndzLCB0eXBlID0gInNjYXR0ZXIzZCIsIG1vZGUgPSAibWFya2VycyIsIGNvbG9yID0gfm4pCnBsb3RfbHkoZG9wdDNiJGRlc2lnbiwgeCA9IH5kYywgeSA9IH5kcCwgeiA9IH53cywgdHlwZSA9ICJzY2F0dGVyM2QiLCBtb2RlID0gIm1hcmtlcnMiKQpgYGAKCg==