block {FrF2} | R Documentation |
This help page documents the statistical and algorithmic details of blocking in FrF2
Blocking is done with the purpose to balance the design with respect to a factor that is known or strongly suspected to have an influence but is not in itself of interest, and it is usually assumed that block factors do not interact with experimental factors. Examples are batches of material that are not large enough to accomodate the complete experiment so that e.g. half the experiment is done on the first batch and the other half on the second batch (two blocks). The block factor should be orthogonal to the experimental factors, at least to their main effects. Per default, it is also requested that the block factor is orthogonal to the 2-factor interactions. This can be changed by the user, if no such design can be found.
Blocking is currently implemented for regular fractional factorial designs only.
There are two principal ways to handle blocked 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 blocks
or WPs
.
Users with more mathematical background may want to use the manual definitions, perhaps
in conjunction with published catalogues of good block designs, or
after inspecting possibilities with functions blockpick
or blockpick.big
.
blocks
can be a vector of factor names or factor letters, or of the same form as generators, except that
not only base factors but all factors can be used and single factors are permitted
(which would lead to resolution II designs if used in generators). For example, block = Letters[c(2,4,5)]
block = list(2,4,5)
block = c("Day","Shift")
factor.names
are to be treated as blocking factors). In this case, the number of blocks or whole plots is calculated,
and a new factor with the default name “Blocks” (in general the name chosen in
option block.name
) is generated, which would for example contain as levels
the Day/Shift combinations. It is also possible to choose interaction effects rather than factors themselves
as block generators, e.g. block = c("ABCD","EFGH")
block = list(c(1,2,3,4),c(5,6,7,8))
. FrF2
automatically generates the blocks. For full factorial designs, function FrF2
uses
the Sun, Wu and Chen (1997) catalogue of blocked designs (implemented in function blockpick
).
Otherwise, depending on the size of the problem,
function FrF2
uses function blockpick
or function blockpick.big
for finding an appropriate allocation of block generator columns:
Smaller problems choose(nruns-1-nfactors,k.block) < 100000
) blockpick
.
The search for an appropriate blocked design starts with the overall best unblocked design
(in terms of aberration or MaxC2, if requested).
If this best design does not yield an adequate blocking possibility, the search continues with
the next best design and so forth.
For the smaller problems, function blockpick
looks for k.block
independent subsets among the eligible columns of the design.
(The eligible columns are all columns of the Yates matrix that are neither occupied
by treatment main effects nor by 2fis among treatments (if alias.block.2fis=FALSE
,
which is the default), or all columns of the Yates matrix that are not occupied by treatment main effects
(if alias.block.2fis=TRUE
). Note that no effort is made to avoid aliasing with 2-factor interactions,
if alias.block.2fis=TRUE
is chosen.
For the larger problems,
function blockpick.big
permutes the k~base factors of candidate designs with nfactors + k.block
factors
in search of a design the first k.block
~factors of which can be used for block construction. In the latter case, any
specification of design (via options design
or generators
) is ignored. Note that function
blockpick.big
is not guaranteed to find an existing blocked design.
Sun, Wu and Chen (1997) provide a catalogue of blocked designs
with a few quality criteria, and they state that there is no single best design, but that the choice
depends on the situation. FrF2
always comes up with one specific solution design.
Comparisons to the catalogued designs in Sun, Wu and Chen (1997) have shown that
the designs found in FrF2
are often but not always isomorphic to the catalogued ones.
Differences do occur, especially if the base designs are resolution III, or if blockpick.big
has to be used. Users who want to be certain to use a “best” blocked design should manually
implement a specific catalogued design or inspect several solutions from functions blockpick
blockpick.big
.
Please contact me with any suggestions for improvements.
Ulrike Groemping
Bisgaard, S. (1994a). Blocking generators for small 2^(k-p) designs. J. Quality Technology 26, 288-294.
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.
Cheng, S.W. and Wu, C.F.J. (2002). Choice of optimal blocking schemes in 2-level and 3-level designs. Technometrics 44, 269-277.
Sun, D.X., Wu, C.F.J. and Chen, Y.Y. (1997). Optimal blocking schemes for 2^p and 2^(n-p) designs. Technometrics 39, 298-307.
See Also FrF2
for regular fractional factorials,
catlg
for the Chen, Sun, Wu catalogue of designs
and some accessor functions,
and splitplot
for the statistical aspects of split-plot designs.
########## automatic blocked designs ################### ## from a full factorial ## FrF2(8,3,blocks=2) ## with replication run.order(FrF2(8,3,blocks=2,wbreps=2)) run.order(FrF2(8,3,blocks=2,wbreps=2,repeat.only=TRUE)) run.order(FrF2(8,3,blocks=2,bbreps=2)) run.order(FrF2(8,3,blocks=2,bbreps=2,wbreps=2)) ## automatic blocked design with fractions FrF2(16,7,blocks=4,alias.block.2fis=TRUE) ## isomorphic non-catalogued design as basis FrF2(16,gen=c(7,11,14),blocks=4,alias.block.2fis=TRUE) ## FrF2 uses blockpick.big and ignores the generator FrF2(64,gen=c(7,11,14),blocks=16,alias.block.2fis=TRUE) ########## manual blocked design #################### ### example that shows why order of blocks is not randomized ### can of course be randomized by user, if appropriate FrF2(32,9,blocks=c("Day","Shift"),alias.block.2fis=TRUE, factor.names=list(Day=c("Wednesday","Thursday"), Shift=c("Morning","Afternoon"), F1="",F2="",F3="",F4="",F5="",F6="",F7=""), default.levels=c("current","new"))