Analyzes a wide variety of split-plot experiments with fixed, mixed or random factors. The whole-plots can be assigned to experimental units using either a completely randomized or randomized complete block design. Function split_plot also analyzes split-plot experiments replicated at several locations.
#include <imsls.h>
float *imsls_f_split_plot (int n, int n_locations, int n_whole, int n_split, int rep[], int whole[], int split[], float y[],…, 0)
The type double function is imsls_d_split_plot.
int n
(Input)
Number of missing and non-missing experimental
observations. imsls_f_split_plot
verifies that:
int n_locations
(Input)
Number of locations. n_locations must be
one or greater. If n_locations>1, then
the optional array locations[] must be
included as input to imsls_f_split_plot.
int n_whole
(Input)
Number of levels associated with the whole-plot factor. n_whole must be
greater than one.
int n_split
(Input)
Number of levels associated with the split-plot factor. n_split must be
greater than one.
int rep[] (Input)
An array of length n containing the block, or replicate, identifiers for each observation in y. Locations can have different numbers of blocks or replicates. Each block or replicate at a single location must be assigned a different identifier, but different locations can have the same assignments.
int whole[]
(Input)
An array of length n containing the
whole-plot identifiers for each observation in y. Each level of
the whole-plot factor must be assigned a different integer. imsls_f_split_plot
verifies that the number of unique whole-plot identifiers is equal to n_whole.
int split[] (Input)
An array of length n containing the split-plot identifiers for each observation in y. Each level of the split-plot factor must be assigned a different integer. imsls_f_split_plot verifies that the number of unique split-plot identifiers is equal to n_split.
float y[]
(Input)
An array of length n containing the
experimental observations and any missing values. Missing values cannot be
omitted. They are indicated by placing a NaN (not a number) in y. The NaN value can
be set using either the function imsls_f_machine(6) or
imsls_d_machine(6),
depending upon whether single or double precision is being used,
respectively. At a single location, only one missing value per whole-plot
is allowed. The location, whole-plot and split-plot for each observation
in y are
identified by the corresponding values in the arguments locations, whole and split.
Address of a pointer to the memory location of a two dimensional, 11 by 6 array containing the ANOVA table. Each row in this array contains values for one of the effects in the ANOVA table. The first value in each row, anova_tablei,0 = anova_table[i*6], identifies the source for the effect associated with values in that row. The remaining values in a row contain the ANOVA table values using the following convention:
j |
anova_tablei,j = anova_table[i*6+j] |
0 |
Source Identifier (values described below) |
1 |
Degrees of freedom |
2 |
Sum of squares |
3 |
Mean squares |
4 |
F-statistic |
5 |
p-value for this F-statistic |
The Source Identifiers in the first column of anova_tablei,j are the only negative values in anova_table[]. Note that the p-value for the F-statistic is returned as 0.0 when the value is so small that all significant digits have been lost. Assignments of identifiers to ANOVA sources use the following coding:
Source Identifier |
ANOVA Source |
-1 |
LOCATION† |
-2 |
BLOCK WITHIN LOCATION‡ |
-3 |
WHOLE-PLOT |
-4 |
LOCATION × WHOLE-PLOT† |
-5 |
WHOLE-PLOT ERROR |
-6 |
SPLIT-PLOT |
-7 |
LOCATION × SPLIT-PLOT† |
-8 |
WHOLE-PLOT × SPLIT-PLOT |
-9 |
LOCATION × WHOLE-PLOT × SPLIT-PLOT† |
-10 |
SPLIT-PLOT ERROR ⇑ |
-11 |
CORRECTED TOTAL |
Notes: † If n_locations=1 sources involving location are set to missing (NaN).
‡ If IMSLS_CRD is set, entries for block within location are set to missing, and its sum of squares and degrees of freedom are pooled into the whole-plot error.
⇑ Split-plot error component calculation varies depending upon the settings for IMSLS_RCBD, IMSLS_LOC_FIXED, IMSLS_WHOLE_FIXED, IMSLS_SPLIT_FIXED, and upon whether n_locations = 1. See the Description section below for details.
#include <imsl.h>
float
*imsls_f_split_plot (int
n,
int n_locations, int
n_whole,
int n_split,
int rep[],
int whole[],
int split[],
float y[],
IMSLS_LOCATIONS, int
locations[],
IMSLS_LOC_RANDOM
or
IMSLS_LOC_FIXED,
IMSLS_RCBD
or
IMSLS_CRD,
IMSLS_WHOLE_FIXED or
IMSLS_WHOLE_RANDOM,
IMSLS_SPLIT_FIXED or
IMSLS_SPLIT_RANDOM,
IMSLS_N_MISSING,
int *n_missing,
IMSLS_CV, float
**cv,
IMSLS_CV_USER, float
cv[],
IMSLS_GRAND_MEAN, float
*grand_mean,
IMSLS_WHOLE_PLOT_MEANS, float
**whole_plot_means,
IMSLS_WHOLE_PLOT_MEANS_USER, float
whole_plot_means[],
IMSLS_SPLIT_PLOT_MEANS, float
**split_plot_means,
IMSLS_SPLIT_PLOT_MEANS_USER, float
split_plot_means[],
IMSLS_TREATMENT_MEANS, float
**treatment_means,
IMSLS_TREATMENT_MEANS_USER, float
treatment_means[],
IMSLS_STD_ERRORS, float
**std_err,
IMSLS_STD_ERRORS_USER, float
std_err[],
IMSLS_N_BLOCKS, int
**n_blocks,
IMSLS_N_BLOCKS_USER, int
n_blocks[],
IMSLS_BLOCK_SS, float
**block_ss,
IMSLS_BLOCK_SS_USER, float
block_ss[],
IMSLS_WHOLE_PLOT_SS,
float
**whole_plot_ss,
IMSLS_WHOLE_PLOT_SS_USER,
float whole_plot_ss[],
IMSLS_SPLIT_PLOT_SS,
float
**split_plot_ss,
IMSLS_SPLIT_PLOT_SS_USER,
float split_plot_ss[],
IMSLS_WHOLEXSPLIT_PLOT_SS,
float **wholexsplit_plot_ss,
IMSLS_WHOLEXSPLIT_PLOT_SS_USER,
float wholexsplit_plot_ss[],
IMSLS_WHOLE_PLOT_ERROR_SS,
float **whole_plot_error_ss,
IMSLS_WHOLE_PLOT_ERROR_SS_USER,
float whole_plot_error_ss[],
IMSLS_SPLIT_PLOT_ERROR_SS,
float **split_plot_error_ss,
IMSLS_SPLIT_PLOT_ERROR_SS_USER,
float split_plot_error_ss[],
IMSLS_TOTAL_SS,
float
**total_ss,
IMSLS_TOTAL_SS_USER, float
total_ss[],
IMSLS_ANOVA_ROW_LABELS, char
***anova_row_labels,
IMSLS_ANOVA_ROW_LABELS_USER,
char *anova_row_labels[],
IMSLS_RETURN_USER, float
anova_table[]
0)
IMSLS_LOCATIONS,
int locations[]
(Input)
An array of length n containing the
location identifiers for each observation in y. Unique
integers must be assigned to each location in the study. This argument is
required when n_locations>1.
IMSLS_LOC_FIXED or
IMSLS_LOC_RANDOM
(Input)
A characteristic controlling whether the location factor is treated
as a fixed or random effect, when n_locations>1.
IMSLS_LOC_FIXED
and IMSLS_LOC_RANDOM
imply that the factor is a fixed effect or random effect, respectively.
Default: IMSLS_LOC_RANDOM
IMSLS_RCBD or
IMSLS_CRD
(Input)
Whole-plot randomization characteristic: IMSLS_RCBD implies
that whole-plots are assigned to whole-plot experimental units using a
randomized complete block design. IMSLS_CRD implies that
whole-plots are completely randomized to whole-plot experimental units.
Default: IMSLS_RCBD
IMSLS_WHOLE_FIXED or
IMSLS_WHOLE_RANDOM
(Input)
Whole-plot characteristic. IMSLS_WHOLE_FIXED
implies that the whole-plot factor is a fixed effect, and IMSLS_WHOLE_RANDOM
implies that it is a random effect.
Default: IMSLS_WHOLE_FIXED
IMSLS_SPLIT_FIXED or
IMSLS_SPLIT_RANDOM
(Input)
Split-plot characteristic. IMSLS_SPLIT_FIXED
implies that the split-plot factor is a fixed effect, and IMSLS_SPLIT_RANDOM
implies that it is a random effect.
Default: IMSLS_SPLIT_FIXED.
IMSLS_N_MISSING,
int *n_missing
(Output)
Number of missing values, if any, found in y. Missing values are
denoted with a NaN (Not a Number) value.
IMSLS_CV, float
**cv
(Output)
Address of a pointer to an internally allocated array
of length 2 containing the whole-plot and split-plot coefficients of
variation. cv[0] contains the
whole-plot C.V., and cv[1] contains the
split-plot C.V.
IMSLS_CV_USER,
float cv[]
(Output)
Storage for the array cv, provided by the
user.
IMSLS_GRAND_MEAN, float *grand_mean
(Output)
Mean of all the data across every
location.
IMSLS_WHOLE_PLOT_MEANS,
float **whole_plot_means
(Output)
Address of a pointer to an internally allocated array of
length n_whole
containing the whole-plot means.
IMSLS_WHOLE_PLOT_MEANS_USER,
float whole_plot_means[]
(Output)
Storage for the array whole_plot_means,
provided by the user.
IMSLS_SPLIT_PLOT_MEANS,
float **split_plot_means
(Output)
Address of a pointer to an internally allocated array of
length n_split
containing the split-plot means.
IMSLS_SPLIT_PLOT_MEANS_USER,
float split_plot_means[]
(Output)
Storage for the array split_plot_means,
provided by the user.
IMSLS_TREATMENT_MEANS,
float **treatment_means
(Output)
Address of a pointer to an internally allocated array of
size
(n_whole * n_split) containing
the treatment means. For
I > 0 and j > 0,
treatment_meansi,j = treatment_means[(i-1)*n_split+j-1] contains
the mean of the observations, averaged over all locations, blocks and
replicates, for the j-th
split-plot within the i-th
whole-plot.
IMSLS_TREATMENT_MEANS_USER,
float treatment_means[]
(Output)
Storage for the array treatment_means,
provided by the user.
IMSLS_STD_ERRORS,
float **std_err
(Output)
Address of a pointer to an internally allocated array of
length 10 containing five standard errors and their associated degrees of
freedom.
Element |
Standard Error for Comparisons Between Two |
Degrees of Freedom |
std_err[0] |
Whole-Plot Means |
std_err[5] |
std_err[1] |
Split-Plot Means |
std_err[6] |
std_err[2] |
Split-Plots within same Whole-Plot |
std_err[7] |
std_err[3] |
Whole-Plots within same Split-Plot |
std_err[8] |
std_err[4] |
Treatment Means (same whole-plot, split-plot and sub-plot) |
std_err[9] |
IMSLS_STD_ERRORS_USER,
float std_err[]
(Output)
Storage for the array std_err, provided by
the user.
IMSLS_N_BLOCKS,
int **n_blocks
(Output)
Address of a pointer to an internally allocated array
of length n_locations containing
the number of blocks, or replicates, at each location.
IMSLS_N_BLOCKS_USER,
int n_blocks[]
(Output)
Storage for the array n_blocks, provided by
the user.
IMSLS_BLOCK_SS,
float **block_ss
(Output)
Address of a pointer to an internally allocated
2-dimensional array of size n_locations by 2
containing the sum of squares for blocks and their associated degrees of freedom
for each
location.
IMSLS_BLOCK_SS_USER,
float block_ss[]
(Output)
Storage for the array block_ss, provided by
the user. Address of a pointer to an internally allocated 2-dimensional
array of size n_locations by 2
containing the sum of squares for blocks and their associated degrees of freedom
for each location.
IMSLS_WHOLE_PLOT_SS,
float **whole_plot_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional
array of size n_locations by 2
containing the error sum of
squares for whole-plots and their associated degrees of freedom for each
location.
IMSLS_WHOLE_PLOT_SS_USER,
float whole_plot_ss[]
(Output)
Storage for the array whole_plot_ss,
provided by the user.
IMSLS_SPLIT_PLOT_SS,
float **split_plot_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional
array of size n_locations by 2
containing the sum of squares for split-plots and their associated degrees of
freedom for each location.
IMSLS_SPLIT_PLOT_SS_USER,
float split_plot_ss[]
(Output)
Storage for the array split_plot_ss, provided by the user.
IMSLS_WHOLEXSPLIT_PLOT_SS,
float **wholexsplit_plot_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional array
of size n_locations by 2
containing the sum of squares for whole-plot by split-plot interaction and their
associated degrees of freedom for each location.
IMSLS_WHOLEXSPLIT_PLOT_SS_USER,
float wholexsplit_plot_ss[]
(Output)
Storage for the array wholexsplit_plot_ss, provided by the user.
IMSLS_WHOLE_PLOT_ERROR_SS,
float **whole_plot_error_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional
array of size n_locations by 2
containing the sum of squares for error and their associated degrees of freedom
for each location.
IMSLS_WHOLE_PLOT_ERROR_SS_USER,
float whole_plot_error_ss[]
(Output)
Storage for the array whole_plot_error_ss, provided by the user.
IMSLS_SPLIT_PLOT_ERROR_SS,
float **split_plot_error_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional array
of size n_locations by 2
containing the sum of squares for split-plots and their associated degrees of
freedom for each location.
IMSLS_SPLIT_PLOT_ERROR_SS_USER,
float split_plot_error_ss[]
(Output)
Storage for the array split_plot_error_ss,
provided by the user.
IMSLS_TOTAL_SS,
float **total_ss
(Output)
Address of a pointer to an internally allocated 2-dimensional array
of size n_locations by 2
containing the corrected total sum of squares and their associated degrees of
freedom for each location.
IMSLS_TOTAL_SS_USER,
float total_ss[]
(Output)
Storage for the array total_ss, provided by
the user.
IMSLS_ANOVA_ROW_LABELS,
char ***anova_row_labels
(Output)
Address of a pointer to a pointer to an internally allocated array
containing the labels for each of the n_anova rows of the
returned ANOVA table. The label for the i-th row of the ANOVA table
can be printed with printf("%s", anova_row_labels[i]);
The
memory associated with anova_row_labels
can be freed with a single call to imsls_free(anova_row_labels).
IMSLS_ANOVA_ROW_LABELS_USER,
char *anova_row_labels[]
(Output)
Storage for the array anova_row_labels,
provided by the user. The amount of space required will vary depending
upon the number of factors and n_anova. An
upperbound on the required memory is char *anova_row_labels[600].
IMSLS_RETURN_USER,
float anova_table[]
(Output)
User defined array of length 66 for storage of the 11 by 6 Anova
table described as the return argument for imsls_f_split_plot.
For a detailed description of the format for this table, see the previous
description of the return arguments for imsls_f_split_plot.
Function imsls_f_split_plot is capable of analyzing a wide variety of split-plot experiments. Whole-plot and split-plot factors can each be designated as either fixed or random, allowing for experiments with fixed, random or mixed treatment effects. By default, imsls_f_split_plot assumes that all treatment factors are fixed effects, i.e. IMSLS_WHOLE_FIXED and IMSLS_SPLIT_FIXED are default settings. Whole-plot or split-plot factors can each be declared as random effects by setting the optional input arguments IMSLS_WHOLE_RANDOM and IMSLS_SPLIT_RANDOM, respectively.
Split-plot experimental designs can also vary in the assignment of the whole-plot factor to its experimental units. In some cases, this assignment is completely random. For example, in a drug study the experimental unit might be the subject receiving a treatment. The whole-plot factor, possibly different treatments, could be assigned in one of two ways. Each subject could receive only one treatment or each could receive all treatments over an appropriate period of time. If each subject received only a single randomly selected treatment, then this design constitutes a completely randomized design for the whole-plot factor, and the optional input argument IMSLS_CRD must be set.
On the other hand, if each subject receives every treatment in random order, then the subject is a blocking factor, and this sampling scheme constitutes a randomized complete block design. In this case, it is necessary to assume that there are no carry-over effects from one treatment to another. This sampling scheme is the default setting, i.e. IMSLS_RCBD is the default setting.
A similar randomization choice occurs in agricultural field trials. A trial designed to test different fertilizers and different seed lots can be conducted in one of two ways. The whole-plot factor, fertilizer, can be applied to different fields, or each can be applied to sub-divisions of these fields. In either case, a field is the whole-plot experimental unit. In the first case in which only a single randomly selected fertilizer is applied to a single field, the whole-plot factor is not blocked and this scheme is called as a completely randomized design, and the optional input argument IMSLS_CRD must be set. However, if fertilizers are applied to sub-plots within a field, then the whole-plot factor is blocked within fields and this assignment is referred to as a randomized complete block design. By default, this function assumes that levels of the whole-plot factor are randomly assigned within blocks, i.e. IMSLS_RCBD is the default setting for randomizing whole-plots.
The essential distinction between split-plot experiments and completely randomized or randomized complete block experiments is the presence of a second factor that is blocked, or nested, within each level of the whole-plot factor. This second factor is referred to as the split-plot factor, see Table 4 - 23. If levels of this factor were completely randomized, then two or more treatments with the same split-plot level could be assigned to the same whole-plot level, see Table 4 - 24.
Whole Plot Factor | |||
A2 |
A1 |
A4 |
A3 |
A2B1 |
A1B3 |
A4B1 |
A3B2 |
A2B3 |
A1B1 |
A4B3 |
A3B1 |
A2B2 |
A1B2 |
A4B2 |
A3B2 |
Table 4- 23 – Split-Plot Experiments – Split-Plot B Nested within Whole-Plot A
CRD | |||
A3B2 |
A1B3 |
A4B1 |
A4B3 |
A2B3 |
A1B1 |
A3B2 |
A1B2 |
A2B2 |
A3B1 |
A2B1 |
A4B2 |
Table 4- 24 – Completely Randomized Experiments – Both Factors Randomized
In some studies, a split-plot experiment is replicated at several locations. Function imsls_f_split_plot can also analyze split-plot experiments replicated at multiple locations, even when the number of blocks or replicates at each location are different. If only a single replicate or block is used at each location, then location should be treated as a blocking factor, with n_locations set equal to one. If n_locations=1, it is assumed that the experiment was conducted at a single location with more than one block or replicate at that location. In this case, the four entries associated with location in the Anova table will contain missing values.
However, if n_locations>1, it is assumed the experiment was repeated at multiple locations, with replication or blocking occurring at each location. Although the number of blocks, or replicates, at each location can be different, the number of levels for whole-plot and split-plot factors, n_whole and n_split, must be the same at each location. The location associated with y[i] is specified in location[i], which is a required input argument when n_locations>1.
By default, locations are assumed to be random effects. However, they can be specified as fixed effects by setting the optional argument IMSLS_LOC_FIXED. This setting changes the calculations of the F-tests for whole-plot and split-plot factors. If locations are assumed to be fixed effects, then the whole-plot and split-plot errors at each location are pooled to form the whole-plot and split-plot errors. This can dramatically increase the degrees of freedom associated with the F-test for the treatment factors, resulting in smaller p-values. However, pooling the error terms from different locations requires experimenters to assume that the errors at each location are approximately the same. This should be verified using a test for homogeneity of variance, such as Bartlett’s or Levene’s test.
On the other hand, if locations are assumed to be random effects, then tests involving whole-plots use the interaction between whole-plots and locations as the error term for testing whether there are statistically significant differences among whole-plot factor levels. However, this assumes that the interaction of whole-plots and locations is not statistically significant. A test of this assumption uses the pooled whole-plot error. If the interaction between whole-plots and locations is statistically significant, then the nature of that interaction should be explored since it impacts the interpretation of the significance of the whole-plot treatment factor.
Similarly, when locations are assumed to be random effects, tests involving split-plots do not use the split-plot errors pooled across locations. Instead, the error term for split plots is the interaction between locations and split-plots. The split-plot by whole-plot interaction is tested against the location by split-plot by whole-plot interaction.
Suppose, for example, that a researcher wanted to conduct an agricultural experiment comparing the effectiveness of 4 fertilizers with 4 seed lots. One replicate of the experiment is conducted at each of the 3 farms. That is, only a single field at each location is assigned to this experiment.
The field at each farm is divided into 4 whole-plots and the fertilizers are randomly assigned to each of the 4 whole-plots. Each whole-plot is then further divided into 4 split-plots, and the seed lots are randomly assigned to these split-plots.
In this case, each farm is a blocking factor, fertilizers are whole-plots and seed lots are split-plots. The input array rep would contain integers from 1 to the number of farms.
However, if each farm allocated more than a single field for this study, then each farm would be treated as a different location with n_locations set equal to the number of farms, and fields would be treated as blocking factor. The array rep would contain integers from 1 to the number fields used in a farm, and locations[] would contain integers from 1 to the number of farms.
In summary this function can analyze 3x2x2x2=24 different experimental situations, depending upon the settings of:
1. Locations (none, fixed or random): specified by setting n_locations, locations[] and IMSLS_LOC_FIXED or IMSLS_LOC_RANDOM.
2. Whole-plot sampling (CRD or RCBD): specified by setting IMSLS_CRD or IMSLS_RCBD.
3. Whole-plot effect (fixed or random): specified by setting either IMSLS_WHOLE_FIXED or IMSLS_WHOLE_RANDOM.
4. Split-plot effect (fixed or random): specified by setting either IMSLS_SPLIT_FIXED or IMSLS_SPLIT_RANDOM.
The default condition depends upon the value for n_locations. If n_locations>1, locations are assumed to be a random effect. Assignment of experimental units to whole-plots is assumed to use a RCBD design and both whole-plots and split-plots are assumed to be fixed effects.
This example uses data from a split-plot design consisting of two whole-plots and four split-plots.
#include <stdlib.h>
#include <math.h>
#include <imsls.h>
int main()
{
char *col_labels[] = {" ", "\nID", "\nDF", "\nSSQ",
"Mean\nsquares", "\nF", "\np-value"};
int i, page_width = 132;
int n = 24; /* Total number of observations */
int n_locations = 1; /* Number of locations */
int n_whole = 2; /* Number of Whole-plots within a location */
int n_split = 4; /* Number of Split-plots within a location,
Whole_plot */
int rep[]={
1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3};
int whole[]={
1, 1, 1, 1, 2, 2, 2, 2,
1, 1, 1, 1, 2, 2, 2, 2,
1, 1, 1, 1, 2, 2, 2, 2};
int split[]={
1, 2, 3, 4, 1, 2, 3, 4,
1, 2, 3, 4, 1, 2, 3, 4,
1, 2, 3, 4, 1, 2, 3, 4};
float y[] ={
30.0, 40.0, 38.9, 38.2,
41.8, 52.2, 54.8, 58.2,
20.5, 26.9, 21.4, 25.1,
26.4, 36.7, 28.9, 35.9,
21.0, 25.4, 24.0, 23.3,
34.4, 41.0, 33.0, 34.9};
float grand_mean;
float *aov;
float *treatment_means;
float *whole_plot_means;
float *split_plot_means;
int *equal_means;
char **aov_row_labels;
aov = imsls_f_split_plot(n, n_locations, n_whole, n_split,
rep, whole, split, y,
IMSLS_GRAND_MEAN, &grand_mean,
IMSLS_TREATMENT_MEANS, &treatment_means,
IMSLS_WHOLE_PLOT_MEANS, &whole_plot_means,
IMSLS_SPLIT_PLOT_MEANS, &split_plot_means,
IMSLS_ANOVA_ROW_LABELS, &aov_row_labels,
0);
/* Output results. */
imsls_page(IMSLS_SET_PAGE_WIDTH, &page_width);
/* Print ANOVA table, without first column. */
imsls_f_write_matrix(" *** ANALYSIS OF VARIANCE TABLE ***",
11, 6, aov,
IMSLS_WRITE_FORMAT, "%3.0f%3.0f%8.2f%7.2f%7.2f%7.3f",
IMSLS_ROW_LABELS, aov_row_labels,
IMSLS_COL_LABELS, col_labels,
0);
/* Print the various means. */
printf("\n\nGrand mean: %f\n", grand_mean);
imsls_f_write_matrix("Treatment Means", n_whole, n_split,
treatment_means, 0);
imsls_f_write_matrix("Whole-plot Means", n_whole, 1,
whole_plot_means, 0);
imsls_f_write_matrix("Split-plot Means", n_split, 1,
split_plot_means, 0);
}
*** ANALYSIS OF VARIANCE TABLE ***
Mean
ID DF SSQ squares F p-value
Location -1 ... ........ ....... ....... .......
Block Within Location -2 2 1310.28 655.14 30.82 0.031
Whole-Plot -3 1 858.01 858.01 40.37 0.024
Location x Whole-Plot -4 ... ........ ....... ....... .......
Whole-Plot Error -5 2 42.51 21.26 2.03 0.173
Split-Plot -6 3 227.73 75.91 7.26 0.005
Location x Split-Plot -7 ... ........ ....... ....... .......
Whole-Plot x Split-Plot -8 3 13.40 4.47 0.43 0.737
Location x Whole-Plot x -9 ... ........ ....... ....... .......
Split-Plot
Split-Plot Error -10 12 125.39 10.45 ....... .......
Corrected Total -11 23 2577.33 ....... ....... .......
Grand mean: 33.870834
Treatment Means
1 2 3 4
1 23.83 30.77 28.10 28.87
2 34.20 43.30 38.90 43.00
Whole-plot Means
1 27.89
2 39.85
Split-plot Means
1 29.02
2 37.03
3 33.50
4 35.93