Why do I always get 1 for df when running adonis function (permanova)?

1.2k Views Asked by At

I run adonis on community data and environmental matrix (that contains a factor of two levels and 6 continuous variables) using Bray-Curtis and I always take 1 df but this is not the case. Probably there is a bug here.

See also the example in adonis

data(dune) 
data(dune.env)  
str(dune.env)  
adonis(dune ~ Management*A1, data=dune.env, permutations=99)

Although A1 is a numeric variable the result provides 1 df.

1

There are 1 best solutions below

2
On

In the model:

> adonis(dune ~ Management*A1, data=dune.env, permutations=99)

Call:
adonis(formula = dune ~ Management * A1, data = dune.env, permutations = 99) 

Permutation: free
Number of permutations: 99

Terms added sequentially (first to last)

              Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)   
Management     3    1.4686 0.48953  3.2629 0.34161   0.01 **
A1             1    0.4409 0.44089  2.9387 0.10256   0.02 * 
Management:A1  3    0.5892 0.19639  1.3090 0.13705   0.21   
Residuals     12    1.8004 0.15003         0.41878          
Total         19    4.2990                 1.00000          
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The main effect of A1 uses a single degree of freedom because it is a continuous variable. The interaction between Management and A1 uses 3 additional degree's of freedom as there is one additional "effect" of A1 per level of Management.

This is all expected and there is certainly no bug illustrated in adonis() from this model.

Importantly, you must insure that factor variables are coded as factors otherwise, for example if the categories are coded as integers, then R will still interpret those variables as continuous/numeric. It will only interpret them as factors if coerced to the "factor" class. Check the output of str(df), where df is your data frame containing the predictor variables (covariates; the things on the right-hand side of ~), and insure that each factor variable is of the appropriate class. For example, the dune.env data are:

> str(dune.env)  
'data.frame':   20 obs. of  5 variables:
 $ A1        : num  2.8 3.5 4.3 4.2 6.3 4.3 2.8 4.2 3.7 3.3 ...
 $ Moisture  : Ord.factor w/ 4 levels "1"<"2"<"4"<"5": 1 1 2 2 1 1 1 4 3 2 ...
 $ Management: Factor w/ 4 levels "BF","HF","NM",..: 4 1 4 4 2 2 2 2 2 1 ...
 $ Use       : Ord.factor w/ 3 levels "Hayfield"<"Haypastu"<..: 2 2 2 2 1 2 3 3 1 1 ...
 $ Manure    : Ord.factor w/ 5 levels "0"<"1"<"2"<"3"<..: 5 3 5 5 3 3 4 4 2 2 ...

which indicates that Management is a factor, A1 is numeric (it is the thickness of the A1 soil horizon), and the remaining variables are ordered factors (but still factors; they work correctly in R's omdel formula infrastructure).