spm_compare_families.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. function [family,model] = spm_compare_families (lme,family)
  2. % Bayesian comparison of model families for group studies
  3. % FORMAT [family,model] = spm_compare_families (lme,family)
  4. %
  5. % INPUT:
  6. %
  7. % lme - array of log model evidences
  8. % rows: subjects
  9. % columns: models (1..N)
  10. %
  11. % family - data structure containing family definition and inference parameters:
  12. % .infer='RFX' or 'FFX' (default)
  13. % .partition [1 x N] vector such that partition(m)=k signifies that
  14. % model m belongs to family k (out of K) eg. [1 1 2 2 2 3 3]
  15. % .names cell array of K family names eg, {'fam1','fam2','fam3'}
  16. % .Nsamp RFX only: Number of samples to get (default=1e4)
  17. % .prior RFX only: 'F-unity' alpha0=1 for each family (default)
  18. % or 'M-unity' alpha0=1 for each model (not advised)
  19. %
  20. % OUTPUT:
  21. %
  22. % family - RFX only:
  23. % .alpha0 prior counts
  24. % .exp_r expected value of r
  25. % .s_samp samples from posterior
  26. % .xp exceedance probs
  27. % - FFX only:
  28. % .prior family priors
  29. % .post family posteriors
  30. %
  31. % model - RFX only:
  32. % .alpha0 prior counts
  33. % .exp_r expected value of r
  34. % .r_samp samples from posterior
  35. % - FFX only:
  36. % .subj_lme log model ev without subject effects
  37. % .prior model priors
  38. % .like model likelihoods
  39. % (likelihood scaled to unity for most
  40. % likely model)
  41. % .posts model posteriors
  42. %
  43. %__________________________________________________________________________
  44. % Copyright (C) 2009 Wellcome Trust Centre for Neuroimaging
  45. % Will Penny
  46. % $Id: spm_compare_families.m 6052 2014-06-17 09:38:13Z will $
  47. try
  48. infer=family.infer;
  49. catch
  50. disp('Error in spm_compare_families: inference method not specified');
  51. return
  52. end
  53. try
  54. partition=family.partition;
  55. catch
  56. disp('Error in spm_compare_families: partition not specified');
  57. return
  58. end
  59. try
  60. names=family.names;
  61. catch
  62. disp('Error in spm_compare_families: names not specified');
  63. return
  64. end
  65. if strcmp(infer,'RFX')
  66. try
  67. Nsamp=family.Nsamp;
  68. catch
  69. Nsamp=1e4;
  70. family.Nsamp=Nsamp;
  71. end
  72. try
  73. prior=family.prior;
  74. catch
  75. prior='F-unity';
  76. family.prior='F-unity';
  77. end
  78. end
  79. % Number of models
  80. N=length(partition);
  81. % Number of families in partition
  82. K=length(unique(partition));
  83. % Size of families
  84. for i=1:K,
  85. ind{i}=find(partition==i);
  86. fam_size(i)=length(ind{i});
  87. end
  88. if strcmp(infer,'FFX')
  89. family.prior = [];
  90. % Family priors
  91. for i=1:K,
  92. family.prior(i)=1/K;
  93. end
  94. % Model priors
  95. for i=1:N,
  96. model.prior(i)=1/fam_size(partition(i));
  97. end
  98. slme=sum(lme,1);
  99. slme=slme-(max(slme,[],2))*ones(1,N);
  100. % Model likelihoods
  101. model.subj_lme=slme;
  102. model.like=exp(slme);
  103. % Model posterior
  104. num=model.prior.*model.like;
  105. model.post=num/sum(num);
  106. % Family posterior
  107. for i=1:K,
  108. family.like(i)=sum(model.like(ind{i}));
  109. family.post(i)=sum(model.post(ind{i}));
  110. end
  111. return;
  112. end
  113. % Set model priors
  114. switch prior,
  115. case 'F-unity',
  116. for i=1:K,
  117. model.alpha0(ind{i})=1/fam_size(i);
  118. end
  119. family.alpha0=ones(1,K);
  120. case 'M-unity',
  121. model.alpha0=ones(1,N);
  122. for i=1:K,
  123. family.alpha0(i)=fam_size(i);
  124. end
  125. otherwise
  126. disp('Error in spm_compare_families:Unknown prior');
  127. end
  128. % Get model posterior
  129. [exp_r,xp,r_samp,g_post]=spm_BMS_gibbs(lme,model.alpha0,Nsamp);
  130. model.exp_r=exp_r;
  131. model.xp=xp;
  132. model.r_samp=r_samp;
  133. model.g_post=g_post;
  134. % Get stats from family posterior
  135. for i=1:K,
  136. ri=r_samp(:,ind{i});
  137. family.s_samp(:,i)=sum(ri,2);
  138. family.exp_r(i)=mean(family.s_samp(:,i));
  139. end
  140. % Family exceedence probs
  141. xp = zeros(1,K);
  142. r=family.s_samp;
  143. [y,j]=max(r,[],2);
  144. tmp=histc(j,1:K)';
  145. family.xp=tmp/Nsamp;