spm_bayes2_logbf.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. function [xCon,SPM]= spm_bayes2_logbf(SPM,XYZ,xCon,ic)
  2. % Compute and write log Bayes factor image
  3. % FORMAT [xCon,SPM]= spm_bayes2_logbf(SPM,XYZ,xCon,ic)
  4. %
  5. % SPM - SPM data structure
  6. % XYZ - voxel list
  7. % xCon - contrast info
  8. % ic - contrast number
  9. %__________________________________________________________________________
  10. % Copyright (C) 2010-2011 Wellcome Trust Centre for Neuroimaging
  11. % Will Penny
  12. % $Id: spm_bayes2_logbf.m 4615 2012-01-10 16:56:25Z will $
  13. %-Compound Contrast
  14. %--------------------------------------------------------------------------
  15. c = xCon(ic).c;
  16. kc = size(c,2);
  17. %-Get posterior beta's
  18. %--------------------------------------------------------------------------
  19. Nk = size(SPM.xX.X,2);
  20. for k=1:Nk
  21. beta(k,:) = spm_get_data(SPM.VCbeta(k),XYZ);
  22. end
  23. %-Get noise hyperparameters
  24. %--------------------------------------------------------------------------
  25. Nh=length(SPM.PPM.l);
  26. for jj = 1:Nh
  27. hyper(jj).l = spm_get_data(SPM.VHp(jj),XYZ);
  28. end
  29. %-Get posterior SD beta's
  30. %--------------------------------------------------------------------------
  31. Nk = size(SPM.xX.X,2);
  32. %-Loop over voxels
  33. %==========================================================================
  34. Nvoxels = size(XYZ,2);
  35. D = NaN(reshape(SPM.xVol.DIM(1:3),1,[]));
  36. prior_cov=c'*SPM.PPM.Cb*c;
  37. a=zeros(kc,1);
  38. spm_progress_bar('Init',100,'Estimating Bayes factor','');
  39. for v=1:Nvoxels
  40. % Reconstruct approximation to voxel wise covariance matrix
  41. Sigma_post = SPM.PPM.Cby;
  42. for jj = 1:Nh,
  43. % Taylor approximation to posterior covariance
  44. Sigma_post = Sigma_post + SPM.PPM.dC{jj}*(hyper(jj).l(v) - SPM.PPM.l(jj));
  45. end
  46. % Get posterior for this voxel
  47. post_mean = c'*beta(:,v);
  48. post_cov = c' * Sigma_post * c;
  49. en=a-post_mean;
  50. iC=inv(post_cov);
  51. logbf = - 0.5*spm_logdet(prior_cov)+0.5*spm_logdet(post_cov)+0.5*en'*iC*en;
  52. D(XYZ(1,v),XYZ(2,v),XYZ(3,v)) = logbf;
  53. if rem(v,100)==0
  54. % update progress bar every 100th voxel
  55. spm_progress_bar('Set',100*v/Nvoxels);
  56. end
  57. end
  58. xCon(ic).eidf=rank(post_cov);
  59. spm_progress_bar('Clear');
  60. %-Create handle
  61. %--------------------------------------------------------------------------
  62. Vhandle = struct(...
  63. 'fname', [sprintf('logbf_%04d',ic) spm_file_ext],...
  64. 'dim', SPM.xVol.DIM',...
  65. 'dt', [spm_type('float32') spm_platform('bigend')],...
  66. 'mat', SPM.xVol.M,...
  67. 'pinfo', [1,0,0]',...
  68. 'descrip',sprintf('Log Bayes factor con %d: %s',ic,xCon(ic).name));
  69. %-Write image
  70. %--------------------------------------------------------------------------
  71. Vhandle = spm_create_vol(Vhandle);
  72. Vhandle = spm_write_vol(Vhandle,D);
  73. xCon(ic).Vcon = Vhandle;
  74. fprintf('%s%30s\n',repmat(sprintf('\b'),1,30),...
  75. sprintf('...written %s',spm_file(Vhandle.fname,'filename'))); %-#