All 4 entries tagged Spm2

No other Warwick Blogs use the tag Spm2 on entries | View entries tagged Spm2 at Technorati | There are no images tagged Spm2 on this blog

June 03, 2010

SPM2 Gem 4: –log10 P–values from T images

P-value images are difficult to visualize since "important" values are small and clumped near zero. A -log10 transformation makes for much better visualization while still having interpretability (e.g. a value of 3 cooresponds to P=0.001).

This function, T2nltP, will create -log10 P-value image based on either a contrast number (which must be a T contrast) or a T statistic image and the degrees of freedom.

This version for SPM2 was created Michael Moffitt, based on the SPM99 function of the same name for SPM99. Note that Michael's version can easily be changed to create P-values instead of -log10 P-values.


function T2nltP(a1,a2)
% Write image of P-values (spm_nltP_?) for a T image
% SPM will ask you which spmT_? file you want to convert to spm_nltP_?
% FORMAT T2nltP(Timg,df)
% Timg  Filename of T image
% df    Degrees of freedom
% As per SPM convention, T images are zero masked, and so zeros will have
% P-value NaN.
% @(#)T2nltP.m  1.2 T. Nichols 03/07/15
% Modified 04/01/20 by MAM - for SPM2 compatibility

if nargin==0

     % Ask user for SPM.mat file and specific contrast

     % If a 'T' contrast, get degrees of freedom (df) and fname of spmT_?
     if xSPM.STAT ~= 'T', error('Not a T contrast'); end

elseif nargin==2
   Tnm = a1;
   df  = a2;

Tvol = spm_vol(Tnm);

Pvol        = Tvol;
Pvol.dim(4) = spm_type('float');
Pvol.fname  = strrep(Tvol.fname,'spmT','spm_nltP');
if strcmp(Pvol.fname,Tvol.fname)
   Pvol.fname = fullfile(spm_str_manip(Tvol.fname,'H'), ...
                         ['nltP' spm_str_manip(Tvol.fname,'t')]);

Pvol = spm_create_vol(Pvol);

for i=1:Pvol.dim(3),
   img         = spm_slice_vol(Tvol,spm_matrix([0 0 i]),Tvol.dim(1:2),0);
   img(img==0) = NaN;
   tmp         = find(isfinite(img));
   if ~isempty(tmp)
       % Create map of P values
       %img(tmp)  = (max(eps,1-spm_Tcdf(img(tmp),df)));

       % Create map of -log10(P values)
       img(tmp)  = -log10(max(eps,1-spm_Tcdf(img(tmp),df)));
   Pvol        = spm_write_plane(Pvol,img,i);


SPM2 Gem 3: Finding p–value and statistics for all voxels

(Note: The program in this email was corrected; I have added the corrections to this message. Also, an additional typo was discovered in Sep 2003 and was fixed.)

Subject: Re: tabulate all voxels of a volume or cluster
From: John Ashburner <john@FIL.ION.UCL.AC.UK>
Date: Thu, 27 Mar 2003 14:26:56 +0000 (09:26 EST)

> Is there a possibility to tabulate the p-values and statistics for all
> voxels for the entire volume. (not only the peaks) ?
> Or which data file should I readout to get the desired
> values?

Copy and paste the following into Matlab, and select the appropriate
spmT or spmF images.  The first 3 columns are MNI coordinates.  The
fourth is the statistic.  I haven't included any p-values, but this
would be a relatively simple operation, provifing you can figure out
degres of freedom etc.  Use spm_Tcdf.m or spm_Fcdf.m to do this.

 P=spm_get(1,'*.img','Select statistic image');

 [x,y,z] = ndgrid(1:V.dim(1),1:V.dim(2),0);
 for i=1:V.dim(3),
   z   = z + 1;
   tmp = spm_sample_vol(V,x,y,z,0);
   msk = find(tmp~=0 & finite(tmp));
   if ~isempty(msk),
     tmp = tmp(msk);
     xyz1=[x(msk)'; y(msk)'; z(msk)'; ones(1,length(msk))];
     for j=1:length(tmp),
       fprintf('%.4g %.4g %.4g\t%g\n',xyzt(1,j),xyzt(2,j),xyzt(3,j),tmp(j));

Best regards,

SPM2 Gem 2: Making your own MINC SPM2 templates

Subject: Re: FDP template --- SPM99 version
From: John Ashburner <john@FIL.ION.UCL.AC.UK>
Date: Thu, 27 Mar 2003 16:53:03 +0000 (11:53 EST)

> Those who use the FDG template should know that is was created for SPM99,
> and is thus in the standard orientation for that program, which is the
> opposite from that used in SPM2b.
> I believe that John Ashburner has agreed to convert to MINC format for use
> in SPM2b.

Converting from SPM99 to SPM2b templates can be pretty easy. In this case, the
command was (all one line):

rawtominc -transverse -short -signed -range 0 32767 -real_range 0 32767
-orange 0 32767 -xstep 2 -ystep 2 -zstep 2 -xstart -90 -ystart -126
-zstart -72 -xdircos 1 0 0 -ydircos 0 1 0 -zdircos 0 0 1 -pet FDG.mnc
91 109 91 < template_FDG_PET_OSEM_seg.img

The converted template can be downloaded from:

rawtominc can be obtained from:

Note that the simple conversion only applies to SPM99 templates in
Analyze format. If you do the same with SPM2b generated templates,
then you will need to do a left-right flip to them first.

Best regards,

SPM2 Gem 1: Transformation Matricies in SPM2 vs SPM99

Subject: Re: spm2b: spm_header_edit.m
From: John Ashburner <john@FIL.ION.UCL.AC.UK>
Date: Fri, 7 Feb 2003 19:09:38 +0000 (14:09 EST)

> Following your previous answer it looks like the origin is indeed set to
> the new value in the header, but also the  .mat file is written. In this
> file, I find two matrices: M and mat. I noticed that they are identical if
> defaults.analyze.flip = 0 but if defaults.analyze.flip = 1 one of them is
> flipped (M(1,4)=-mat(1,4)). Why are there two transformation matrices?

Backwards compatibility.  The M variable is for compatibility with SPM99,
whereas the mat variable is the one used for SPM2.  Images produced by
SPM2b that have a .mat file should be compatible between analyses with
different defaults.analyze.flip settings.  In other words, reading the
orientation of images with .mat files containing the mat field does not
require identifying the value of defaults.analyze.flip.  However, if the
orientation etc is read from an SPM99 .mat file, or from the .hdr, then
the defaults.analyze.flip variable is consulted.

If a .mat file exists, then it is read, otherwise the relevant information
is taken from the .hdr and defaults.analyze.flip.  If a mat variable exists
in the mat file then it is used, otherwise the orientation is derived from
the M variable and defaults.analyze.flip.

Best regards,

Search this blog


Most recent comments

  • I love this quote: "Complete reporting of results, i.e. filing of statistical maps in public reposit… by Kevin Black on this entry
  • Taylor: I've just quickly scanned the BrainVoyager documentation, and it appears that the Cluster–Le… by Thomas Nichols on this entry
  • Cindy, I can see you didn't like my comments but I didn't get based on what you deemed them outrageo… by Yolanda on this entry
  • Thomas, Could you comment on the applicability of your findings to BrainVoyager's Cluster–Level Stat… by Taylor on this entry
  • Here is a sample of recent corrections from PNAS, collated by Mike Angstadt. Correction for Crockett… by Thomas Nichols on this entry

Blog archive

RSS2.0 Atom
Not signed in
Sign in

Powered by BlogBuilder