The MULTTEST Procedure

Example 80.4 Fisher Test with Permutation Resampling

(View the complete code for this example.)

The following data, from Brown and Fears (1981), are the results of an 80-week carcinogenesis bioassay with female mice. Six tissue sites are examined at necropsy; 1 indicates the presence of a tumor and 0 the absence. A frequency variable Freq is included. A control and four different doses of a drug (in parts per milliliter) make up the levels of the grouping variable Dose.

data a;
   input Liver Lung Lymph Cardio Pitui Ovary Freq Dose$ @@;
   datalines;
1 0 0 0 0 0 8  CTRL   0 1 0 0 0 0 7  CTRL   0 0 1 0 0 0 6  CTRL
0 0 0 1 0 0 1  CTRL   0 0 0 0 0 1 2  CTRL   1 1 0 0 0 0 4  CTRL
1 0 1 0 0 0 1  CTRL   1 0 0 0 0 1 1  CTRL   0 1 1 0 0 0 1  CTRL
0 0 0 0 0 0 18 CTRL
1 0 0 0 0 0 9  4PPM   0 1 0 0 0 0 4  4PPM   0 0 1 0 0 0 7  4PPM
0 0 0 1 0 0 1  4PPM   0 0 0 0 1 0 2  4PPM   0 0 0 0 0 1 1  4PPM
1 1 0 0 0 0 4  4PPM   1 0 1 0 0 0 3  4PPM   1 0 0 0 1 0 1  4PPM
0 1 1 0 0 0 1  4PPM   0 1 0 1 0 0 1  4PPM   1 0 1 1 0 0 1  4PPM
0 0 0 0 0 0 15 4PPM
1 0 0 0 0 0 8  8PPM   0 1 0 0 0 0 3  8PPM   0 0 1 0 0 0 6  8PPM
0 0 0 1 0 0 3  8PPM   1 1 0 0 0 0 1  8PPM   1 0 1 0 0 0 2  8PPM
1 0 0 1 0 0 1  8PPM   1 0 0 0 1 0 1  8PPM   1 1 0 1 0 0 2  8PPM
1 1 0 0 0 1 2  8PPM   0 0 0 0 0 0 19 8PPM
1 0 0 0 0 0 4  16PPM  0 1 0 0 0 0 2  16PPM  0 0 1 0 0 0 9  16PPM
0 0 0 0 1 0 1  16PPM  0 0 0 0 0 1 1  16PPM  1 1 0 0 0 0 4  16PPM
1 0 1 0 0 0 1  16PPM  0 1 1 0 0 0 1  16PPM  0 1 0 1 0 0 1  16PPM
0 1 0 0 0 1 1  16PPM  0 0 1 1 0 0 1  16PPM  0 0 1 0 1 0 1  16PPM
1 1 1 0 0 0 2  16PPM  0 0 0 0 0 0 14 16PPM
1 0 0 0 0 0 8  50PPM  0 1 0 0 0 0 4  50PPM  0 0 1 0 0 0 8  50PPM
0 0 0 1 0 0 1  50PPM  0 0 0 0 0 1 4  50PPM  1 1 0 0 0 0 3  50PPM
1 0 1 0 0 0 1  50PPM  0 1 1 0 0 0 1  50PPM  0 1 0 0 1 1 1  50PPM
0 0 0 0 0 0 19 50PPM
;
proc multtest data=a order=data notables out=p
              permutation nsample=1000 seed=764511;
   test fisher(Liver Lung Lymph Cardio Pitui Ovary /
               lowertailed);
   class Dose;
   freq Freq;
run;
proc print data=p;
run;

In the PROC MULTTEST statement, the ORDER=DATA option is required to keep the levels of Dose in the order in which they appear in the data set. Without this option, the levels are sorted by their formatted value, resulting in an alphabetic ordering. The NOTABLES option suppresses the display of summary statistics, and the OUT= option produces an output data set p containing the p-values. The PERMUTATION option specifies permutation resampling, NSAMPLE=1000 requests 1000 samples, and SEED=764511 option provides a starting value for the random number generator. You should specify a seed if you need to duplicate resampling results.

To test for higher rates of tumor occurrence in the treatment groups compared to the control group, the LOWERTAILED option is specified in the FISHER option of the TEST statement to produce a lower-tailed Fisher exact test for the six tissue sites. The Fisher test is appropriate for comparing a treatment and a control, but multiple testing can be a problem. Brown and Fears (1981) use a multivariate permutation to evaluate the entire collection of tests. PROC MULTTEST adjusts the p-values by simulation.

The treatments make up the levels of the grouping variable Dose, listed in the CLASS statement. Since no CONTRAST statement is specified, PROC MULTTEST uses the default pairwise contrasts with the first level of Dose. The FREQ statement is used since these are summary data containing frequency counts of occurrences.

The results from this analysis are listed in Output 80.4.1 through Output 80.4.4. First, the PROC MULTTEST specifications are displayed in Output 80.4.1.

Output 80.4.1: Fisher Test with Permutation Resampling

The Multtest Procedure

Model Information
Test for discrete variablesFisher
Tails for discrete testsLower-tailed
Strata weightsNone
P-value adjustmentPermutation
Number of resamples1000
Seed764511


The default contrasts for the Fisher test are displayed in Output 80.4.2. Note that each dose is compared with the control.

Output 80.4.2: Default Contrast Coefficients

Contrast Coefficients
ContrastDose
CTRL 4PPM 8PPM 16PPM50PPM
CTRL vs. 4PPM1-1000
CTRL vs. 8PPM10-100
CTRL vs. 16PPM100-10
CTRL vs. 50PPM1000-1


The "p-Values" table in Output 80.4.3 displays p-values for the Fisher exact tests and their permutation-based adjustments.

Output 80.4.3: p-Values

p-Values
VariableContrastRawPermutation
LiverCTRL vs. 4PPM0.28280.9610
LiverCTRL vs. 8PPM0.30690.9670
LiverCTRL vs. 16PPM0.71021.0000
LiverCTRL vs. 50PPM0.77181.0000
LungCTRL vs. 4PPM0.78181.0000
LungCTRL vs. 8PPM0.88581.0000
LungCTRL vs. 16PPM0.54690.9990
LungCTRL vs. 50PPM0.84981.0000
LymphCTRL vs. 4PPM0.24230.9280
LymphCTRL vs. 8PPM0.58981.0000
LymphCTRL vs. 16PPM0.03500.2680
LymphCTRL vs. 50PPM0.41610.9930
CardioCTRL vs. 4PPM0.31630.9710
CardioCTRL vs. 8PPM0.05250.3710
CardioCTRL vs. 16PPM0.45060.9960
CardioCTRL vs. 50PPM0.75761.0000
PituiCTRL vs. 4PPM0.12500.7540
PituiCTRL vs. 8PPM0.49480.9970
PituiCTRL vs. 16PPM0.21570.9080
PituiCTRL vs. 50PPM0.50510.9970
OvaryCTRL vs. 4PPM0.94371.0000
OvaryCTRL vs. 8PPM0.81261.0000
OvaryCTRL vs. 16PPM0.77601.0000
OvaryCTRL vs. 50PPM0.36890.9930


As noted by Brown and Fears, only one of the 24 tests is significant at the 5% level (Lymph, CTRL vs. 16PPM). Brown and Fears report a 12% chance of observing at least one significant raw p-value for 16PPM and a 9% chance of observing at least one significant raw p-value for Lymph (both at the 5% level). Adjusted p-values exhibit much lower chances of false significances. For this example, none of the adjusted p-values are close to significant.

The OUT= data set is displayed in Output 80.4.4.

Output 80.4.4: OUT= Data Set

Obs_test__var__contrast__xval__mval__yval__nval_raw_pperm_psim_se
1FISHERLiverCTRL vs. 4PPM144918500.282820.9610.006122
2FISHERLiverCTRL vs. 8PPM144917480.306880.9670.005649
3FISHERLiverCTRL vs. 16PPM144911430.710221.0000.000000
4FISHERLiverCTRL vs. 50PPM144912500.771751.0000.000000
5FISHERLungCTRL vs. 4PPM124910500.781801.0000.000000
6FISHERLungCTRL vs. 8PPM12498480.885811.0000.000000
7FISHERLungCTRL vs. 16PPM124911430.546850.9990.000999
8FISHERLungCTRL vs. 50PPM12499500.849781.0000.000000
9FISHERLymphCTRL vs. 4PPM84912500.242280.9280.008174
10FISHERLymphCTRL vs. 8PPM8498480.589771.0000.000000
11FISHERLymphCTRL vs. 16PPM84915430.034980.2680.014006
12FISHERLymphCTRL vs. 50PPM84910500.416070.9930.002636
13FISHERCardioCTRL vs. 4PPM1493500.316310.9710.005307
14FISHERCardioCTRL vs. 8PPM1496480.052540.3710.015276
15FISHERCardioCTRL vs. 16PPM1492430.450610.9960.001996
16FISHERCardioCTRL vs. 50PPM1491500.757581.0000.000000
17FISHERPituiCTRL vs. 4PPM0493500.124960.7540.013619
18FISHERPituiCTRL vs. 8PPM0491480.494850.9970.001729
19FISHERPituiCTRL vs. 16PPM0492430.215720.9080.009140
20FISHERPituiCTRL vs. 50PPM0491500.505050.9970.001729
21FISHEROvaryCTRL vs. 4PPM3491500.943721.0000.000000
22FISHEROvaryCTRL vs. 8PPM3492480.812601.0000.000000
23FISHEROvaryCTRL vs. 16PPM3492430.775961.0000.000000
24FISHEROvaryCTRL vs. 50PPM3495500.368890.9930.002636


The _test_, _var_, and _contrast_ variables provide the TEST name, TEST variable, and CONTRAST label, respectively. The _xval_, _mval_, _yval_, and _nval_ variables contain the components used to compute the Fisher exact tests from the hypergeometric distribution. The raw_p variable contains the p-values from the Fisher exact tests, and the perm_p variable contains their permutation-based adjustments. The variable sim_se is the simulation standard error from the permutation resampling.