Skip to content

Category Induction Task

Try the Demo

In this task, participants categorize stimuli by dragging and dropping them into labeled circles representing different categories. Stimuli appear in a queue at the bottom of the screen, and participants move them into the appropriate category circles displayed above. This provides a flexible interface for studying how people organize and group items based on various features, concepts, or learned associations.

Category induction is a fundamental cognitive process in which people learn to classify items into groups based on shared features or conceptual relationships1. Research on categorization has shown that people use both prototype-based strategies (comparing items to an idealized category member) and exemplar-based strategies (comparing to specific remembered instances)2. The task is valuable for studying semantic organization, perceptual grouping, and concept learning across diverse domains.

Quick Start

  1. Create or open an experiment from your Dashboard
  2. Click Add task and select "Category Induction"
  3. Upload your stimulus set
  4. Define category names (or allow participants to create their own)
  5. Configure parameters and preview your experiment

New to Meadows? See the Getting Started guide for a complete walkthrough.

Alternative tasks

  • Use a Card Sort task for a similar categorization interface with different interaction mechanics. 💜
  • Use a Triplet task to study similarity judgments with forced-choice triads.
  • Use a Multi-Arrangement task for continuous spatial arrangement of stimuli.

Parameters

Customize the task by changing these on the Parameters tab of the task.

General Interface Settings

Customize the instruction at the top of the page. These apply to most task types on Meadows.

Instruction hint

Text displayed at the top of the screen during the task. Maximum 80 characters.

Extended instruction

A longer instruction that appears when the participant hovers their mouse cursor over the hint. Maximum 500 characters.

Stimulus Display

Configure how stimuli are presented to participants.

Item Size

Height of the stimuli as a percentage of the width of the field. The width is adapted according to the original aspect ratio of the image. Default: 8%. Valid range: 0.2% to 20%.

Stimuli displayed in randomized order

Whether stimuli should appear in the queue in random order. When unchecked, stimuli appear in the order they were uploaded. Default: unchecked.

Category Configuration

Define the categories available to participants.

Categories

List of category names and properties. For each category:

  • Name: The name of the category as shown to the participant
  • Is selector: If enabled, stimuli in this category will be selected for subsequent tasks that use this Category Induction task as their stimulus source

Use the ordering controls to arrange categories as they will appear on screen.

Using Category Induction to select stimuli for subsequent tasks

Mark a category as "Is selector" to use stimuli from that category in subsequent tasks. In the following task's Stimuli tab, set Source to "Preceding Task" and choose "selected only". This will include only stimuli that the participant placed in selector categories. See Stimuli Selection for more details.

Change categories

Allow participants to add and remove categories dynamically. When enabled:

  • A "new category" circle appears where participants can drag stimuli to create new categories
  • Edit buttons (✏️) appear on existing categories to rename them
  • Remove buttons (🗑️) appear on existing categories to delete them

Default: unchecked.

Maximum number of categories

Limits the total number of categories participants can create when "Change categories" is enabled. Default: 7. Valid range: 1 to 100.

Advanced Settings

Fine-tune the interaction mechanics.

Mouse cursor targeting

When enabled, uses the mouse cursor position instead of the stimulus center to determine if a stimulus is inside a category circle. This can make it easier to place stimuli precisely, especially with larger items or when using touchscreens. Default: unchecked.

Data

For general information about the various structures and file formats that you can download for your data see Downloads.

"Annotations" (table rows), with one row per placement action. Each row represents a stimulus being placed into a category. Columns:

  • trial - always 0 for this task (no discrete trials)
  • time_trial_start - timestamp when the task page loaded (seconds since 1/1/1970)
  • time_trial_response - timestamp when the stimulus was placed into the category (seconds since 1/1/1970)
  • label - the name of the category where the stimulus was placed
  • stim1_id - meadows internal ID of the stimulus
  • stim1_name - filename of the stimulus as uploaded

Note: If a participant moves a stimulus from one category to another, both placements will be recorded with their respective timestamps.

Qualification

See Qualification for general information about using task results to screen participants.

Participant responses are matched to qualification criteria differently depending on whether the participant was allowed to create their own categories:

Preset Categories

If participants were not allowed to create their own categories (Change categories disabled), placements are compared based on the exact name of the category. If there is an 80% match with the placements in the qualification criteria, the participant qualifies.

Custom Categories

If participants were allowed to create their own categories (Change categories enabled), category names may differ from those in the criteria or even be meaningless. Therefore, in this case, clusters of stimuli are defined only by which other stimuli they are placed together with. There must be a 100% match with the criteria of these clusters for the participant to qualify.

Analysis

Basic Categorization Analysis

Analyze how participants organized stimuli into categories.

import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter

# Load the annotations data
df = pd.read_csv('Meadows_myExperiment_v1_annotations.csv')

# Basic statistics per participant
stats = df.groupby('participation').agg({
    'label': 'nunique',  # Number of unique categories used
    'stim1_name': 'count'  # Total placements
}).rename(columns={'label': 'n_categories', 'stim1_name': 'n_placements'})

print("Category usage per participant:")
print(stats)

# Most common category labels across all participants
category_counts = Counter(df['label'])
print("\nMost common categories:")
for cat, count in category_counts.most_common(10):
    print(f"  {cat}: {count} placements")

# Visualize category distribution
top_categories = [cat for cat, _ in category_counts.most_common(10)]
counts = [category_counts[cat] for cat in top_categories]

plt.figure(figsize=(12, 6))
plt.bar(range(len(top_categories)), counts)
plt.xticks(range(len(top_categories)), top_categories, rotation=45, ha='right')
plt.xlabel('Category')
plt.ylabel('Number of Stimuli Placed')
plt.title('Most Frequently Used Categories')
plt.tight_layout()
plt.show()
library(tidyverse)

# Load the annotations data
df <- read_csv('Meadows_myExperiment_v1_annotations.csv')

# Basic statistics per participant
stats <- df %>%
  group_by(participation) %>%
  summarise(
    n_categories = n_distinct(label),
    n_placements = n()
  )

print("Category usage per participant:")
print(stats)

# Most common categories
category_counts <- df %>%
  count(label, sort = TRUE)

print("Most common categories:")
print(head(category_counts, 10))

# Visualize top categories
category_counts %>%
  head(10) %>%
  ggplot(aes(x = reorder(label, n), y = n)) +
  geom_col(fill = 'steelblue') +
  coord_flip() +
  labs(x = 'Category', y = 'Number of Stimuli Placed',
       title = 'Most Frequently Used Categories') +
  theme_minimal()
  1. Open the CSV file in Excel, Google Sheets, or similar
  2. Create a pivot table with label (category) as rows and Count of stim1_name as values
  3. Sort by count descending to see most common categories
  4. Add participation as a filter to examine individual participants
  5. Create a column chart to visualize category frequencies

Co-occurrence Matrix

Analyze which stimuli were grouped together across participants.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# Load the annotations data
df = pd.read_csv('Meadows_myExperiment_v1_annotations.csv')

# Get unique stimuli
stimuli = sorted(df['stim1_name'].unique())
n_stim = len(stimuli)

# Initialize co-occurrence matrix
cooccur = np.zeros((n_stim, n_stim))

# For each participant and category, mark which stimuli were grouped together
for participant in df['participation'].unique():
    df_p = df[df['participation'] == participant]

    for category in df_p['label'].unique():
        stims_in_cat = df_p[df_p['label'] == category]['stim1_name'].tolist()

        # Mark all pairs as co-occurring
        for s1 in stims_in_cat:
            for s2 in stims_in_cat:
                i1 = stimuli.index(s1)
                i2 = stimuli.index(s2)
                cooccur[i1, i2] += 1

# Normalize by number of participants
n_participants = df['participation'].nunique()
cooccur = cooccur / n_participants

# Plot heatmap
plt.figure(figsize=(12, 10))
sns.heatmap(cooccur, xticklabels=stimuli, yticklabels=stimuli, 
            cmap='YlOrRd', vmin=0, vmax=1)
plt.title('Stimulus Co-occurrence Matrix\n(Proportion of participants grouping stimuli together)')
plt.tight_layout()
plt.show()
library(tidyverse)
library(pheatmap)

# Load the annotations data
df <- read_csv('Meadows_myExperiment_v1_annotations.csv')

# Get unique stimuli
stimuli <- sort(unique(df$stim1_name))
n_stim <- length(stimuli)

# Initialize co-occurrence matrix
cooccur <- matrix(0, nrow = n_stim, ncol = n_stim)
rownames(cooccur) <- stimuli
colnames(cooccur) <- stimuli

# For each participant and category
for (p in unique(df$participation)) {
  df_p <- filter(df, participation == p)

  for (cat in unique(df_p$label)) {
    stims_in_cat <- df_p %>% 
      filter(label == cat) %>% 
      pull(stim1_name)

    # Mark all pairs as co-occurring
    for (s1 in stims_in_cat) {
      for (s2 in stims_in_cat) {
        cooccur[s1, s2] <- cooccur[s1, s2] + 1
      }
    }
  }
}

# Normalize by number of participants
n_participants <- n_distinct(df$participation)
cooccur <- cooccur / n_participants

# Plot heatmap
pheatmap(cooccur, 
         color = colorRampPalette(c("white", "yellow", "orange", "red"))(100),
         main = "Stimulus Co-occurrence Matrix")

References


  1. Rosch, E., & Mervis, C. B. (1975). Family resemblances: Studies in the internal structure of categories. Cognitive Psychology, 7(4), 573-605. doi:10.1016/0010-0285(75)90024-9 

  2. Medin, D. L., & Schaffer, M. M. (1978). Context theory of classification learning. Psychological Review, 85(3), 207-238. doi:10.1037/0033-295X.85.3.207