Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

StatCraft

Second-Level Neuroimaging Analysis Tool

Features | Installation | Quick Start | Configuration | Outputs | License | Citation | Acknowledgments

Python 3.8+License: AGPL-3.0

StatCraft is a BIDS-friendly wrapper around Nilearn for second-level neuroimaging analysis. It supports group-level comparisons, method comparisons, and statistical inference on brain images (e.g., fMRI, PET) or connectivity matrices. Under the hood, the core statistical routines — GLM fitting, contrast computation, permutation testing and thresholding — rely on Nilearn's well-proven implementations. StatCraft adds flexible pattern-based file discovery and produces reproducible, interpretable results with minimal user input.

Features

  • Multiple Analysis Types

    • One-sample t-tests
    • Two-sample t-tests (group comparisons)
    • Paired t-tests (within-subject comparisons)
    • General Linear Model (GLM) with custom design matrices
  • Flexible File Discovery

    • Pattern-based file matching with glob patterns
    • Participant filtering by subject ID
    • Works with derivatives from any first-level analysis
    • Supports BIDS-like and custom file naming
  • Statistical Inference

    • Uncorrected thresholding
    • FDR (False Discovery Rate) correction
    • FWER (Family-Wise Error Rate) via Bonferroni
    • Permutation-based FWER correction
  • Anatomical Annotation of Clusters

    • Harvard-Oxford atlas (default)
    • AAL, Destrieux, Schaefer atlases
    • Custom atlas support
  • Comprehensive Reporting

    • HTML reports with visualizations
    • Design matrix plots
    • Activation maps (thresholded and unthresholded)
    • Cluster tables with anatomical labels

Installation

We strongly recommend to use a virtual environment to work with this project

git clone https://github.com/ln2t/statCraft.git
cd statCraft
python -m venv
source venv/bin/activate
pip install -e .

Quick Start

Command Line Interface

Usage Patterns

StatCraft uses flexible pattern matching for file discovery. The idea is that you point to one or more directories and define filenaming patterns using wildcards, and this defines the data on which the second-level analysis will be performed.

This allows the user to use this tool in a variety of first-level tools without any particular constraints on the output structure.

Here are the typical usage, depending on the analysis type:

One-sample t-tests

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN"

The pipeline will search for files matching PATTERN in the <INPUT_DIR> (exploring subfolders), perform the one-sample t-test, and save the results in <OUTPUT_DIR>.

Example:

A one-sample t-test on maps from first-level beta1 maps with task-motor in the name:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz"

Smoothing Brain Map Data

When analyzing brain maps (e.g., statistical maps from first-level analyses), spatial smoothing can improve signal-to-noise ratio and increase statistical power. Use the --smoothing option to specify the smoothing strength in mm (FWHM - Full Width at Half Maximum):

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type one-sample --pattern "PATTERN" --smoothing 6

The --smoothing parameter:

  • Accepts values in mm (e.g., 4, 6, 8)
  • Default is 0 (no smoothing)
  • Only applies to brain map analysis (NIfTI images), not connectivity matrices
  • Uses spatial Gaussian smoothing via nilearn's SecondLevelModel

Example with smoothing:

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type one-sample --pattern "*task-motor*beta1*.nii.gz" --smoothing 6

Two-sample t-tests

The logic is similar as above, except that now one must specify two patterns to define the two groups to compare. We can also assign these groups custom names to ease the output filenaming:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type two-sample --patterns "Group1=PATTERN1 Group2=PATTERN2"

The strings Group1 and Group2 are arbitrary and are used in the output filenaming and in the analysis report.

Example:

If you have distinguishable names between the two groups you want to compare (e.g. c001, c002, ... for "controls" and p001, p002, ... for "patients"):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type two-sample --patterns "controls=sub-c*.nii.gz patients=sub-p*.nii.gz"

Of course, you can also use the GLM approach to have groups defined in a spreadsheet (see below), which has the advantage of being independent of your participant-naming choices.

Paired t-tests

This case is similar to the two-sample case except that one must provide a key to pair the data across the two groups. We do this by using the --pair-by argument:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type paired --patterns "Group1=PATTERN1 Group2=PATTERN2" --pair-by "ENTITY"

The pairing is done using BIDS-like key-value structures in filenames. For instance:

  • --pair-by "sub" (default): Files with sub-001, sub-002, etc. will be paired together
  • --pair-by "ses": Files with ses-pre, ses-post, etc. will be paired together
  • --pair-by "run": Files with run-1, run-2, etc. will be paired together

Supports both BIDS abbreviations (sub, ses, run, task, etc.) and full names (subject, session, run, etc.).

Note:--pair-by is optional, with default value sub.

Examples:

Compare maps from session 1 to session 2, paired by subjects (using default --pair-by sub):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "session1=*ses-1*.nii.gz session2=*ses-2*.nii.gz"

Pair by session instead of subject (if you have multiple sessions and want to pair conditions within sessions):

statcraft /path/to/first_level_fmri_analyzes /path/to/output --analysis-type paired --patterns "pre=*ses-pre*.nii.gz post=*ses-post*.nii.gz" --pair-by "ses"

General Linear Model (GLM)

For GLM analysis one must provide a design matrix. This is done by passing the --participants-file, which follows the structure of the participants.tsv file in a BIDS directory:

participant_id sex age (other columns)
sub-001 F 42 ...
sub-CTL1 F 93 ...
sub-abcd M 17 ...

By default, a design matrix is built using all the columns of this file. If only a subset of columns should be included, this can be achieved using the --regressors option. Moreover, columns that should be treated as categorical can be specified with --categorical-regressors (dummy-coded in the analysis). Finally, the contrast to compute is defined using the --contrasts argument.

Here is a example featuring this functionality:

statcraft <INPUT_DIR><OUTPUT_DIR> --analysis-type glm --participant-files <PATH_TO_PARTICIPANTS.TSV> --regressors sex age IQ --categorical-regressors sex --contrasts age M-F --pattern "*stat-effect*.nii.gz

In this example: columns sex, age and IQ are used to build the design matrix, with sex being treated as a categorical variable, and two contrasts are computed: the effect of age as well as the difference between M and F (assuming those are the labels in original participants.tsv file).

Notes:

  • By default, non-categorical variables are z-scored. To control this, one can use --no-standardize-regressors, e.g. --no-standardize-regressors IQ
  • An intercept is also added in the design matrix. Contrasts using the intercept can be built using the word mean, e.g. --contrasts mean. To remove the intercept, use --no-intercept option.
  • Non-trivial contrasts can be built using simple operands, e.g. --contrasts 0.5*M+0.5*F-mean

Configuration

StatCraft can be configured via command-line arguments, configuration files (YAML/JSON), or Python dictionaries.

Generate Default Configuration

statcraft --init-config config.yaml

Example Configuration (YAML)

# Analysis typeanalysis_type: glm# Participant filtering (optional)participant_label: null # Or: ["01", "02", "03"]# File pattern with embedded filters# Include task, session, space directly in the patternfile_pattern: "**/*task-nback*ses-baseline*space-MNI152*stat-effect*.nii.gz"# Design matrix columns (from participants.tsv)design_matrix:
columns:
- age
- groupadd_intercept: truecategorical_columns:
- group# Contrasts to computecontrasts:
- age # Effect of age
- patients - controls # Group difference# Paired test settings (for paired analysis)paired_test:
pair_by: subsample_patterns:
pre: "**/*ses-pre*.nii.gz"post: "**/*ses-post*.nii.gz"# Statistical inferenceinference:
alpha_corrected: 0.05# Significance for corrected thresholdsalpha_uncorrected: 0.001# Cluster-forming thresholdcluster_threshold: 10corrections:
- uncorrected
- fdr
- bonferroni# Atlas for cluster annotationatlas: harvard_oxford# Smoothing for brain map analysis (in mm FWHM)# Use 0 for no smoothing (default)# Only applies to brain map analysis, not connectivity matricessmoothing_fwhm: 0# Output settingsoutput:
generate_report: truereport_filename: report.html

Outputs

StatCraft generates:

  1. Statistical Maps (*.nii.gz)

    • T-statistic maps
    • P-value maps
    • Effect size maps
    • Thresholded maps (uncorrected, FDR, Bonferroni)
  2. Cluster Tables (*.tsv)

    • Peak coordinates (MNI)
    • Cluster sizes
    • Peak statistics
    • Anatomical labels
  3. HTML Report (report.html)

    • Methodology description
    • Design matrix visualization
    • Activation maps
    • Glass brain views
    • Cluster tables
  4. Configuration (config.yaml)

    • Complete configuration for reproducibility

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.

Citation

If you use StatCraft in your research, please cite:

@software{statcraft,
title = {StatCraft: Second-Level Neuroimaging Analysis Tool},
author = {StatCraft Contributors},
year = {2024},
url = {https://github.com/ln2t/StatCraft}
}

Acknowledgments

StatCraft is built on top of Nilearn, which provides the core statistical and neuroimaging routines (second-level GLM, contrast computation, thresholding, and atlas-based annotation). We are grateful to the Nilearn developers and contributors for maintaining such a robust and well-documented library.

Other key dependencies:

About

Second-level analysis neuroimaging tool

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages