# Difference between complete and incomplete designs (DOE)

In an incomplete block design they say that block size is smaller than the total no. of treatments to be compared whereas complete block design is one where each treatment occurs once in each block?

What about those kind of designs where block size is equal or larger than the total number of treatments yet all treatments do not occur in any block?

E.g., consider the following design with 6 trts and 2 blocks (block size is 8)

Is this complete or incomplete ?

This would also be an incomplete design, and a (badly) non-optimal design. Why? Lets say you are interested in the difference (contrast) between treatments 1 and 6, which do not occur commonly in any block. So, to estimate the difference, you need to take into account the block effects. But, since that is badly confused with some of the treatment means, cannot really be estimated separately from the treatment means.

So, when the block size is equal or larger than the number of treatments, there is never any good statistical reason to not have all the treatments in each block. Such will always be suboptimal. (There might, maybe, be some practical, non-statistical reason). But you should always avoid such designs.

Let us illustrate this with a simple example, 16 observations, four treatments, four blocks each of size four. Let us use R to do the calculations for the construction:

library(MASS)
library(Matrix)
T  <-  factor( c(1,2,1,2,1,2,1,2,3,4,3,4,3,4,3,4), levels=1:4,
ordered=FALSE)
B <-  factor( rep(LETTERS[1:4],rep(4,4) ), levels=LETTERS[1:4],
ordered=FALSE)
X  <-  model.matrix( ~ 1 + T + B)
Matrix::rankMatrix(X)


This will tell us that the design matrix X has rank 6, one less than the number of columns. So, if we simulate some data for this design and estimate a model, one parameter will not be estimable.

One way to see this aliasing is:

 MASS::ginv(X[, 2:7]) %*% X[, 1, drop=FALSE]
(Intercept)
[1,]   0.6666667
[2,]   0.5000000
[3,]   0.5000000
[4,]   0.6666667
[5,]   0.5000000
[6,]   0.5000000


which tells us the coefficients of one linear combination of treatment and block parameters which is aliased with the intercept.

If we simulate some data for this model and try to estimate it, we can after the fact investigate aliasing with the alias function:

> y  <-  rnorm(16, X %*% c(0,1:3,1:3), 0.5)
> mod  <-  lm(y ~ 1 + T + B)
> summary(mod)

Call:
lm(formula = y ~ 1 + T + B)

Residuals:
Min       1Q   Median       3Q      Max
-0.59306 -0.18218 -0.00705  0.14223  0.67644

Coefficients: (1 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept)  -0.7960     0.2991  -2.661 0.023839 *
T2            1.7538     0.3453   5.078 0.000479 ***
T3            5.9947     0.4230  14.173 6.02e-08 ***
T4            7.0220     0.4230  16.602 1.31e-08 ***
BB            1.5424     0.3453   4.466 0.001204 **
BC           -1.0469     0.3453  -3.031 0.012647 *
BD                NA         NA      NA       NA
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.4884 on 10 degrees of freedom
Multiple R-squared:  0.9743,    Adjusted R-squared:  0.9615
F-statistic: 75.83 on 5 and 10 DF,  p-value: 1.272e-07

> alias(mod)
Model :
y ~ 1 + T + B

Complete :
(Intercept) T2 T3 T4 BB BC
BD  0           0  1  1  0 -1


We can see the BD parameter is not estimable (therefore the NA), and the output of alias tells us exactly how it is aliased. But, this output depends on the order of the model terms in the call to lm. Try to change it:

mod1  <-  lm(y ~ 1 + B + T)
> summary(mod1)

Call:
lm(formula = y ~ 1 + B + T)

Residuals:
Min       1Q   Median       3Q      Max
-0.59306 -0.18218 -0.00705  0.14223  0.67644

Coefficients: (1 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept)  -0.7960     0.2991  -2.661 0.023839 *
BB            1.5424     0.3453   4.466 0.001204 **
BC            5.9751     0.4230  14.127 6.21e-08 ***
BD            7.0220     0.4230  16.602 1.31e-08 ***
T2            1.7538     0.3453   5.078 0.000479 ***
T3           -1.0273     0.3453  -2.975 0.013934 *
T4                NA         NA      NA       NA
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.4884 on 10 degrees of freedom
Multiple R-squared:  0.9743,    Adjusted R-squared:  0.9615
F-statistic: 75.83 on 5 and 10 DF,  p-value: 1.272e-07

> alias(mod1)
Model :
y ~ 1 + B + T

Complete :
(Intercept) BB BC BD T2 T3
T4  0           0  1  1  0 -1


To understand this output better, try:

colnames(X)
[1] "(Intercept)" "T2"          "T3"          "T4"          "BB"
[6] "BC"          "BD"
> X[, 6, drop=FALSE] + X[, 7, drop=FALSE] - X[, 3, drop=FALSE] - X[, 4, drop=FALSE]
BC
1   0
2   0
3   0
4   0
5   0
6   0
7   0
8   0
9   0
10  0
11  0
12  0
13  0
14  0
15  0
16  0