Back to top
Listed below are the data quality metrics that Gannet computes during
data preprocessing, signal fitting, and tissue segmentation.
Linewidth
Linewidth is calculated as the full-width half-maximum (FWHM) (in Hz)
of fitted model signals. When reporting linewidths of datasets, it is
recommended to use the FWHM of tCr or tNAA from the OFF spectrum, or the
FWHM of the water reference (if a water reference is provided).
Signal-to-noise ratio (SNR)
The SNR of fitted signals is calculated as the amplitude of the given
signal model divided by twice the standard deviation of the noise
signal. To estimate the noise signal, Gannet takes two independent
segments of the OFF or DIFF spectrum (as appropriate to the modeled
signal of interest) between 8–9 ppm and 9–10 ppm, and detrends them
using a second-order polynomial function. Detrending is performed to
remove baseline artifacts (often related to the residual water signal).
The standard deviation of each detrended noise segment is then
calculated. The smaller of the two standard deviations is then used as
the estimate of noise, which is then multiplied by 2.
Formulaically, this is defined as:
\[
\mathrm{SNR} =
\frac{A_{\mathrm{metab}}}{2\cdot\mathrm{std}[S_{\mathrm{noise}}(f)]}
\]
where:
\(A_{\mathrm{metab}}\)
Maximum signal model amplitude of the metabolite of
interest
\(S_{\mathrm{noise}}(f)\)
Detrended noise signal between either 8–9 or 9–10 ppm
(whichever yields a lower standard deviation) in the appropriate
spectrum (i.e., either the OFF or DIFF spectrum)
Frequency offsets
To estimate the degree of frequency offsets that result from
scanner-related frequency drift1 and participant motion2 ,
Gannet calculates an average frequency offset3
\(\overline{\Delta\delta_{0}}\) . This
is calculated as the mean (over the course of the acquisition)
difference between the observed frequency of the residual water signal
in the pre-frequency-corrected subspectra and the nominal water
frequency \(\delta_{0}\) at 4.68 ppm
(4.8 ppm for room-temperature phantoms), or the nominal Cr frequency at
3.02 ppm for HERMES acquisitions. It should be noted that using the mean
of offset differences does not fully characterize frequency offsets but
is a useful heuristic.
Formulaically, this is defined as:
\[
\overline{\Delta\delta_{0}} = \frac{1}{M}\sum{\widehat{\delta}_{0,m} -
\delta_{0}}
\] where:
\(m\)
Subspectrum index number, \(m
\in 1, 2, 3, ... M\)
\(\widehat{\delta}_{0,m}\)
Observed water or tCr frequency in subspectrum \(m\)
\(\delta_{0}\)
Nominal water or tCr frequency
Fit error
When fitting signal functions to metabolite peaks, Gannet will also
estimate the error of the fit. This is defined as the standard deviation
of the residuals of the signal model fit divided by the signal model
amplitude and multiplied by 100 to give a percentage.
For metabolite peak fits, this is:
\[
\epsilon_{\mathrm{metab}} =
100\cdot\frac{\mathrm{std}[resid_{\mathrm{metab}}(f)]}{A_{\mathrm{metab}}}
\]
where:
\(resid_{\mathrm{metab}}\)
Fit residuals of signal model for metabolite
\(A_{\mathrm{metab}}\)
Signal model amplitude
Similarly, for reference signal fits, this is:
\[
\epsilon_{\mathrm{ref}} =
100\cdot\frac{\mathrm{std}[resid_{\mathrm{ref}}(f)]}{A_{\mathrm{ref}}}
\]
Since all metabolites are normalized to a reference signal (either
tCr or unsuppressed water) and reported as such, the fit error that
really should be considered (and reported) is the combined error of the
metabolite and reference signal model fits, which add up in
quadrature.
Formulaically, this is defined as:
\[
\epsilon_{\mathrm{metab},\mathrm{ref}} =
\sqrt{\epsilon_{\mathrm{metab}}^2 + \epsilon_{\mathrm{ref}}^2}
\]
Image quality metrics
When segmenting structural images to obtain voxel tissue fractions of
GM, WM, and CSF, Gannet computes several metrics to quantify the quality
of structural images and the segmentation. These are stored in the
MRS_struct.out.QA structure. Several metrics from the MRI
Quality Control tool (MRIQC)4 are computed. More details
are also provided in the MRIQC
documentation .
\(\mathrm{mad}\)
Median absolute deviation
\(\mathrm{med}\)
Median
\(GM\) , \(WM\) , \(CSF\) , \(BG\)
GM, WM, CSF, and air background segmented images
\(\sigma\)
Standard deviation
\(\mathrm{P}_{99.95}\)
99.95th percentile
Coefficient of variation (CV) of GM, WM, and CSF
\[
\mathrm{CV} = \frac{\mathrm{mad}(F)}{\mathrm{med}(F)}
\]
where \(F\) can be GM, WM, or CSF,
\(\mathrm{mad}\) is the median absolute
deviation, and \(\mathrm{med}\) is the
median.
Coefficient of joint variation (CJV)
\[
\mathrm{CJV} = \frac{\mathrm{mad}(WM) +
\mathrm{mad}(GM)}{|\mathrm{med}(WM) + \mathrm{med}(GM)|}
\]
Contrast-to-noise ratio (CNR)
\[
\mathrm{CNR} = \frac{|\mathrm{med}(GM) -
\mathrm{med}(WM)|}{\sqrt{\sigma_{\mathrm{GM}}^{2} +
\sigma_{\mathrm{WM}}^{2} + \sigma_{\mathrm{BG}}^{2}}}
\]
where \(\sigma\) is the standard
deviation of the respective tissue class or background.
SNR of GM, WM, CSF, and total
\[
\mathrm{SNR} = \frac{\mathrm{med}(F)}{\sigma_{F}\sqrt{\frac{n}{n-1}}}
\]
An alternative SNR measure based on Dietrich et al. (2007)5 is
also computed using the background mask that is generated during tissue
segmentation:
\[
\mathrm{SNR_{D}} =
\frac{\mathrm{med}(F)}{\sqrt{\frac{2}{4-\pi}}\mathrm{mad}(BG)}
\]
For both SNR measures, \(F\) can be
GM, WM, or CSF. Total SNR is the mean of all SNR measures.
Entropy-focus criterion (EFC)
Uses the Shannon entropy of voxel intensities as an indication of
ghosting and blurring induced by head motion. Lower values are
better.
\[
E =
-\sum_{j=1}^{N}{\frac{x_j}{x_{\mathrm{max}}}\ln\left(\frac{x_j}{x_{\mathrm{max}}}\right)}
\]
with \(x_{max} =
\sqrt{\sum_{j=1}^{N}x_{j}^{2}}\) .
The EFC is then:
\[
\mathrm{EFC} = \left(\frac{N}{\sqrt{N}}\log{\sqrt{N}}^{-1}\right)E
\]
where:
\(x\)
Image voxels
\(N\)
Number of image voxels
Foreground-to-background energy ratio (FBER)
The average energy of image voxel intensities within the head
relative to outside the head. Higher values are better.
\[
\mathrm{FBER} = \frac{\mathrm{E}[|F|^{2}]}{\mathrm{E}[|B|^{2}]}
\]
where:
\(F\)
Image voxels inside the head (foreground)
\(B\)
Image voxels outside the head (background)
White-matter-to-maximum-intensity ratio (WM2MAX)
The median image voxel intensity within the WM mask over the 99.95th
percentile of the full structural image signal distribution. Values
closer to 1 are better.
\[
\mathrm{WM2MAX} = \frac{\mathrm{med}(WM)}{\mathrm{P}_{99.95}(X)}
\]
References
2.
Evans CJ, Puts NAJ, Robson SE, et al.
Subtraction artifacts and frequency (Mis-)alignment in
J-difference GABA editing .
Journal of Magnetic Resonance
Imaging . 2013;38(4):970-975. doi:
10.1002/jmri.23923
3.
Mikkelsen M, Barker PB, Bhattacharyya PK, et
al.
Big GABA: Edited MR spectroscopy at 24 research
sites .
NeuroImage . 2017;159:32-45. doi:
10.1016/j.neuroimage.2017.07.021
4.
Esteban O, Birman D, Schaer M, Koyejo OO,
Poldrack RA, Gorgolewski KJ.
MRIQC: Advancing the
automatic prediction of image quality in MRI from unseen sites .
Bernhardt BC, ed.
PLOS ONE . 2017;12(9):e0184661. doi:
10.1371/journal.pone.0184661
5.
Dietrich O, Raya JG, Reeder SB, Reiser MF,
Schoenberg SO.
Measurement of signal‐to‐noise
ratios in MR images: Influence of multichannel coils, parallel imaging,
and reconstruction filters .
Journal of Magnetic Resonance
Imaging . 2007;26(2):375-385. doi:
10.1002/jmri.20969
LS0tCnRpdGxlOiAiRGF0YSBxdWFsaXR5IG1ldHJpY3MiCmRhdGU6ICJMYXN0IHVwZGF0ZWQ6IGByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpiaWJsaW9ncmFwaHk6IGJpYmxpb2dyYXBoeS5iaWIKY3NsOiBhbWVyaWNhbi1tZWRpY2FsLWFzc29jaWF0aW9uLmNzbApsaW5rLWNpdGF0aW9uczogeWVzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZGVwdGg6IDIKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBGQUxTRQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciwgY2hpbGQgPSAianMvYmFjay10by10b3AuanMifQpgYGAKCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0KYm9keSAubWFpbi1jb250YWluZXIgewogIHdpZHRoOiA5MCU7Cn0KCiNUT0MgewoKfQpgYGAKCjxicj4KCkxpc3RlZCBiZWxvdyBhcmUgdGhlIGRhdGEgcXVhbGl0eSBtZXRyaWNzIHRoYXQgR2FubmV0IGNvbXB1dGVzIGR1cmluZyBkYXRhIHByZXByb2Nlc3NpbmcsIHNpZ25hbCBmaXR0aW5nLCBhbmQgdGlzc3VlIHNlZ21lbnRhdGlvbi4KCiMjIExpbmV3aWR0aAoKTGluZXdpZHRoIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIGZ1bGwtd2lkdGggaGFsZi1tYXhpbXVtIChGV0hNKSAoaW4gSHopIG9mIGZpdHRlZCBtb2RlbCBzaWduYWxzLiBXaGVuIHJlcG9ydGluZyBsaW5ld2lkdGhzIG9mIGRhdGFzZXRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEZXSE0gb2YgdENyIG9yIHROQUEgZnJvbSB0aGUgT0ZGIHNwZWN0cnVtLCBvciB0aGUgRldITSBvZiB0aGUgd2F0ZXIgcmVmZXJlbmNlIChpZiBhIHdhdGVyIHJlZmVyZW5jZSBpcyBwcm92aWRlZCkuCgojIyBTaWduYWwtdG8tbm9pc2UgcmF0aW8gKFNOUikKClRoZSBTTlIgb2YgZml0dGVkIHNpZ25hbHMgaXMgY2FsY3VsYXRlZCBhcyB0aGUgYW1wbGl0dWRlIG9mIHRoZSBnaXZlbiBzaWduYWwgbW9kZWwgZGl2aWRlZCBieSB0d2ljZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBub2lzZSBzaWduYWwuIFRvIGVzdGltYXRlIHRoZSBub2lzZSBzaWduYWwsIEdhbm5ldCB0YWtlcyB0d28gaW5kZXBlbmRlbnQgc2VnbWVudHMgb2YgdGhlIE9GRiBvciBESUZGIHNwZWN0cnVtIChhcyBhcHByb3ByaWF0ZSB0byB0aGUgbW9kZWxlZCBzaWduYWwgb2YgaW50ZXJlc3QpIGJldHdlZW4gOOKAkzkgcHBtIGFuZCA54oCTMTAgcHBtLCBhbmQgZGV0cmVuZHMgdGhlbSB1c2luZyBhIHNlY29uZC1vcmRlciBwb2x5bm9taWFsIGZ1bmN0aW9uLiBEZXRyZW5kaW5nIGlzIHBlcmZvcm1lZCB0byByZW1vdmUgYmFzZWxpbmUgYXJ0aWZhY3RzIChvZnRlbiByZWxhdGVkIHRvIHRoZSByZXNpZHVhbCB3YXRlciBzaWduYWwpLiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVhY2ggZGV0cmVuZGVkIG5vaXNlIHNlZ21lbnQgaXMgdGhlbiBjYWxjdWxhdGVkLiBUaGUgc21hbGxlciBvZiB0aGUgdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgaXMgdGhlbiB1c2VkIGFzIHRoZSBlc3RpbWF0ZSBvZiBub2lzZSwgd2hpY2ggaXMgdGhlbiBtdWx0aXBsaWVkIGJ5IDIuCgpGb3JtdWxhaWNhbGx5LCB0aGlzIGlzIGRlZmluZWQgYXM6CgokJApcbWF0aHJte1NOUn0gPSBcZnJhY3tBX3tcbWF0aHJte21ldGFifX19ezJcY2RvdFxtYXRocm17c3RkfVtTX3tcbWF0aHJte25vaXNlfX0oZildfQokJAoKd2hlcmU6Cgp8IDx1PlBhcmFtZXRlcjwvdT4gfCA8dT5EZWZpbml0aW9uPC91PiB8CnwgOi0gfCA6LS0tLS0tIHwKfCAkQV97XG1hdGhybXttZXRhYn19JCB8IE1heGltdW0gc2lnbmFsIG1vZGVsIGFtcGxpdHVkZSBvZiB0aGUgbWV0YWJvbGl0ZSBvZiBpbnRlcmVzdCB8CnwgJFNfe1xtYXRocm17bm9pc2V9fShmKSQgfCBEZXRyZW5kZWQgbm9pc2Ugc2lnbmFsIGJldHdlZW4gZWl0aGVyIDjigJM5IG9yIDnigJMxMCBwcG0gKHdoaWNoZXZlciB5aWVsZHMgYSBsb3dlciBzdGFuZGFyZCBkZXZpYXRpb24pIGluIHRoZSBhcHByb3ByaWF0ZSBzcGVjdHJ1bSAoaS5lLiwgZWl0aGVyIHRoZSBPRkYgb3IgRElGRiBzcGVjdHJ1bSkgfAoKIyMgRnJlcXVlbmN5IG9mZnNldHMKClRvIGVzdGltYXRlIHRoZSBkZWdyZWUgb2YgZnJlcXVlbmN5IG9mZnNldHMgdGhhdCByZXN1bHQgZnJvbSBzY2FubmVyLXJlbGF0ZWQgZnJlcXVlbmN5IGRyaWZ0IFtASHVpMjAyMWFdIGFuZCBwYXJ0aWNpcGFudCBtb3Rpb24gW0BFdmFuczIwMTNdLCBHYW5uZXQgY2FsY3VsYXRlcyBhbiBhdmVyYWdlIGZyZXF1ZW5jeSBvZmZzZXQgW0BNaWtrZWxzZW4yMDE3XSAkXG92ZXJsaW5le1xEZWx0YVxkZWx0YV97MH19JC4gVGhpcyBpcyBjYWxjdWxhdGVkIGFzIHRoZSBtZWFuIChvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIGFjcXVpc2l0aW9uKSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9ic2VydmVkIGZyZXF1ZW5jeSBvZiB0aGUgcmVzaWR1YWwgd2F0ZXIgc2lnbmFsIGluIHRoZSBwcmUtZnJlcXVlbmN5LWNvcnJlY3RlZCBzdWJzcGVjdHJhIGFuZCB0aGUgbm9taW5hbCB3YXRlciBmcmVxdWVuY3kgJFxkZWx0YV97MH0kIGF0IDQuNjggcHBtICg0LjggcHBtIGZvciByb29tLXRlbXBlcmF0dXJlIHBoYW50b21zKSwgb3IgdGhlIG5vbWluYWwgQ3IgZnJlcXVlbmN5IGF0IDMuMDIgcHBtIGZvciBIRVJNRVMgYWNxdWlzaXRpb25zLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB1c2luZyB0aGUgbWVhbiBvZiBvZmZzZXQgZGlmZmVyZW5jZXMgZG9lcyBub3QgZnVsbHkgY2hhcmFjdGVyaXplIGZyZXF1ZW5jeSBvZmZzZXRzIGJ1dCBpcyBhIHVzZWZ1bCBoZXVyaXN0aWMuCgpGb3JtdWxhaWNhbGx5LCB0aGlzIGlzIGRlZmluZWQgYXM6CgokJApcb3ZlcmxpbmV7XERlbHRhXGRlbHRhX3swfX0gPSBcZnJhY3sxfXtNfVxzdW17XHdpZGVoYXR7XGRlbHRhfV97MCxtfSAtIFxkZWx0YV97MH19CiQkIHdoZXJlOgoKfCA8dT5QYXJhbWV0ZXI8L3U+IHwgPHU+RGVmaW5pdGlvbjwvdT4gfAp8IDotIHwgOi0tLS0tLSB8CnwgJG0kIHwgU3Vic3BlY3RydW0gaW5kZXggbnVtYmVyLCAkbSBcaW4gMSwgMiwgMywgLi4uIE0kIHwKfCAkXHdpZGVoYXR7XGRlbHRhfV97MCxtfSQgfCBPYnNlcnZlZCB3YXRlciBvciB0Q3IgZnJlcXVlbmN5IGluIHN1YnNwZWN0cnVtICRtJCB8CnwgJFxkZWx0YV97MH0kIHwgTm9taW5hbCB3YXRlciBvciB0Q3IgZnJlcXVlbmN5IHwKCiMjIEZpdCBlcnJvcgoKV2hlbiBmaXR0aW5nIHNpZ25hbCBmdW5jdGlvbnMgdG8gbWV0YWJvbGl0ZSBwZWFrcywgR2FubmV0IHdpbGwgYWxzbyBlc3RpbWF0ZSB0aGUgZXJyb3Igb2YgdGhlIGZpdC4gVGhpcyBpcyBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscyBvZiB0aGUgc2lnbmFsIG1vZGVsIGZpdCBkaXZpZGVkIGJ5IHRoZSBzaWduYWwgbW9kZWwgYW1wbGl0dWRlIGFuZCBtdWx0aXBsaWVkIGJ5IDEwMCB0byBnaXZlIGEgcGVyY2VudGFnZS4KCkZvciBtZXRhYm9saXRlIHBlYWsgZml0cywgdGhpcyBpczoKCiQkClxlcHNpbG9uX3tcbWF0aHJte21ldGFifX0gPSAxMDBcY2RvdFxmcmFje1xtYXRocm17c3RkfVtyZXNpZF97XG1hdGhybXttZXRhYn19KGYpXX17QV97XG1hdGhybXttZXRhYn19fQokJAoKd2hlcmU6Cgp8IDx1PlBhcmFtZXRlcjwvdT4gfCA8dT5EZWZpbml0aW9uPC91PiB8CnwgOi0gfCA6LS0tLS0tIHwKfCAkcmVzaWRfe1xtYXRocm17bWV0YWJ9fSQgfCBGaXQgcmVzaWR1YWxzIG9mIHNpZ25hbCBtb2RlbCBmb3IgbWV0YWJvbGl0ZSB8CnwgJEFfe1xtYXRocm17bWV0YWJ9fSR8IFNpZ25hbCBtb2RlbCBhbXBsaXR1ZGUgfAoKU2ltaWxhcmx5LCBmb3IgcmVmZXJlbmNlIHNpZ25hbCBmaXRzLCB0aGlzIGlzOgoKJCQKXGVwc2lsb25fe1xtYXRocm17cmVmfX0gPSAxMDBcY2RvdFxmcmFje1xtYXRocm17c3RkfVtyZXNpZF97XG1hdGhybXtyZWZ9fShmKV19e0Ffe1xtYXRocm17cmVmfX19CiQkCgpTaW5jZSBhbGwgbWV0YWJvbGl0ZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSByZWZlcmVuY2Ugc2lnbmFsIChlaXRoZXIgdENyIG9yIHVuc3VwcHJlc3NlZCB3YXRlcikgYW5kIHJlcG9ydGVkIGFzIHN1Y2gsIHRoZSBmaXQgZXJyb3IgdGhhdCByZWFsbHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgKGFuZCByZXBvcnRlZCkgaXMgdGhlIGNvbWJpbmVkIGVycm9yIG9mIHRoZSBtZXRhYm9saXRlIGFuZCByZWZlcmVuY2Ugc2lnbmFsIG1vZGVsIGZpdHMsIHdoaWNoIGFkZCB1cCBpbiBxdWFkcmF0dXJlLgoKRm9ybXVsYWljYWxseSwgdGhpcyBpcyBkZWZpbmVkIGFzOgoKJCQKXGVwc2lsb25fe1xtYXRocm17bWV0YWJ9LFxtYXRocm17cmVmfX0gPSBcc3FydHtcZXBzaWxvbl97XG1hdGhybXttZXRhYn19XjIgKyBcZXBzaWxvbl97XG1hdGhybXtyZWZ9fV4yfQokJAoKIyMgSW1hZ2UgcXVhbGl0eSBtZXRyaWNzCgpXaGVuIHNlZ21lbnRpbmcgc3RydWN0dXJhbCBpbWFnZXMgdG8gb2J0YWluIHZveGVsIHRpc3N1ZSBmcmFjdGlvbnMgb2YgR00sIFdNLCBhbmQgQ1NGLCBHYW5uZXQgY29tcHV0ZXMgc2V2ZXJhbCBtZXRyaWNzIHRvIHF1YW50aWZ5IHRoZSBxdWFsaXR5IG9mIHN0cnVjdHVyYWwgaW1hZ2VzIGFuZCB0aGUgc2VnbWVudGF0aW9uLiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBgTVJTX3N0cnVjdC5vdXQuUUFgIHN0cnVjdHVyZS4gU2V2ZXJhbCBtZXRyaWNzIGZyb20gdGhlIE1SSSBRdWFsaXR5IENvbnRyb2wgdG9vbCAoTVJJUUMpIFtARXN0ZWJhbjIwMTddIGFyZSBjb21wdXRlZC4gTW9yZSBkZXRhaWxzIGFyZSBhbHNvIHByb3ZpZGVkIGluIHRoZSBNUklRQyA8YSBocmVmPSJodHRwczovL21yaXFjLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9pcW1zL3Qxdy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+ZG9jdW1lbnRhdGlvbjwvYT4uCgp8IDx1PlBhcmFtZXRlcjwvdT4gfCA8dT5EZWZpbml0aW9uPC91PiB8CnwgOi0tIHwgOi0tLS0tLSB8CnwgJFxtYXRocm17bWFkfSQgfCBNZWRpYW4gYWJzb2x1dGUgZGV2aWF0aW9uIHwKfCAkXG1hdGhybXttZWR9JCB8IE1lZGlhbiB8CnwgJEdNJCwgJFdNJCwgJENTRiQsICRCRyQgfCBHTSwgV00sIENTRiwgYW5kIGFpciBiYWNrZ3JvdW5kIHNlZ21lbnRlZCBpbWFnZXMgfAp8ICRcc2lnbWEkIHwgU3RhbmRhcmQgZGV2aWF0aW9uIHwKfCAkXG1hdGhybXtQfV97OTkuOTV9JCB8IDk5Ljk1dGggcGVyY2VudGlsZSB8Cgo8YnI+CgojIyMgQ29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIChDVikgb2YgR00sIFdNLCBhbmQgQ1NGCgokJApcbWF0aHJte0NWfSA9IFxmcmFje1xtYXRocm17bWFkfShGKX17XG1hdGhybXttZWR9KEYpfQokJAoKd2hlcmUgJEYkIGNhbiBiZSBHTSwgV00sIG9yIENTRiwgJFxtYXRocm17bWFkfSQgaXMgdGhlIG1lZGlhbiBhYnNvbHV0ZSBkZXZpYXRpb24sIGFuZCAkXG1hdGhybXttZWR9JCBpcyB0aGUgbWVkaWFuLgoKPGJyPgoKIyMjIENvZWZmaWNpZW50IG9mIGpvaW50IHZhcmlhdGlvbiAoQ0pWKQoKJCQKXG1hdGhybXtDSlZ9ID0gXGZyYWN7XG1hdGhybXttYWR9KFdNKSArIFxtYXRocm17bWFkfShHTSl9e3xcbWF0aHJte21lZH0oV00pICsgXG1hdGhybXttZWR9KEdNKXx9CiQkCgo8YnI+CgojIyMgQ29udHJhc3QtdG8tbm9pc2UgcmF0aW8gKENOUikKCiQkClxtYXRocm17Q05SfSA9IFxmcmFje3xcbWF0aHJte21lZH0oR00pIC0gXG1hdGhybXttZWR9KFdNKXx9e1xzcXJ0e1xzaWdtYV97XG1hdGhybXtHTX19XnsyfSArIFxzaWdtYV97XG1hdGhybXtXTX19XnsyfSArIFxzaWdtYV97XG1hdGhybXtCR319XnsyfX19CiQkCgp3aGVyZSAkXHNpZ21hJCBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZXNwZWN0aXZlIHRpc3N1ZSBjbGFzcyBvciBiYWNrZ3JvdW5kLgoKPGJyPgoKIyMjIFNOUiBvZiBHTSwgV00sIENTRiwgYW5kIHRvdGFsCgokJApcbWF0aHJte1NOUn0gPSBcZnJhY3tcbWF0aHJte21lZH0oRil9e1xzaWdtYV97Rn1cc3FydHtcZnJhY3tufXtuLTF9fX0KJCQKCkFuIGFsdGVybmF0aXZlIFNOUiBtZWFzdXJlIGJhc2VkIG9uIERpZXRyaWNoIGV0IGFsLiAoMjAwNykgW0BEaWV0cmljaDIwMDddIGlzIGFsc28gY29tcHV0ZWQgdXNpbmcgdGhlIGJhY2tncm91bmQgbWFzayB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmcgdGlzc3VlIHNlZ21lbnRhdGlvbjoKCiQkClxtYXRocm17U05SX3tEfX0gPSBcZnJhY3tcbWF0aHJte21lZH0oRil9e1xzcXJ0e1xmcmFjezJ9ezQtXHBpfX1cbWF0aHJte21hZH0oQkcpfQokJAoKRm9yIGJvdGggU05SIG1lYXN1cmVzLCAkRiQgY2FuIGJlIEdNLCBXTSwgb3IgQ1NGLiBUb3RhbCBTTlIgaXMgdGhlIG1lYW4gb2YgYWxsIFNOUiBtZWFzdXJlcy4KCjxicj4KCiMjIyBFbnRyb3B5LWZvY3VzIGNyaXRlcmlvbiAoRUZDKQoKVXNlcyB0aGUgU2hhbm5vbiBlbnRyb3B5IG9mIHZveGVsIGludGVuc2l0aWVzIGFzIGFuIGluZGljYXRpb24gb2YgZ2hvc3RpbmcgYW5kIGJsdXJyaW5nIGluZHVjZWQgYnkgaGVhZCBtb3Rpb24uIExvd2VyIHZhbHVlcyBhcmUgYmV0dGVyLgoKJCQKRSA9IC1cc3VtX3tqPTF9XntOfXtcZnJhY3t4X2p9e3hfe1xtYXRocm17bWF4fX19XGxuXGxlZnQoXGZyYWN7eF9qfXt4X3tcbWF0aHJte21heH19fVxyaWdodCl9CiQkCgp3aXRoICR4X3ttYXh9ID0gXHNxcnR7XHN1bV97aj0xfV57Tn14X3tqfV57Mn19JC4KClRoZSBFRkMgaXMgdGhlbjoKCiQkClxtYXRocm17RUZDfSA9IFxsZWZ0KFxmcmFje059e1xzcXJ0e059fVxsb2d7XHNxcnR7Tn19XnstMX1ccmlnaHQpRQokJAoKd2hlcmU6Cgp8IDx1PlBhcmFtZXRlcjwvdT4gfCA8dT5EZWZpbml0aW9uPC91PiB8CnwgOi0gfCA6LS0tLS0tIHwKfCAkeCQgfCBJbWFnZSB2b3hlbHMgfAp8ICROJCB8IE51bWJlciBvZiBpbWFnZSB2b3hlbHMgfAoKPGJyPgoKIyMjIEZvcmVncm91bmQtdG8tYmFja2dyb3VuZCBlbmVyZ3kgcmF0aW8gKEZCRVIpCgpUaGUgYXZlcmFnZSBlbmVyZ3kgb2YgaW1hZ2Ugdm94ZWwgaW50ZW5zaXRpZXMgd2l0aGluIHRoZSBoZWFkIHJlbGF0aXZlIHRvIG91dHNpZGUgdGhlIGhlYWQuIEhpZ2hlciB2YWx1ZXMgYXJlIGJldHRlci4KCiQkClxtYXRocm17RkJFUn0gPSBcZnJhY3tcbWF0aHJte0V9W3xGfF57Mn1dfXtcbWF0aHJte0V9W3xCfF57Mn1dfQokJAoKd2hlcmU6Cgp8IDx1PlBhcmFtZXRlcjwvdT4gfCA8dT5EZWZpbml0aW9uPC91PiB8CnwgOi0gfCA6LS0tLS0tIHwKfCAkRiQgfCBJbWFnZSB2b3hlbHMgaW5zaWRlIHRoZSBoZWFkIChmb3JlZ3JvdW5kKSB8CnwgJEIkIHwgSW1hZ2Ugdm94ZWxzIG91dHNpZGUgdGhlIGhlYWQgKGJhY2tncm91bmQpIHwKCjxicj4KCiMjIyBXaGl0ZS1tYXR0ZXItdG8tbWF4aW11bS1pbnRlbnNpdHkgcmF0aW8gKFdNMk1BWCkKClRoZSBtZWRpYW4gaW1hZ2Ugdm94ZWwgaW50ZW5zaXR5IHdpdGhpbiB0aGUgV00gbWFzayBvdmVyIHRoZSA5OS45NXRoIHBlcmNlbnRpbGUgb2YgdGhlIGZ1bGwgc3RydWN0dXJhbCBpbWFnZSBzaWduYWwgZGlzdHJpYnV0aW9uLiBWYWx1ZXMgY2xvc2VyIHRvIDEgYXJlIGJldHRlci4KCiQkClxtYXRocm17V00yTUFYfSA9IFxmcmFje1xtYXRocm17bWVkfShXTSl9e1xtYXRocm17UH1fezk5Ljk1fShYKX0KJCQKCjxicj4KCiMjIyBSZWZlcmVuY2VzCg==
Built with R Markdown in RStudio
Copyright © 2020–2025, Mark Mikkelsen