# splitplot: Statistical and algorithmic aspects of split-plot designs in... In FrF2: Fractional Factorial Designs with 2-Level Factors

## Description

This help page documents the statistical and algorithmic details of split-plot designs in FrF2

## Details

A split-plot design is similar to a `block`ed design, with the difference that there are also factors of interest that can be only changed on block level (so-called whole plot factors). The blocks are called “plots” in the context of split-plot designs. The factors that can (and should!) be varied within a plot are called split-plot factors. Note that the experiment provides more information on split-plot factors than on whole-plot factors.

Warning: In terms of analysis, split-plot designs would have to be treated by advanced random effects models, but often are not. At the very least, the user must be aware that all whole-plot effects (i.e. effects on columns that only change between plots) are (likely to be) more variable than split-plot effects so that e.g. it does not necessarily mean anything if they stick out in a normal or half-normal effects plot.

Designs for hard-to-change factors are also treated by the split-plot approach in function `FrF2`, although they are not quite split-plot designs: The are non-randomized split-plot designs arranged in an order such that the first whole-plot factors have as few as possible changes. This gives very poor information on these first whole-plot factors (which in the extreme are only changed once or twice), if there is variability involved with setting the factor levels.
If hard-to-change factors can be implemented as true whole-plot factors with randomization, this is by far preferrable from a statistical point of view (but may nevertheless be rejected from a feasibility point of view, as the necessary changes may seem unaffordable).

For design generation, there are two principal ways to handle split-plot designs, manual definition (i.e. the user specifies exactly which columns are to be used for which purpose) and automatic definition. Each situation has its specifics. These are detailed below. For users with not so much mathematical/statistical background, it will often be best to use the automatic way, specifying the treatement factors of interest via `nfactors` or `factor.names` and a single number for `WPs`. Users with more mathematical background may want to use the manual definitions, perhaps in conjunction with published catalogues of good split-plot designs, or after inspecting possibilities with function `splitpick`.

Manual definition of split-plot designs

The user can specify a design with the `design` or the `generators` option and specify manually with the `WPfacs` option, which factors are whole plot factors (i.e. factors that do not change within a plot). The other factors become split-plot factors (i.e. factors that do change within a plot). If the user chooses this route, `WPfacs` must be character vectors of factor names, factor letters, factor numbers preceded by capital F, or a vector or list of factor position numbers (NOT: Yates column numbers). Caution: It is the users responsibility to ensure a good choice of split-plot design (e.g. by using a catalogued design from Huang, Chen and Voelkel 1998, Bingham and Sitter 2003, or Bingham Schoen and Sitter 2004). In case of a user-mistake such that the resulting design is not a split-plot design with the alleged number of whole plots, an error is thrown.

Automatic definition of split-plot designs

As mentioned above, split-plot designs differ from block designs by the fact that the block main effects are purely nuisance parameters which are assumed (based on prior knowledge) to be relevant but are not of interest, while the plots are structured by `nfac.WP` whole plot factors, which are of interest. The user has to decide on a number of whole plots (`WPs`) as well as the number of whole plot factors `nfac.WP`. If `log2(WPs) <= nfac.WP <= WPs-1`, it is obviously in principle possible to accomodate the desired number of whole plot factors in the desired number of whole plots. If `nfac.WP > WPs/2`, the base design for the split-plot structure has to be of resolution III. Sometimes, subject matter considerations limit whole plot sizes, and there are only few interesting whole plot factors, i.e. `nfac.WP < log2(WPs)`. In this case, it is of course nevertheless necessary to have a total of `log2(WPs)` whole plot construction factors; the missing `log2(WPs) - nfac.WP` factors are added to the design (names starting with `WP`), and `nfactors` is increased accordingly.

In all cases, the first `nfac.WPs` user-specified factors are treated as whole plot factors, the remaining factors as split-plot factors.

From there, function `FrF2` proceeds like in the blocked situation by starting with the best design and working its way down to worse designs, if the best design cannot accomodate the desired split-plot structure. For each design, function `FrF2` calls function `splitpick`, which permutes base factors until the requested whole plot / split-plot structure is achieved, or until impossibility for this design with these base factors has been ascertained. In the latter case, function `FrF2` proceeds to the next best design and so forth.

If several competing split-plot designs based on the same base design are found, the best possible resolution among the first `check.WPs` such designs is chosen. No further criteria are automatically implemented, and no more than `check.WPs` designs are checked. If not satisfied with the structure of the whole plot portion of the experiment, increasing `check.WPs` vs. the default 10 may help. Expert users may want to inspect possibilities, using function `splitpick` directly.

Note that the algorithm does not necessarily find an existing split-plot design. It has been checked out which catalogued designs it can find: designs for all catalogued situations from Bingham and Sitter (2003) have been found, as well as for most catalogued situations from Huang, Chen and Voelkel (1998). Occasionally, a better design than catalogued has been found, e.g. for 4 whole plot and 10 split plot factors in 32 runs with 16 whole plots, the design found by the algorithm is resolution IV, while Huang, Chen and Voelkel propose a resolution III design. The algorithm has the largest difficulties with extreme designs in the sense that a large number of whole plots with a small number of whole plot factors are to be accomodated; thus it does not find designs for the more extreme situations in Bingham, Schoen and Sitter (2004).

Ulrike Groemping

## References

Bingham, D.R., Schoen, E.D. and Sitter, R.R. (2004). Designing Fractional Factorial Split-Plot Experiments with Few Whole-Plot Factors. Applied Statistics 53, 325-339.

Bingham, D. and Sitter, R.R. (2003). Fractional Factorial Split-Plot Designs for Robust Parameter Experiments. Technometrics 45, 80-89.

Chen, J., Sun, D.X. and Wu, C.F.J. (1993) A catalogue of 2-level and 3-level orthogonal arrays. International Statistical Review 61, 131-145.

Cheng, C.-S. and Tsai, P.-W. (2009). Optimal two-level regular fractional factorial block and split-plot designs. Biometrika 96, 83-93.

Huang, P., Chen, D. and Voelkel, J.O. (1998). Minimum-Aberration Two-Level Split-Plot Designs. Technometrics 40, 314-326.

See Also `FrF2` for regular fractional factorials, `catlg` for the Chen, Sun, Wu catalogue of designs and some accessor functions, and `block` for the statistical aspects of blocked designs.

## Examples

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42``` ```########## hard to change factors #################### ## example from Bingham and Sitter Technometrics 19999 ## MotorSpeed, FeedMode,FeedSizing,MaterialType are hard to change BS.ex <- FrF2(16,7,hard=4, factor.names=c("MotorSpeed", "FeedMode","FeedSizing","MaterialType", "Gain","ScreenAngle","ScreenVibLevel"), default.levels=c("-","+")) design.info(BS.ex) BS.ex ## NOTE: the design has 8 whole plots. ## The first hard-to-change factors have very few changes only ## between whole plots. ## A conscious and honest decision is required whether it is ## acceptable for the situation at hand not to reset them! ## A proper split-plot design with resetting all whole plot factors ## for each whole plot would be strongly preferred from a ## statistical point of view. ########## automatic generation for split plot ########## ## 3 control factors, 5 noise factors, control factors are whole plot factors ## 8 plots desired in a total of 32 runs ## Bingham Sitter 2003 BS.ex2a <- FrF2(32, 8, WPs=8, nfac.WP=3, factor.names=c(paste("C",1:3,sep=""), paste("N",1:5,sep="")),randomize=TRUE) ## manual generation of this same design BS.ex2m <- FrF2(32, 8, generators=c("ABD","ACD","BCDE"),WPs=8, WPfacs=c("C1","C2","C3"), nfac.WP=3, factor.names=c(paste("C",1:3,sep=""),paste("N",1:5,sep="")),randomize=TRUE) ## design with few whole plot factors ## 2 whole plot factors, 7 split plot factors ## 8 whole plots, i.e. one extra WP factor needed BSS.cheese.exa <- FrF2(32, 9, WPs=8, nfac.WP=2, factor.names=c("A","B","p","q","r","s","t","u","v")) design.info(BSS.cheese.exa) ## manual generation of the design used by Bingham, Schoen and Sitter ## note that the generators include a generator for the 10th spplitting factor ## s= ABq, t = Apq, u = ABpr and v = Aqr, splitting factor rho=Apqr BSS.cheese.exm <- FrF2(32, gen=list(c(1,2,4),c(1,3,4),c(1,2,3,5),c(1,4,5),c(1,3,4,5)), WPs=8, nfac.WP=3, WPfacs=c(1,2,10), factor.names=c("A","B","p","q","r","s","t","u","v","rho")) design.info(BSS.cheese.exm) ```

### Example output

```Loading required package: DoE.base

Attaching package: 'DoE.base'

The following objects are masked from 'package:stats':

aov, lm

The following object is masked from 'package:graphics':

plot.design

The following object is masked from 'package:base':

lengths

sh: 1: cannot create /dev/null: Permission denied
\$type
[1] "FrF2.splitplot"

\$nruns
[1] 16

\$nfactors
[1] 7

\$nfac.WP
[1] 4

\$nfac.SP
[1] 3

\$factor.names
\$factor.names\$MotorSpeed
[1] "-" "+"

\$factor.names\$FeedMode
[1] "-" "+"

\$factor.names\$FeedSizing
[1] "-" "+"

\$factor.names\$MaterialType
[1] "-" "+"

\$factor.names\$Gain
[1] "-" "+"

\$factor.names\$ScreenAngle
[1] "-" "+"

\$factor.names\$ScreenVibLevel
[1] "-" "+"

\$nWPs
[1] 8

\$plotsize
[1] 2

\$res.WP
[1] 4

\$aliased
\$aliased\$legend
[1] "A=MotorSpeed"     "B=FeedMode"       "C=FeedSizing"     "D=MaterialType"
[5] "E=Gain"           "F=ScreenAngle"    "G=ScreenVibLevel"

\$aliased\$main
character(0)

\$aliased\$fi2
[1] "AB=CD=EF" "AC=BD=EG" "AD=BC=FG" "AE=BF=CG" "AF=BE=DG" "AG=CE=DF" "BG=CF=DE"

\$FrF2.version
[1] "1.7-2"

\$catlg.name
[1] "catlg"

\$base.design
[1] "7-3.1"

\$map
[1] 1 2 3 4

\$orig.fac.order
[1] 1 2 3 5 4 6 7

\$replications
[1] 1

\$repeat.only
[1] FALSE

\$randomize
[1] TRUE

\$seed
NULL

\$creator
FrF2(16, 7, hard = 4, factor.names = c("MotorSpeed", "FeedMode",
"FeedSizing", "MaterialType", "Gain", "ScreenAngle", "ScreenVibLevel"),
default.levels = c("-", "+"))

run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
1      1         2.1.2          -        +          +            -    -
2      2         1.1.1          -        +          +            -    +
ScreenAngle ScreenVibLevel
1           +              +
2           -              -
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
3      3         3.2.1          -        +          -            +    -
4      4         4.2.2          -        +          -            +    +
ScreenAngle ScreenVibLevel
3           +              -
4           -              +
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
5      5         6.3.2          -        -          -            -    -
6      6         5.3.1          -        -          -            -    +
ScreenAngle ScreenVibLevel
5           -              -
6           +              +
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
7      7         7.4.1          -        -          +            +    -
8      8         8.4.2          -        -          +            +    +
ScreenAngle ScreenVibLevel
7           -              +
8           +              -
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
9       9         9.5.1          +        -          +            -    +
10     10        10.5.2          +        -          +            -    -
ScreenAngle ScreenVibLevel
9            -              +
10           +              -
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
11     11        12.6.2          +        -          -            +    +
12     12        11.6.1          +        -          -            +    -
ScreenAngle ScreenVibLevel
11           -              -
12           +              +
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
13     13        13.7.1          +        +          -            -    +
14     14        14.7.2          +        +          -            -    -
ScreenAngle ScreenVibLevel
13           +              -
14           -              +
run.no run.no.std.rp MotorSpeed FeedMode FeedSizing MaterialType Gain
15     15        15.8.1          +        +          +            +    -
16     16        16.8.2          +        +          +            +    +
ScreenAngle ScreenVibLevel
15           -              -
16           +              +
class=design, type= FrF2.splitplot
NOTE: columns run.no and run.no.std.rp are annotation, not part of the data frame
sh: 1: cannot create /dev/null: Permission denied
sh: 1: cannot create /dev/null: Permission denied
sh: 1: cannot create /dev/null: Permission denied
Warning message:
In FrF2(32, 9, WPs = 8, nfac.WP = 2, factor.names = c("A", "B",  :
There are fewer factors than needed for a full factorial whole plot design. 1 dummy splitting factor(s) have been introduced.
\$type
[1] "FrF2.splitplot"

\$nruns
[1] 32

\$nfactors
[1] 10

\$nfac.WP
[1] 3

\$nfac.SP
[1] 7

\$factor.names
\$factor.names\$A
[1] -1  1

\$factor.names\$B
[1] -1  1

\$factor.names\$WP3
[1] -1  1

\$factor.names\$p
[1] -1  1

\$factor.names\$q
[1] -1  1

\$factor.names\$r
[1] -1  1

\$factor.names\$s
[1] -1  1

\$factor.names\$t
[1] -1  1

\$factor.names\$u
[1] -1  1

\$factor.names\$v
[1] -1  1

\$nWPs
[1] 8

\$plotsize
[1] 4

\$res.WP
[1] Inf

\$aliased
\$aliased\$legend
[1] "A=A"   "B=B"   "C=WP3" "D=p"   "E=q"   "F=r"   "G=s"   "H=t"   "J=u"
[10] "K=v"

\$aliased\$main
character(0)

\$aliased\$fi2
[5] "AF=BD"          "AG=CD"          "AH=DK"          "AJ=DE"
[9] "AK=DH"          "BC=FG"          "BE=FJ"          "BG=CF"
[13] "BH=FK"          "BJ=EF"          "BK=FH"          "CE=GJ"
[17] "CH=GK"          "CJ=EG"          "CK=GH"          "EH=JK"
[21] "EK=HJ"

\$FrF2.version
[1] "1.7-2"

\$catlg.name
[1] "catlg"

\$base.design
[1] "10-5.1"

\$map
[1] 2 3 4 1 5

\$orig.fac.order
[1]  1  2  3  4  5  6  7  8  9 10

\$replications
[1] 1

\$repeat.only
[1] FALSE

\$randomize
[1] TRUE

\$seed
NULL

\$creator
FrF2(32, 9, WPs = 8, nfac.WP = 2, factor.names = c("A", "B",
"p", "q", "r", "s", "t", "u", "v"))

sh: 1: cannot create /dev/null: Permission denied
\$type
[1] "FrF2.splitplot"

\$nruns
[1] 32

\$nfactors
[1] 10

\$nfac.WP
[1] 3

\$nfac.SP
[1] 7

\$factor.names
\$factor.names\$A
[1] -1  1

\$factor.names\$B
[1] -1  1

\$factor.names\$rho
[1] -1  1

\$factor.names\$p
[1] -1  1

\$factor.names\$q
[1] -1  1

\$factor.names\$r
[1] -1  1

\$factor.names\$s
[1] -1  1

\$factor.names\$t
[1] -1  1

\$factor.names\$u
[1] -1  1

\$factor.names\$v
[1] -1  1

\$nWPs
[1] 8

\$plotsize
[1] 4

\$res.WP
[1] NaN

\$aliased
\$aliased\$legend
[1] "A=A"   "B=B"   "C=rho" "D=p"   "E=q"   "F=r"   "G=s"   "H=t"   "J=u"
[10] "K=v"

\$aliased\$main
[1] "C=DK=FH" "D=CK"    "F=CH"    "H=CF"    "K=CD"

\$aliased\$fi2
[1] "AB=EG"       "AC=GJ"       "AD=EH"       "AE=BG=DH=FK" "AF=EK"
[6] "AG=BE=CJ"    "AH=DE"       "AJ=CG"       "AK=EF"       "BC=EJ"
[11] "BD=GH"       "BF=GK"       "BH=DG"       "BJ=CE"       "BK=FG"
[16] "DF=HK"

\$FrF2.version
[1] "1.7-2"

\$base.design
[1] "generator columns: "

\$map
[1] 1 2 3 4 5

\$orig.fac.order
[1]  1  2 10  3  4  5  6  7  8  9

\$replications
[1] 1

\$repeat.only
[1] FALSE

\$randomize
[1] TRUE

\$seed
NULL

\$creator
FrF2(32, gen = list(c(1, 2, 4), c(1, 3, 4), c(1, 2, 3, 5), c(1,
4, 5), c(1, 3, 4, 5)), WPs = 8, nfac.WP = 3, WPfacs = c(1,
2, 10), factor.names = c("A", "B", "p", "q", "r", "s", "t",
"u", "v", "rho"))
```

FrF2 documentation built on May 30, 2017, 5:20 a.m.