Outputs from statistical tests conducted in **spm1d** contain details which may be accessed in two ways:

- Interactively using the
**print**command - Programmatically using SPM object attributes

As examples let us revisit the one-sample t test.

(Source code, png, hires.png, pdf)

The single output of all statistical tests in **spm1d.stats** is a test statistic continuum (or SPM) object, which can be explored interactively using the *print* command:

```
>>> t = spm1d.stats.ttest(Y)
>>> print( t )
```

```
SPM{t}
SPM.z : (1x100) test stat field
SPM.df : (1, 9)
SPM.fwhm : 11.21919
SPM.resels : (1, 8.82417)
```

Note

If you are in an interactive Python session, simply typing “t” and then ENTER should produce the same output.

The attributes of the SPM object include:

**SPM{t}**— a label indicating that this variable is a statistical parametric map, and that the test statistic is the*t*statistic. If we had conducted ANOVA, for example, then the variable would be labeled as “SPM{F}”.**SPM.z**— the 1D test statistic continuum (or “test statistic field” or “test statistic trajectory”)**SPM.df**— degrees of freedom**SPM.fwhm**— the estimated full-width at half-maximum (FWHM) of a 1D Gaussian kernel which, when convolved with (random) 1D Gaussian continua, would yield the same smoothness as the observed residuals. The “residuals” are 1D continua embodying the variable that is not accounted for by the experimental design. In a one sample t test, for example, the residual for the*j*-th continuum is simply the difference between that continuum and the mean continuum:>>> j = 0 >>> residual_j = Y[j] - Y.mean(axis=0)

**SPM.resels**— the resolution element counts, where “resolution element” refers to the geometric properties of the continuum. The first resel count is the Euler characteristic (*EC*), where*EC*is equal to one plus the number of “holes” in the continuum. The second resel count is (*Q*-*EC*) / FWHM, where*Q*is the number of continuum nodes. Thus the first resel count represents the number of separate “sections” in the continuum, and the second resel count represents the total number of independent “processes” in the continuum.

Each **SPM{t}** attribute can also be accessed programmatically, like this:

```
>>> x = t.fwhm
>>> print( x )
```

```
11.219185575045229
```

The output of the **inference** method is an inference continuum (or inference SPM) object:

```
>>> t = spm1d.stats.ttest(Y)
>>> ti = t.inference(alpha=0.05)
>>> print( ti )
```

```
SPM{t}
SPM.z : (1x100) test stat field
SPM.df : (1, 9)
SPM.fwhm : 11.21919
SPM.resels : (1, 8.82417)
Inference:
SPM.alpha : 0.050
SPM.zstar : 3.82411
SPM.h0reject : True
SPM.p : (0.031)
```

The first four attributes are the same as in the raw SPM above. The final four attributes are introduced at the statistical inference stage.

**SPM.alpha**— the user-specified Type I error rate (default: 0.05)**SPM.zstar**— the critical Random Field Theory threshold**h0reject**— the null hypothesis rejection decision (i.e. does the test statistic continuum exceed zstar?)**SPM.p**— a list of probability values, one for each threshold-surviving cluster. By definition each cluster’s probability value is equal to or less than*alpha*.

Note

In this example the *p* value is 0.031. This could be interpreted as follows: “the probability that smooth random 1D continua would produce a suprathreshold cluster as broad or broader than the observed cluster is 0.031”.

Danger

Do not misinterpret probability values as descriptors of experimental data.

They instead describe the random behavior of smooth Gaussian 1D continua.

Cluster-specific probability values depend on five parameters:

- Type of test statistic
- Sample size (i.e. degrees of freedom)
- Resel counts (i.e. continuum size relative to its smoothness)
- The cluster’s minimum suprathreshold height
- The cluster’s breadth relative to the continuum size.

All inference SPM objects have an attribute called “clusters” which contains a list of **cluster** objects.

```
>>> t = spm1d.stats.ttest(Y)
>>> ti = t.inference(alpha=0.05)
>>> print( ti.clusters )
```

```
[Cluster at location: (17.000, 3.870)
extent : 3
extent (resels) : 0.26740
height (min) : 3.86630
P : 0.03102
]
```

Note

If multiple clusters exist, they will be listed in the following order: (1) upper threshold left-to-right, (2) lower threshold left-to-right.

Warning

If the test fails to reach the critical threshold, **clusters** will be an empty list: “[ ]”.

You can access specific clusters using list indexing:

```
>>> cluster0 = ti.clusters[0]
>>> print( cluster0 )
```

```
Cluster at location: (17.000, 3.870)
extent : 3
extent (resels) : 0.26740
height (min) : 3.86630
P : 0.03102
```

Cluster attributes include:

**cluster.xy**— the cluster centroid coordinates. Here the centroid is located at (17.000, 3.870).**cluster.extent**— the number of continuum nodes in this cluster which exceed the threshold.**cluster.extentR**— the same as**cluster.extent**, but expressed in resel units.**cluster.h**— the minimum height of all cluster nodes.**cluster.P**— the probability that smooth, random 1D continua would produce a suprathreshold cluster with the observed breadth