Hierarchical Bayesian Modelling Improves Microstructural Parameter Mapping in Diffusion and Exchange MRI Data.
The 10 matches
- [1] § Methods › Data › DKI › Human Connectom Project Data ↔ dmipy/data/saved_data.py, lines 58–81 · score 0.93 · WU Minn Consortium, Washington University, Neuroscience Research, NIH Blueprint, McDonnell, U54MH091657
- [2] § Methods › Model Fitting › Hierarchical Bayesian Estimation ↔ examples/example_axr_simulated_data.m, lines 1–54 · score 0.69 · BBB FEXI, regional priors, LSQ fit, Matlab, burn, bounds
- [3] § Methods › Data › DKI › Human Connectom Project Data ↔ dmipy/tissue_response/white_matter_response.py, lines 79–214 · score 0.68 · MRtrix, selecting voxels, gradient directions, FA, tensor, anisotropy
- [4] § Methods › Model Fitting › Hierarchical Bayesian Estimation ↔ examples/example_dki_simulated_data.m, lines 1–56 · score 0.60 · regional priors, LSQ fit, Matlab, DKI, burn, bounds
- [5] § Methods › Exemplar Microstructure Models › BBB‐FEXI ↔ fexi_fit.m, lines 36–136 · score 0.57 · encoding block, extravascular, intravascular, FEXI, filter, diffusion
- [6] § Methods › Data › BBB‐FEXI › Simulations ↔ examples/example_axr_simulated_data.m, lines 56–97 · score 0.56 · Gaussian noise, complex signal, noisy, gradient directions, zero, Simulations
- [7] § Methods › Background: A General Hierarchical Bayesian Microstructure Model ↔ examples/example_axr_simulated_data.m, lines 1–54 · score 0.54 · blood brain barrier, BBB, exchange, FEXI, Bayesian, signal
- [8] § Methods › Exemplar Microstructure Models › BBB‐FEXI ↔ fexi_sim.m, lines 30–108 · score 0.54 · diffusion encoding block, FEXI, filter, mixing, weighted, signal
- [9] § Full Derivation of the General Hierarchical Bayesian Microstructure Model › Parameter Transforms ↔ fit_bayes.py, lines 379–438 · score 0.53 · Metropolis Hastings, transformed parameter, Gibbs
- [10] § Full Derivation of the General Hierarchical Bayesian Microstructure Model › Parameter Transforms ↔ fit_bayes.m, lines 152–213 · score 0.53 · Metropolis Hastings, transformed parameter, Gibbs
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
MATLAB · 270 lines · 12 KB · MIT · 3 matches
- %=========================================================================%
- %
- % Created on Thu, 21 Nov 2024
- % author: E Powell
- %
- % Simulate data (BBB-FEXI [1], AXR model [2])
- %
- % [1] E Powell, Y Ohene, M Battiston, BR Dickie, LM Parkes, GJM Parker.
- % "Blood-brain barrier water exchange measurements using FEXI: Impact
- % of modeling paradigm and relaxation time effects". MRM, (2023).
- % doi: 10.1002/mrm.29616
- %
- % [2] S Lasic, M Nilsson, J Latt, F Stahlberg, D Topgaard. "Apparent
- % exchange rate mapping with diffusion MRI". MRM. (2011)
- % doi: 10.1002/mrm.22782
- %
- %=========================================================================%
- clearvars -except SNR nsteps nroifit; clc; warning('off')
- %------------------------ USER DEFINED PARAMETERS ------------------------%
- basedir = fullfile('/home','epowell','code','matlab','matlab-bayesian'); % path to matlab-bayesian code directory
- % nsteps = 1e5; % no. MCMC steps
- burn_in = round(nsteps/2); % no. of steps to discard (burn-in)
- nupdates = 100; % how often weights are updated
- % nroifit = 2; % no. regional priors
- % SNR = 20; % SNR in bf=0, tm=min, be=0 data
- nsa = 6; % no. gradient directions + no. signal averages
- ninit = 25; % no. initial values for LSQ fit
- useparpool = 1; % use Matlab parallel pool for LSQ fit (1 yes; 0 no)
- saveflag = 1; % save output (1 yes; 0 no)
- plotflag = 0; % plot output (1 yes; 0 no)
- %-------------------------------------------------------------------------%
- % fitting bounds
- lb = [0.1e-9 0 0]; % [D, sigma, AXR] (SI units)
- ub = [3.5e-9 1 50]; % [D, sigma, AXR] (SI units)
- % load FEXI acqusition scheme (spherical mean scheme)
- loadloc = fullfile(basedir,'data');
- bf = read_text_files(fullfile(loadloc,'sim_axr.bvalf'));
- tm = read_text_files(fullfile(loadloc,'sim_axr.tm'));
- be = read_text_files(fullfile(loadloc,'sim_axr.bval'));
- bvecs = read_text_files(fullfile(loadloc,'sim_axr.bvec'));
- % load test data
- load(fullfile(loadloc,'sim_axr_data.mat')) % vars: adc, axr, mask, nvox, nx, ny, rois, sig
- if saveflag
- saveloc = loadloc;
- % savenm = ['sim_axr_fit__',char(datetime('now','Format','yyyy-MM-dd_HH-mm-SS'))];
- savenm = ['axr_snr',num2str(SNR),'_nsteps',num2str(nsteps),'_nroi',num2str(nroifit),char(datetime('now','Format','__yyyy-MM-dd_HH-mm-SS'))];
- fprintf('Saving to %s\n\n',fullfile(saveloc,savenm))
- end
- %% generate signals (noise free & noisy)
- E_nfree = zeros(nvox,numel(bf),nsa);
- E_noisy = zeros(nvox,numel(bf),nsa);
- for i = 1:nvox
- for j = 1:nsa
- E_nfree(i,:,j) = axr_sim(adc(i),sig(i),axr(i),bf(:),be(:),tm(:));
- % add Gaussian noise to complex signal (only necessary if min. SNR ~< 2)
- re = E_nfree(i,:,j) + (1/SNR)*randn(1,numel(bf));
- im = zeros(1,numel(bf)) + (1/SNR)*randn(1,numel(bf));
- E_noisy(i,:,j) = abs(re + 1i*im);
- % E_noisy(i,:,j) = E_nfree(i,:,j) + (1/SNR).*randn(1,numel(bf));
- end
- end
- fprintf('\n SNR set in 1 b0 = %.0f\n SNR in bf=min,tm=min,b=min = %.0f\n SNR in bf=max,tm=max,b=max = %.0f\n',...
- SNR,...
- mean(E_noisy(:,bf==min(bf)&tm==min(tm)&be==min(be)),1)/std(E_noisy(:,bf==min(bf)&tm==min(tm)&be==min(be),1)),...
- mean(E_noisy(:,bf==max(bf)&tm==max(tm)&be==max(be)),1)/std(E_noisy(:,bf==max(bf)&tm==max(tm)&be==max(be),1)))
- % figure, subplot(1,2,1), plot(repmat(be,[1 nsa]),squeeze(E_noisy(1,:,:)),'bo', repmat(be,[1 nsa]),squeeze(E_nfree(1,:,:)),'g*'), axis square, set(findobj(gca,'type','line'),'LineWidth',2,'markersize',8)
- % "spherically average" the simulated data
- E_nfree = mean(E_nfree,3);
- E_noisy = mean(E_noisy,3);
- fprintf('\n SNR averaged for %i gradient directions = %.0f\n SNR in bf=min,tm=min,b=min = %.0f\n SNR in bf=max,tm=max,b=max = %.0f\n\n',...
- nsa,...
- SNR*sqrt(nsa),...
- mean(E_noisy(:,bf==min(bf)&tm==min(tm)&be==min(be)))/std(E_noisy(:,bf==min(bf)&tm==min(tm)&be==min(be))),...
- mean(E_noisy(:,bf==max(bf)&tm==max(tm)&be==max(be)))/std(E_noisy(:,bf==max(bf)&tm==max(tm)&be==max(be))))
- % subplot(1,2,2), plot(be,E_noisy(1,:),'bo', be,E_nfree(1,:),'g*'), axis square, set(findobj(gca,'type','line'),'LineWidth',2,'markersize',8)
- %{
- test_SNR=10; test_nsa=1;
- n = 1e6;
- test_nfree = ones(1,n);
- re = test_nfree + (1/(test_SNR*sqrt(test_nsa)))*randn(1,n);
- im = zeros(1,n) + (1/(test_SNR*sqrt(test_nsa)))*randn(1,n);
- test_noisy = abs(re + 1i*im);
- [SNR*sqrt(nsa) mean(test_noisy)/std(test_noisy)]
- % figure, axis square, hold on
- histogram(test_noisy,100)
- %}
- %% LSQ fitting
- % use "ninit" initialisations for LSQ fit
- lsq_fit = struct;
- lsq_fit.adc = zeros(nvox,1);
- lsq_fit.sigma = zeros(nvox,1);
- lsq_fit.axr = zeros(nvox,1);
- init = [linspace(lb(1),ub(1),round(ninit^(1/3)))',...
- linspace(lb(2),ub(2),round(ninit^(1/3)))',...
- linspace(lb(3),ub(3),round(ninit^(1/3)))']; % D, sigma, AXR
- init = combvec(init(:,1)',init(:,2)',init(:,3)')';
- tic
- if useparpool, mypool = parpool(4); end
- for i = 1:nvox
- display_progress(i,nvox,i==1)
- if mask(i)
- [lsq_fit.adc(i), lsq_fit.sigma(i), lsq_fit.axr(i)] ...
- = axr_fit(bf(:), be(:), tm(:), E_noisy(i,:), init, lb, ub, useparpool);
- end
- end
- if useparpool, delete(mypool), end
- t_lsq = toc;
- fprintf('Time for LSQ fit: %.2f min\n',t_lsq/60)
- % predict signals from LSQ fit
- E_fit_lsq = zeros(nvox,numel(bf));
- for i = 1:nvox
- E_fit_lsq(i,:) = axr_sim(lsq_fit.adc(i),lsq_fit.sigma(i),lsq_fit.axr(i),bf(:),be(:),tm(:));
- end
- %% HBM fitting
- t = tic;
- % setup model (dmipy-style)
- model = [];
- model.partial_volume_names = {};
- model.parameter_cardinality.adc = 1;
- model.parameter_cardinality.sigma = 1;
- model.parameter_cardinality.axr = 1;
- model.parameter_names = {'adc','sigma','axr'};
- model.parameter_ranges.adc = [lb(1) ub(1)]*1e9;
- model.parameter_ranges.sigma = [lb(2) ub(2)];
- model.parameter_ranges.axr = [lb(3) ub(3)];
- model.parameter_scales.adc = 1e-9;
- model.parameter_scales.sigma = 1;
- model.parameter_scales.axr = 1;
- model.parameter_fixed.adc = 0;
- model.parameter_fixed.sigma = 0;
- model.parameter_fixed.axr = 0;
- model.simulate_signal = @(scheme,pvec) arrayfun(@(i) axr_sim(pvec.adc(i),pvec.sigma(i),pvec.axr(i),scheme.bf(:),scheme.bvalues(:),scheme.tm(:)), 1:numel(pvec.adc), 'UniformOutput',false);
- % setup acquisition scheme (dmipy-style)
- acq_scheme = struct;
- acq_scheme.bf = bf;
- acq_scheme.tm = tm;
- acq_scheme.bvalues = be;
- acq_scheme.gradient_directions = bvecs;
- % setup parameter vector (dmipy-style)
- parameter_vector_init = struct;
- parameter_vector_init.adc = lsq_fit.adc*1e9;
- parameter_vector_init.sigma = lsq_fit.sigma;
- parameter_vector_init.axr = lsq_fit.axr;
- if nroifit == 1
- rois = logical(rois);
- else
- % do nothing: rois = rois.
- end
- % run Bayesian fitting
- [params_all, ~, ~, stats_posterior, stats_prior] ...
- = fit_bayes(model, acq_scheme, E_noisy, parameter_vector_init, [], rois, nsteps, burn_in, nupdates, 0);
- t_hbm = toc(t);
- fprintf('Time for HBM fit: %.2f min\n',t_hbm/60)
- % NOTE: stats_posterior.(param).mn and params_all.(param) may be slightly
- % different (<0.1%) as params_all calculated over all MCMC steps post
- % burn-in, but stats_posterior calculated over a subsampled set of steps
- % post burn-in (for memory reasons)
- % predict signals from Bayesian fit
- E_fit_bayes = cell2mat(model.simulate_signal(acq_scheme, params_all))';
- % save
- if saveflag
- fprintf('Saving...')
- save(fullfile(saveloc,[savenm,'.mat']),'-v7.3')
- fprintf('Done.\n\n')
- end
- %% plotting
- if plotflag
- % plot parameter maps
- figure
- nr = 3; nc = 3;
- col_adc = autumn;
- col_sig = hot;
- col_axr = parula;
- lb_plot = lb; ub_plot = ub;
- % plot GT
- tmp = reshape(adc*1e9,[nx,ny]); h = subplot(nr,nc,1); imagesc(tmp) % plot fitted D
- clim([lb_plot(1) ub_plot(1)]*1e9), colorbar, colormap(h,col_adc)
- title('D (GT)'), set(get(colorbar,'label'),'string','[um^2/mm]'), axis image off
- tmp = reshape(sig,[nx,ny]); h = subplot(nr,nc,2); imagesc(tmp) % plot fitted sigma
- clim([lb_plot(2) ub_plot(2)]), colorbar, colormap(h,col_sig)
- title('\sigma (GT)'), set(get(colorbar,'label'),'string','[a.u.]'), axis image off
- tmp = reshape(axr,[nx,ny]); h = subplot(nr,nc,3); imagesc(tmp) % plot fitted AXR
- clim([lb_plot(3) ub_plot(3)]), colorbar, colormap(h,col_axr)
- title('AXR (GT)'), set(get(colorbar,'label'),'string','[s^{-1}]'), axis image off
- % plot LSQ fit
- tmp = reshape(lsq_fit.adc*1e9,[nx,ny]); h = subplot(nr,nc,4); imagesc(tmp) % plot fitted D
- clim([lb_plot(1) ub_plot(1)]*1e9), colorbar, colormap(h,col_adc)
- title('D (LSQ)'), set(get(colorbar,'label'),'string','[um^2/mm]'), axis image off
- tmp = reshape(lsq_fit.sigma,[nx,ny]); h = subplot(nr,nc,5); imagesc(tmp) % plot fitted sigma
- clim([lb_plot(2) ub_plot(2)]), colorbar, colormap(h,col_sig)
- title('\sigma (LSQ)'), set(get(colorbar,'label'),'string','[a.u.]'), axis image off
- tmp = reshape(lsq_fit.axr,[nx,ny]); h = subplot(nr,nc,6); imagesc(tmp) % plot fitted AXR
- clim([lb_plot(3) ub_plot(3)]), colorbar, colormap(h,col_axr)
- title('AXR (LSQ)'), set(get(colorbar,'label'),'string','[s^{-1}]'), axis image off
- % plot Bayesian fit
- tmp = reshape(params_all.adc*1e9,[nx,ny]); h = subplot(nr,nc,7); imagesc(tmp) % plot fitted D
- clim([lb_plot(1) ub_plot(1)]*1e9), colorbar, colormap(h,col_adc)
- title('D (HBM)'), set(get(colorbar,'label'),'string','[um^2/mm]'), axis image off
- tmp = reshape(params_all.sigma,[nx,ny]); h = subplot(nr,nc,8); imagesc(tmp) % plot fitted sigma
- clim([lb_plot(2) ub_plot(2)]), colorbar, colormap(h,col_sig)
- title('\sigma (HBM)'), set(get(colorbar,'label'),'string','[a.u.]'), axis image off
- tmp = reshape(params_all.axr,[nx,ny]); h = subplot(nr,nc,9); imagesc(tmp) % plot fitted AXR
- clim([lb_plot(3) ub_plot(3)]), colorbar, colormap(h,col_axr)
- title('AXR (HBM)'), set(get(colorbar,'label'),'string','[s^{-1}]'), axis image off
- % plot correlations with GT
- figure
- nr = 1; nc = 3;
- col_lsq = 'r';
- col_hbm = 'b';
- % D
- subplot(nr,nc,1), hold on
- plot(adc(:)*1e9,lsq_fit.adc(:)*1e9,'o','color',col_lsq) % plot LSQ fit
- plot(adc(:)*1e9,params_all.adc(:)*1e9,'o','color',col_hbm) % plot HBM fit
- plot([lb_plot(1) ub_plot(1)]*1e9, [lb_plot(1) ub_plot(1)]*1e9, 'k--') % identity line
- xlim([.7 1.6]), ylim([.7 1.6]), axis square
- legend('LSQ','HBM'), xlabel('D_{gt} [um^2/mm]'), ylabel('D_{fit} [um^2/mm]')
- % sigma
- subplot(nr,nc,2), hold on
- plot(sig(:),lsq_fit.sigma(:),'o','color',col_lsq) % plot LSQ fit
- plot(sig(:),params_all.sigma(:),'o','color',col_hbm) % plot HBM fit
- plot([lb_plot(2) ub_plot(2)], [lb_plot(2) ub_plot(2)], 'k--') % identity line
- xlim([0.05 .3]), ylim([0.05 .3]), axis square
- legend('LSQ','HBM'), xlabel('\sigma_{gt} [a.u.]'), ylabel('\sigma_{fit} [a.u.]')
- % AXR
- subplot(nr,nc,3), hold on
- plot(axr(:),lsq_fit.axr(:),'o','color',col_lsq), hold on % plot LSQ fit
- plot(axr(:),params_all.axr(:),'o','color',col_hbm) % plot HBM fit
- plot([lb_plot(3) ub_plot(3)], [lb_plot(3) ub_plot(3)], 'k--') % identity line
- xlim([0 4]), ylim([lb_plot(3) ub_plot(3)]), axis square
- legend('LSQ','HBM'), xlabel('AXR_{gt} [s^{-1}]'), ylabel('AXR_{fit} [s^{-1}]')
- end
example_axr_simulated_data.m at commit 743ae00, under MIT · at the source
Overview
- Department of Medical Physics and Biomedical Engineering, University College London, London, UK
- Lancaster Medical School, Lancaster University, Lancaster, UK
- Department of Neurology, Lancashire Teaching Hospitals NHS Foundation Trust, Preston, UK
- Division of Psychology, Communication and Human Neuroscience, School of Health Sciences, Faculty of Biology, Medicine and Health, University of Manchester, Manchester, UK
- Geoffrey Jefferson Brain Research Centre, Faculty of Biology, Medicine and Health, University of Manchester, Manchester, UK
- Bioxydyn Limited, Manchester, UK
- Cardiff University Brain Research Imaging Centre, School of Psychology, Cardiff University, Cardiff, UK
- School of Computer Science and Informatics, Cardiff University, Cardiff, UK
Abstract
Microstructure modelling quantifies subvoxel tissue features by combining an MRI acquisition with a mathematical model, which is typically fitted voxel‐by‐voxel with least‐squares (LSQ) minimisation to give voxelwise maps of microstructural quantities such as diffusivity and compartmental fractions. Such approaches are susceptible to voxelwise noise, which can lead to erroneous values in parameter maps. Hierarchical Bayesian modelling (HBM) can address this limitation but has only been demonstrated for simple models. We previously derived an HBM approach for an arbitrary microstructure model with flexible parameter constraints, utilising a Markov chain Monte Carlo algorithm for parameter estimation; here, the method is demonstrated and evaluated using simulated and human data for two previously unexplored diffusion MRI techniques, namely, diffusion kurtosis imaging and blood–brain barrier filter exchange imaging. When compared with LSQ minimisation, HBM increased the accuracy, precision, contrast‐to‐noise ratio and parameter map quality in both simulated and human data. HBM was also able to resolve local parameter variations associated with white matter lesions in a small sample of cerebral small vessel disease subjects, which were obscured by high noise levels in the LSQ‐derived parameter maps. Finally, a noise sensitivity assessment in simulations showed that HBM improved the contrast‐to‐noise ratio and parameter map quality even at low signal‐to‐noise ratios. This generalised HBM framework can improve parameter estimation for more complex diffusion MRI microstructural models that extend beyond linear combinations of exponentials.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 10 matches between paragraphs and lines of code.
e-powell/hbm-matlab
743ae00a87339a3619503adcda0d4774aaab73d2, 19 June 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
26 files
- adc_fit.m, MATLAB, 130 lines
- adc_sim.m, MATLAB, 28 lines
- axr_fit.m, MATLAB, 126 lines
- axr_sim.m, MATLAB, 30 lines
- compute_log_likelihood.m
, MATLAB, 83 lines - create_dict.m, MATLAB, 21 lines
- display_progress.m, MATLAB, 34 lines
- examples/
example_axr_simulated_da , MATLAB, 270 lines, 3 matchesta.m - examples/
example_dki_simulated_da , MATLAB, 242 lines, 1 matchta.m - fexi_fit.m, MATLAB, 201 lines, 1 match
- fexi_sim.m, MATLAB, 108 lines, 1 match
- fit_bayes.m, MATLAB, 510 lines, 1 match
- load_untouch_nii_gz.m, MATLAB, 153 lines
- logmvnpdf.m, MATLAB, 21 lines
- msdki_fit.m, MATLAB, 140 lines
- msdki_sim.m, MATLAB, 29 lines
- order.m, MATLAB, 9 lines
- parameter_vector_to_para
meters.m , MATLAB, 22 lines - parameters_to_parameter_
vector.m , MATLAB, 25 lines - read_text_files.m, MATLAB, 57 lines
- select_voxels.m, MATLAB, 44 lines
- struct2array.m, MATLAB, 14 lines
- tform_params.m, MATLAB, 94 lines
- useful_functions.m, MATLAB, 256 lines
- LICENSE, License, 21 lines
- README.md, Text, 21 lines
e-powell/hbm-dmipy
a6643b4367b8a70aca2084d7b9230fdd95adb3c6, 26 November 2024Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
125 files
- .ipynb_checkpoints/
bayesian-fitting-HCP-exa , Jupyter, 352 linesmple-checkpoint.ipynb - .ipynb_checkpoints/
bayesian-fitting-simulat , Jupyter, 414 linesed-examples-checkpoint.i pynb - .ipynb_checkpoints/
fit-models-inf-checkpoin , Jupyter, 1 linet.ipynb - dmipy/
__init__.py , Python, 10 lines - dmipy/
core/ , Python, 7 lines__init__.py - dmipy/
core/ , Python, 925 linesacquisition_scheme.py - dmipy/
core/ , Python, 6 linesconstants.py - dmipy/
core/ , Python, 899 linesfitted_modeling_framewor k.py - dmipy/
core/ , Python, 65 linesgradient_conversions.py - dmipy/
core/ , Python, 2,235 linesmodeling_framework.py - dmipy/
core/ , Python, 203 linessignal_model_properties. py - dmipy/
core/ , Python, 232 linestests/ test_acquisition_scheme. py - dmipy/
core/ , Python, 269 linestests/ test_csd_equivalence_par ametric_distributions.py - dmipy/
core/ , Python, 169 linestests/ test_equivalence_with_mo nte_carlo.py - dmipy/
core/ , Python, 87 linestests/ test_fitted_model_proper ties.py - dmipy/
core/ , Python, 151 linestests/ test_multi_tissue_models .py - dmipy/
core/ , Python, 296 linestests/ test_optimization.py - dmipy/
core/ , Python, 109 linestests/ test_raises_multicompart ment_input.py - dmipy/
core/ , Python, 106 linestests/ test_spherical_mean_mode ls.py - dmipy/
custom_optimizers/ , Python, 3 lines__init__.py - dmipy/
custom_optimizers/ , Python, 80 linesintra_voxel_incoherent_m otion.py - dmipy/
custom_optimizers/ , Python, 124 linessingle_shell_three_tissu e_csd.py - dmipy/
data/ , Python, 4 lines__init__.py - dmipy/
data/ , Python, 116 linessaved_acquisition_scheme s.py - dmipy/
data/ , Python, 376 lines, 1 matchsaved_data.py - dmipy/
data/ , Python, 13 linestests/ test_saved_data.py - dmipy/
distributions/ , Python, 4 lines__init__.py - dmipy/
distributions/ , Python, 996 linesdistribute_models.py - dmipy/
distributions/ , Python, 577 linesdistributions.py - dmipy/
distributions/ , Python, 96 linestests/ test_bingham.py - dmipy/
distributions/ , Python, 223 linestests/ test_distribute_models.p y - dmipy/
distributions/ , Python, 23 linestests/ test_distributed_model_r aises.py - dmipy/
distributions/ , Python, 59 linestests/ test_watson.py - dmipy/
hcp_interface/ , Python, 1 line__init__.py - dmipy/
hcp_interface/ , Python, 139 linesdownloader_aws.py - dmipy/
optimizers/ , Python, 5 lines__init__.py - dmipy/
optimizers/ , Python, 136 linesamico_cvxpy.py - dmipy/
optimizers/ , Python, 395 linesbrute2fine.py - dmipy/
optimizers/ , Python, 312 linesmix.py - dmipy/
optimizers/ , Python, 64 linesmulti_tissue_convex_opti mizer.py - dmipy/
optimizers/ , Python, 210 linestests/ test_amico.py - dmipy/
optimizers_fod/ , Python, 1 line__init__.py - dmipy/
optimizers_fod/ , Python, 205 linescsd_cvxpy.py - dmipy/
optimizers_fod/ , Python, 255 linescsd_tournier.py - dmipy/
signal_models/ , Python, 9 lines__init__.py - dmipy/
signal_models/ , Python, 238 linescapped_cylinder_models.p y - dmipy/
signal_models/ , Python, 530 linescylinder_models.py - dmipy/
signal_models/ , Python, 589 linesgaussian_models.py - dmipy/
signal_models/ , Python, 191 linesplane_models.py - dmipy/
signal_models/ , Python, 363 linessphere_models.py - dmipy/
signal_models/ , Python, 123 linestests/ test_callaghan.py - dmipy/
signal_models/ , Python, 25 linestests/ test_dot_and_ball.py - dmipy/
signal_models/ , Python, 61 linestests/ test_gaussian_phase.py - dmipy/
signal_models/ , Python, 86 linestests/ test_soderman.py - dmipy/
signal_models/ , Python, 40 linestests/ test_stick.py - dmipy/
signal_models/ , Python, 38 linestests/ test_zeppelin.py - dmipy/
signal_models/ , Python, 408 linestissue_response_models.p y - dmipy/
tissue_response/ , Python, 4 lines__init__.py - dmipy/
tissue_response/ , Python, 21 linestests/ test_three_tissue_respon se.py - dmipy/
tissue_response/ , Python, 42 linestests/ test_tissue_response_csd .py - dmipy/
tissue_response/ , Python, 148 linestests/ test_tissue_response_mod els.py - dmipy/
tissue_response/ , Python, 64 linestests/ test_tournier_wm_respons e.py - dmipy/
tissue_response/ , Python, 274 linesthree_tissue_response.py - dmipy/
tissue_response/ , Python, 214 lines, 1 matchwhite_matter_response.py - dmipy/
utils/ , Python, 5 lines__init__.py - dmipy/
utils/ , Python, 70 linesconstruct_observation_ma trix.py - dmipy/
utils/ , Python, 87 linesspherical_convolution.py - dmipy/
utils/ , Python, 87 linesspherical_mean.py - dmipy/
utils/ , Python, 31 linestests/ test_constructions_obser vation_matrix.py - dmipy/
utils/ , Python, 17 linestests/ test_coordinate_transfor mations.py - dmipy/
utils/ , Python, 57 linestests/ test_spherical_convoluti on.py - dmipy/
utils/ , Python, 32 linestests/ test_spherical_mean.py - dmipy/
utils/ , Python, 40 linestests/ test_tortuosity_multi_ti ssue.py - dmipy/
utils/ , Python, 481 linesutils.py - dmipy/
version.py , Python, 61 lines - doc/
conf.py , Python, 307 lines - doc/
push.sh , Shell, 33 lines - doc/
sphinxext/ , Python, 570 linesdocscrape.py - doc/
sphinxext/ , Python, 227 linesdocscrape_sphinx.py - doc/
sphinxext/ , Python, 155 linesgithub.py - doc/
sphinxext/ , Python, 63 linesmath_dollar.py - doc/
sphinxext/ , Python, 203 linesnumpydoc.py - doc/
tools/ , Python, 509 linesapigen.py - doc/
tools/ , Python, 64 linesbuildmodref.py - example_hbm_dki_simulate
d_data.py , Python, 165 lines - examples/
example_amico_test.ipynb , Jupyter, 113 lines - examples/
example_axcaliber.ipynb , Jupyter, 291 lines - examples/
example_axcaliber_tempor , Jupyter, 202 linesal_zeppeline.ipynb - examples/
example_ball_and_racket. , Jupyter, 203 linesipynb - examples/
example_ball_and_stick.i , Jupyter, 181 linespynb - examples/
example_ball_and_sticks. , Jupyter, 97 linesipynb - examples/
example_brute_force_opti , Jupyter, 83 linesmization.ipynb - examples/
example_cylinder_models. , Jupyter, 164 linesipynb - examples/
example_diameter_distrib , Jupyter, 56 linesutions.ipynb - examples/
example_gaussian_models. , Jupyter, 115 linesipynb - examples/
example_generalized_csd_ , Jupyter, 78 linesoptimizer.ipynb - examples/
example_generate_camino_ , Jupyter, 1 lineschemefile.ipynb - examples/
example_ivim.ipynb , Jupyter, 213 lines - examples/
example_mix_microstructu , Jupyter, 172 linesre_imaging_in_crossings. ipynb - examples/
example_multi_compartmen , Jupyter, 265 linest_constrained_spherical_ deconvolution.ipynb - examples/
example_multi_compartmen , Jupyter, 209 linest_spherical_mean_techniq ue.ipynb - examples/
example_multi_tissue_con , Jupyter, 211 linesstrained_spherical_decon volution.ipynb - examples/
example_multi_tissue_nod , Jupyter, 152 linesdi.ipynb - examples/
example_noddi_bingham.ip , Jupyter, 265 linesynb - examples/
example_noddi_watson.ipy , Jupyter, 228 linesnb - examples/
example_single_shell_thr , Jupyter, 382 linesee_tissue_csd.ipynb - examples/
example_smt_noddi.ipynb , Jupyter, 204 lines - examples/
example_sphere_models.ip , Jupyter, 83 linesynb - examples/
example_spherical_mean_m , Jupyter, 79 linesodels.ipynb - examples/
example_spherical_mean_t , Jupyter, 199 linesechnique.ipynb - examples/
example_stochastic_mix_o , Jupyter, 133 linesptimization.ipynb - examples/
example_verdict.ipynb , Jupyter, 127 lines - examples/
example_watson_bingham.i , Jupyter, 202 linespynb - examples/
tutorial_combining_bioph , Jupyter, 77 linesysical_models_into_micro structure_model.ipynb - examples/
tutorial_distributed_mod , Jupyter, 125 linesel_representations.ipynb - examples/
tutorial_generalized_mul , Jupyter, 132 linesti_tissue_modeling.ipynb - examples/
tutorial_human_connectom , Jupyter, 36 linese_project_aws.ipynb - examples/
tutorial_imposing_parame , Jupyter, 118 linester_links.ipynb - examples/
tutorial_parameter_casca , Jupyter, 147 linesding_and_simulating_nd_d atasets.ipynb - examples/
tutorial_setting_up_acqu , Jupyter, 104 linesisition_scheme.ipynb - examples/
tutorial_simulating_and_ , Jupyter, 83 linesfitting_using_a_simple_m odel.ipynb - fit_bayes.py, Python, 504 lines, 1 match
- kurtosis_model.py, Python, 85 lines
- LICENSE, License, 20 lines
- README.md, Text, 140 lines
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 147 scripts, each with its path and the digest of its content;
- 10 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- humanconnectome.org/
study/ , at Human Connectome Project; found in the text, “Human Connectom Project Data”hcp-young-adult
Data Availability Statement
The data that support the findings of this study are available on request from the corresponding author. The data are not publicly available due to privacy or ethical restrictions.
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Publisher: n/a → Wiley
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 7 keywords, 9 MeSH terms, 4 funders, 54 references.
Cite
This paper
Powell, E., Maskery, M., Emsley, H. C. A., Parkes, L. M., Parker, G. J. M., & Slator, P. J. (2026). Hierarchical Bayesian Modelling Improves Microstructural Parameter Mapping in Diffusion and Exchange MRI Data. NMR in biomedicine, 39(6), e70277. https://
BibTeX
@article{powell2026hiera
author = {Powell, Elizabeth and Maskery, Mark and Emsley, Hedley C A and Parkes, Laura M and Parker, Geoff J M and Slator, Paddy J},
title = {{Hierarchical Bayesian Modelling Improves Microstructural Parameter Mapping in Diffusion and Exchange MRI Data}},
journal = {NMR in biomedicine},
year = {2026},
month = jun,
volume = {39},
number = {6},
pages = {e70277},
publisher = {Wiley},
issn = {0952-3480},
doi = {10.1002/
url = {https://
pmid = {42115150},
pmcid = {PMC13160881}
}
RIS
TY - JOUR
AU - Powell, Elizabeth
AU - Maskery, Mark
AU - Emsley, Hedley C A
AU - Parkes, Laura M
AU - Parker, Geoff J M
AU - Slator, Paddy J
TI - Hierarchical Bayesian Modelling Improves Microstructural Parameter Mapping in Diffusion and Exchange MRI Data
T2 - NMR in biomedicine
J2 - NMR Biomed
PY - 2026
DA - 2026/
VL - 39
IS - 6
SP - e70277
SN - 0952-3480
PB - Wiley
DO - 10.1002/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1002/
"type": "article-journal",
"title": "Hierarchical Bayesian Modelling Improves Microstructural Parameter Mapping in Diffusion and Exchange MRI Data",
"container-title": "NMR in biomedicine",
"author": [
{
"family": "Powell",
"given": "Elizabeth"
},
{
"family": "Maskery",
"given": "Mark"
},
{
"family": "Emsley",
"given": "Hedley C A"
},
{
"family": "Parkes",
"given": "Laura M"
},
{
"family": "Parker",
"given": "Geoff J M"
},
{
"family": "Slator",
"given": "Paddy J"
}
],
"container-title-short":
"volume": "39",
"issue": "6",
"page": "e70277",
"DOI": "10.1002/
"PMID": "42115150",
"PMCID": "PMC13160881",
"ISSN": "0952-3480",
"publisher": "Wiley",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
1
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s43856-026-01614-6 [code]
- Simulation-based inference at the theoretical limit for fast, robust microstructural MRI with minimal diffusion data.Journal: Communications medicineIn common: DIPY, SciPy, Matplotlib, 1 other tool, computational, structural MRI / diffusion, 8 references
- [2] doi:10.1002/mrm.70514 [code]
- Brain Clearance of Contrast Agent in Intravenous DCE-MRI Is Measurable and Cannot Be Explained by Clearance Across the BBB Alone.Journal: Magnetic resonance in medicineIn common: seaborn, SciPy, Matplotlib, 1 other tool, structural MRI / diffusion, 2 references, 2 authors
- [3] doi:10.1002/hbm.70513 [code]
- Deep Learning Empowered Microstructure Codebook: New Paradigm for Multi-Parameter Tissue Characterization Estimation.Journal: Human brain mappingIn common: DIPY, NumPy, structural MRI / diffusion, 7 references
- [4] doi:10.1162/imag.a.1341 [code]
- Massively parallelized brain tractography using compute clusters, supercomputers, and graphics processing units.Journal: Imaging neuroscience (Cambridge, Mass.)In common: DIPY, Optimization Toolbox, Parallel Computing Toolbox, 5 other tools, structural MRI / diffusion, 3 references
- [5] doi:10.1162/imag.a.1262 [code]
- Frame-wise multi-echo distortion correction for superior functional MRI.Journal: Imaging neuroscience (Cambridge, Mass.)In common: Tools for NIfTI and ANALYZE image (MATLAB), Optimization Toolbox, Parallel Computing Toolbox, 6 other tools, 3 references
- [6] doi:10.1002/mp.70599 [code]
- Accurate estimation of intravoxel incoherent motion parameters based on implicit neural representation.Journal: Medical physicsIn common: NiBabel, SciPy, NumPy, structural MRI / diffusion, 6 references
- [7] doi:10.1038/s41598-026-51531-w [code]
- Multimodal age-dependent diffusion-MRI analysis of the neocortex in a rat model of cortical dysplasia.Journal: Scientific reportsIn common: DIPY, NiBabel, Statistics and Machine Learning Toolbox, 3 other tools, structural MRI / diffusion, 4 references
- [8] doi:10.1038/s41586-026-10631-3 [code]
- A prognostic human brain network for diffuse midline glioma.Journal: NatureIn common: Tools for NIfTI and ANALYZE image (MATLAB), Optimization Toolbox, Parallel Computing Toolbox, 6 other tools, 1 reference
- [9] doi:10.7554/elife.107661 [code]
- In vivo mapping of striatal neurodegeneration in Huntington's disease with Soma and Neurite Density Imaging.Journal: eLifeIn common: Tools for NIfTI and ANALYZE image (MATLAB), Optimization Toolbox, Statistics and Machine Learning Toolbox, structural MRI / diffusion, 6 references
- [10] doi:10.1371/journal.pone.0346132 [code]
- Analysis of cortical dysplasias using b-tensor encoding diffusion MRI in an animal model.Journal: PloS oneIn common: DIPY, NiBabel, Statistics and Machine Learning Toolbox, 3 other tools, structural MRI / diffusion, 4 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 147 scripts, and 10 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:19ec283cf85a7d53…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
