def bbdesign(n, center=None): """ Create a Box-Behnken design Parameters ---------- n : int The number of factors in the design Optional -------- center : int The number of center points to include (default = 1). Returns ------- mat : 2d-array The design matrix Example ------- :: >>> bbdesign(3) array([[-1., -1., 0.], [ 1., -1., 0.], [-1., 1., 0.], [ 1., 1., 0.], [-1., 0., -1.], [ 1., 0., -1.], [-1., 0., 1.], [ 1., 0., 1.], [ 0., -1., -1.], [ 0., 1., -1.], [ 0., -1., 1.], [ 0., 1., 1.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) """ assert n>=3, 'Number of variables must be at least 3' # First, compute a factorial DOE with 2 parameters H_fact = ff2n(2) # Now we populate the real DOE with this DOE # We made a factorial design on each pair of dimensions # - So, we created a factorial design with two factors # - Make two loops Index = 0 nb_lines = (n*(n-1)/2)*H_fact.shape[0] H = repeat_center(n, nb_lines) for i in range(n - 1): for j in range(i + 1, n): Index = Index + 1 H[max([0, (Index - 1)*H_fact.shape[0]]):Index*H_fact.shape[0], i] = H_fact[:, 0] H[max([0, (Index - 1)*H_fact.shape[0]]):Index*H_fact.shape[0], j] = H_fact[:, 1] if center is None: if n<=16: points= [0, 0, 0, 3, 3, 6, 6, 6, 8, 9, 10, 12, 12, 13, 14, 15, 16] center = points[n] else: center = n H = np.c_[H.T, repeat_center(n, center).T].T return H
def bbdesign_corrected(n, center=None): """ Create a Box-Behnken design Parameters ---------- n : int The number of factors in the design Optional -------- center : int The number of center points to include (default = 1). Returns ------- mat : 2d-array The design matrix Example ------- :: >>> bbdesign(3) array([[-1., -1., 0.], [ 1., -1., 0.], [-1., 1., 0.], [ 1., 1., 0.], [-1., 0., -1.], [ 1., 0., -1.], [-1., 0., 1.], [ 1., 0., 1.], [ 0., -1., -1.], [ 0., 1., -1.], [ 0., -1., 1.], [ 0., 1., 1.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) """ assert n >= 3, "Number of variables must be at least 3" # First, compute a factorial DOE with 2 parameters H_fact = ff2n_corrected(2) # Now we populate the real DOE with this DOE # We made a factorial design on each pair of dimensions # - So, we created a factorial design with two factors # - Make two loops Index = 0 nb_lines = int((0.5 * n * (n - 1)) * H_fact.shape[0]) H = repeat_center(n, nb_lines) for i in range(n - 1): for j in range(i + 1, n): Index = Index + 1 H[max([0, (Index - 1) * H_fact.shape[0]]):Index * H_fact.shape[0], i] = H_fact[:, 0] H[max([0, (Index - 1) * H_fact.shape[0]]):Index * H_fact.shape[0], j] = H_fact[:, 1] if center is None: if n <= 16: points = [0, 0, 0, 3, 3, 6, 6, 6, 8, 9, 10, 12, 12, 13, 14, 15, 16] center = points[n] else: center = n H = np.c_[H.T, repeat_center(n, center).T].T return H
def ccdesign_corrected(n, center=(4, 4), alpha="orthogonal", face="circumscribed"): """ Central composite design Parameters ---------- n : int The number of factors in the design. Optional -------- center : int array A 1-by-2 array of integers, the number of center points in each block of the design. (Default: (4, 4)). alpha : str A string describing the effect of alpha has on the variance. ``alpha`` can take on the following values: 1. 'orthogonal' or 'o' (Default) 2. 'rotatable' or 'r' face : str The relation between the start points and the corner (factorial) points. There are three options for this input: 1. 'circumscribed' or 'ccc': This is the original form of the central composite design. The star points are at some distance ``alpha`` from the center, based on the properties desired for the design. The start points establish new extremes for the low and high settings for all factors. These designs have circular, spherical, or hyperspherical symmetry and require 5 levels for each factor. Augmenting an existing factorial or resolution V fractional factorial design with star points can produce this design. 2. 'inscribed' or 'cci': For those situations in which the limits specified for factor settings are truly limits, the CCI design uses the factors settings as the star points and creates a factorial or fractional factorial design within those limits (in other words, a CCI design is a scaled down CCC design with each factor level of the CCC design divided by ``alpha`` to generate the CCI design). This design also requires 5 levels of each factor. 3. 'faced' or 'ccf': In this design, the star points are at the center of each face of the factorial space, so ``alpha`` = 1. This variety requires 3 levels of each factor. Augmenting an existing factorial or resolution V design with appropriate star points can also produce this design. Notes ----- - Fractional factorial designs are not (yet) available here. - 'ccc' and 'cci' can be rotatable design, but 'ccf' cannot. - If ``face`` is specified, while ``alpha`` is not, then the default value of ``alpha`` is 'orthogonal'. Returns ------- mat : 2d-array The design matrix with coded levels -1 and 1 Example ------- :: >>> ccdesign(3) array([[-1. , -1. , -1. ], [ 1. , -1. , -1. ], [-1. , 1. , -1. ], [ 1. , 1. , -1. ], [-1. , -1. , 1. ], [ 1. , -1. , 1. ], [-1. , 1. , 1. ], [ 1. , 1. , 1. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [-1.82574186, 0. , 0. ], [ 1.82574186, 0. , 0. ], [ 0. , -1.82574186, 0. ], [ 0. , 1.82574186, 0. ], [ 0. , 0. , -1.82574186], [ 0. , 0. , 1.82574186], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ]]) """ # Check inputs assert isinstance(n, int) and n > 1, '"n" must be an integer greater than 1.' assert alpha.lower() in ( "orthogonal", "o", "rotatable", "r", ), 'Invalid value for "alpha": {:}'.format(alpha) assert face.lower() in ( "circumscribed", "ccc", "inscribed", "cci", "faced", "ccf", ), 'Invalid value for "face": {:}'.format(face) try: nc = len(center) except: raise TypeError( 'Invalid value for "center": {:}. Expected a 1-by-2 array.'.format( center)) else: if nc != 2: raise ValueError( 'Invalid number of values for "center" (expected 2, but got {:})' .format(nc)) # Orthogonal Design if alpha.lower() in ("orthogonal", "o"): H2, a = star(n, alpha="orthogonal", center=center) # Rotatable Design if alpha.lower() in ("rotatable", "r"): H2, a = star(n, alpha="rotatable") # Inscribed CCD if face.lower() in ("inscribed", "cci"): H1 = ff2n_corrected(n) H1 = H1 / a # Scale down the factorial points H2, a = star(n) # Faced CCD if face.lower() in ("faced", "ccf"): H2, a = star(n) # Value of alpha is always 1 in Faced CCD H1 = ff2n_corrected(n) # Circumscribed CCD if face.lower() in ("circumscribed", "ccc"): H1 = ff2n_corrected(n) C1 = repeat_center(n, center[0]) C2 = repeat_center(n, center[1]) H1 = union(H1, C1) H2 = union(H2, C2) H = union(H1, H2) return H
def ccdesign(n, center=(4, 4), alpha='orthogonal', face='circumscribed'): """ Central composite design Parameters ---------- n : int The number of factors in the design. Optional -------- center : int array A 1-by-2 array of integers, the number of center points in each block of the design. (Default: (4, 4)). alpha : str A string describing the effect of alpha has on the variance. ``alpha`` can take on the following values: 1. 'orthogonal' or 'o' (Default) 2. 'rotatable' or 'r' face : str The relation between the start points and the corner (factorial) points. There are three options for this input: 1. 'circumscribed' or 'ccc': This is the original form of the central composite design. The star points are at some distance ``alpha`` from the center, based on the properties desired for the design. The start points establish new extremes for the low and high settings for all factors. These designs have circular, spherical, or hyperspherical symmetry and require 5 levels for each factor. Augmenting an existing factorial or resolution V fractional factorial design with star points can produce this design. 2. 'inscribed' or 'cci': For those situations in which the limits specified for factor settings are truly limits, the CCI design uses the factors settings as the star points and creates a factorial or fractional factorial design within those limits (in other words, a CCI design is a scaled down CCC design with each factor level of the CCC design divided by ``alpha`` to generate the CCI design). This design also requires 5 levels of each factor. 3. 'faced' or 'ccf': In this design, the star points are at the center of each face of the factorial space, so ``alpha`` = 1. This variety requires 3 levels of each factor. Augmenting an existing factorial or resolution V design with appropriate star points can also produce this design. Notes ----- - Fractional factorial designs are not (yet) available here. - 'ccc' and 'cci' can be rotatable design, but 'ccf' cannot. - If ``face`` is specified, while ``alpha`` is not, then the default value of ``alpha`` is 'orthogonal'. Returns ------- mat : 2d-array The design matrix with coded levels -1 and 1 Example ------- :: >>> ccdesign(3) array([[-1. , -1. , -1. ], [ 1. , -1. , -1. ], [-1. , 1. , -1. ], [ 1. , 1. , -1. ], [-1. , -1. , 1. ], [ 1. , -1. , 1. ], [-1. , 1. , 1. ], [ 1. , 1. , 1. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [-1.82574186, 0. , 0. ], [ 1.82574186, 0. , 0. ], [ 0. , -1.82574186, 0. ], [ 0. , 1.82574186, 0. ], [ 0. , 0. , -1.82574186], [ 0. , 0. , 1.82574186], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ], [ 0. , 0. , 0. ]]) """ # Check inputs assert isinstance(n, int) and n>1, '"n" must be an integer greater than 1.' assert alpha.lower() in ('orthogonal', 'o', 'rotatable', 'r'), 'Invalid value for "alpha": {:}'.format(alpha) assert face.lower() in ('circumscribed', 'ccc', 'inscribed', 'cci', 'faced', 'ccf'), 'Invalid value for "face": {:}'.format(face) try: nc = len(center) except: raise TypeError('Invalid value for "center": {:}. Expected a 1-by-2 array.'.format(center)) else: if nc!=2: raise ValueError('Invalid number of values for "center" (expected 2, but got {:})'.format(nc)) # Orthogonal Design if alpha.lower() in ('orthogonal', 'o'): H2, a = star(n, alpha='orthogonal', center=center) # Rotatable Design if alpha.lower() in ('rotatable', 'r'): H2, a = star(n, alpha='rotatable') # Inscribed CCD if face.lower() in ('inscribed', 'cci'): H1 = ff2n(n) H1 = H1/a # Scale down the factorial points H2, a = star(n) # Faced CCD if face.lower() in ('faced', 'ccf'): H2, a = star(n) # Value of alpha is always 1 in Faced CCD H1 = ff2n(n) # Circumscribed CCD if face.lower() in ('circumscribed', 'ccc'): H1 = ff2n(n) C1 = repeat_center(n, center[0]) C2 = repeat_center(n, center[1]) H1 = union(H1, C1) H2 = union(H2, C2) H = union(H1, H2) return H