{
  "$schema": "https://www.smartdatatools.app/tools.json",
  "name": "SmartData Tools",
  "description": "Free, browser-only statistical calculators for sample size, power analysis, and clinical trial design. No installation, no server-side processing, no account.",
  "homepage": "https://www.smartdatatools.app/",
  "faq": "https://www.smartdatatools.app/faq.html",
  "license": "Free to use; no warranty. See statement.html for the full disclaimer.",
  "conventions": {
    "invocation": "Every tool below (except cutoffFinder, which requires a file upload) can be driven entirely by URL query parameters, e.g. https://www.smartdatatools.app/TTest_SampleSize/?ss_mean1=0&ss_mean2=0.5&ss_sd1=1&ss_sd2=1&autorun=1. Recognized param names are exactly the input/select element ids listed under each calculator's `params`. Setting any recognized param (or `autorun=1` as a fallback) causes the page to populate its fields and automatically click the real calculate button — the same validation, math, and rendering as a human click.",
    "output": "After a calculation runs (whether triggered manually or via URL params), the exact numeric inputs/outputs are written into a `<script type=\"application/ld+json\" id=\"result-data...\">` element in the page. Fetch the page, execute its JS (a headless browser or any JS-capable fetch), then read that element's JSON — do not scrape the styled result text. Each calculator's JSON-LD element id and output field names are listed under `resultData`.",
    "tabs": "Tools with more than one calculator (e.g. Sample Size vs Power) auto-select the tab whose params were supplied in the URL; the JSON-LD element id distinguishes which calculator's result you're reading."
  },
  "tools": [
    {
      "id": "TTest_SampleSize",
      "name": "Two-Sample T-Test Calculator",
      "url": "https://www.smartdatatools.app/TTest_SampleSize/",
      "description": "Sample size and power for comparing means between two independent groups (Welch's t-test, supports unequal variances and unequal group sizes).",
      "method": "Welch's two-sample t-test; non-central t-distribution for power, binary search for sample size.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "total",
              "n1",
              "n2"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80 — target power",
            "ss_alpha": "number, 0-1 exclusive, default 0.05 — Type I error",
            "ss_mean1": "number, default 0 — mean of group 1",
            "ss_sd1": "number > 0, default 1 — SD of group 1",
            "ss_mean2": "number, default 0 — mean of group 2",
            "ss_sd2": "number > 0, default 1 — SD of group 2",
            "ss_ratio": "number > 0, default 1 — group2/group1 size ratio",
            "ss_sided": "1 (one-sided) or 2 (two-sided), default 2"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80 — target power",
            "alpha": "number, 0-1 exclusive, default 0.05 — Type I error",
            "mean1": "number, default 0 — mean of group 1",
            "sd1": "number > 0, default 1 — SD of group 1",
            "mean2": "number, default 0 — mean of group 2",
            "sd2": "number > 0, default 1 — SD of group 2",
            "ratio": "number > 0, default 1 — group2/group1 size ratio",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_mean1": "mean1",
            "ss_sd1": "sd1",
            "ss_mean2": "mean2",
            "ss_sd2": "sd2",
            "ss_ratio": "ratio",
            "ss_sided": "sided"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power"
            ]
          },
          "params": {
            "pw_mean1": "number, default 0",
            "pw_sd1": "number > 0, default 1",
            "pw_mean2": "number, default 0",
            "pw_sd2": "number > 0, default 1",
            "pw_n1": "integer >= 2, default 20",
            "pw_n2": "integer >= 2, default 20",
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_sided": "1 or 2, default 2"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "mean1": "number, default 0",
            "sd1": "number > 0, default 1",
            "mean2": "number, default 0",
            "sd2": "number > 0, default 1",
            "n1": "integer >= 2, default 20",
            "n2": "integer >= 2, default 20",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "pw_mean1": "mean1",
            "pw_sd1": "sd1",
            "pw_mean2": "mean2",
            "pw_sd2": "sd2",
            "pw_n1": "n1",
            "pw_n2": "n2",
            "pw_alpha": "alpha",
            "pw_sided": "sided"
          }
        }
      ]
    },
    {
      "id": "OneSample_TTest_SampleSize",
      "name": "One Sample Mean Calculator",
      "url": "https://www.smartdatatools.app/OneSample_TTest_SampleSize/",
      "description": "Sample size and power for comparing a single sample's mean against a fixed null value (one-sample t-test).",
      "method": "One-sample Student's t-test; non-central t-distribution.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "n"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80",
            "ss_mean1": "number — null/reference mean",
            "ss_mean2": "number — hypothesized true mean",
            "ss_sd": "number > 0 — standard deviation",
            "ss_alpha": "number, 0-1 exclusive, default 0.05",
            "ss_sided": "'two-sided' or 'one-sided', default 'two-sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "mean_null": "number, default 0 — reference/null mean",
            "mean_alt": "number, default 0 — hypothesized true mean (must differ from mean_null)",
            "sd": "number > 0, default 1",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_mean1": "mean_null",
            "ss_mean2": "mean_alt",
            "ss_sd": "sd",
            "ss_alpha": "alpha",
            "ss_sided": "sided"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power"
            ]
          },
          "params": {
            "pw_mean1": "number — null/reference mean",
            "pw_mean2": "number — hypothesized true mean",
            "pw_sd": "number > 0",
            "pw_n": "integer >= 2",
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_sided": "'two-sided' or 'one-sided', default 'two-sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "mean_null": "number, default 0",
            "mean_alt": "number, default 0",
            "sd": "number > 0, default 1",
            "n": "integer >= 2, default 30",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "pw_mean1": "mean_null",
            "pw_mean2": "mean_alt",
            "pw_sd": "sd",
            "pw_n": "n",
            "pw_alpha": "alpha",
            "pw_sided": "sided"
          }
        }
      ]
    },
    {
      "id": "PearsonChisqr_SampleSize",
      "name": "Comparison of Two Proportions",
      "url": "https://www.smartdatatools.app/PearsonChisqr_SampleSize/",
      "description": "Sample size and power for comparing two independent proportions using the Pearson chi-square test.",
      "method": "Pearson chi-square test for two proportions.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "n1",
              "n2",
              "total",
              "power"
            ]
          },
          "params": {
            "desiredPower": "number, 0.5-0.99, default 0.80",
            "p1_ss": "number, 0-1 — proportion in group 1",
            "p2_ss": "number, 0-1 — proportion in group 2",
            "ratio": "number > 0, default 1 — n2/n1 allocation ratio",
            "alpha_ss": "number, 0.01-0.2, default 0.05",
            "sided_ss": "'two.sided' or 'one.sided', default 'two.sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0.5-0.99, default 0.80",
            "p1": "number, 0-1 — proportion in group 1",
            "p2": "number, 0-1 — proportion in group 2",
            "ratio": "number > 0, default 1 — n2/n1 allocation ratio",
            "alpha": "number, 0.01-0.2, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "desiredPower": "power",
            "p1_ss": "p1",
            "p2_ss": "p2",
            "alpha_ss": "alpha",
            "sided_ss": "sided"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power"
            ]
          },
          "params": {
            "p1_power": "number, 0-1",
            "p2_power": "number, 0-1",
            "n1": "integer >= 1",
            "n2": "integer >= 1",
            "alpha_power": "number, 0.01-0.2, default 0.05",
            "sided_power": "'two.sided' or 'one.sided', default 'two.sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "p1": "number, 0-1",
            "p2": "number, 0-1",
            "n1": "integer >= 1",
            "n2": "integer >= 1",
            "alpha": "number, 0.01-0.2, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "p1_power": "p1",
            "p2_power": "p2",
            "alpha_power": "alpha",
            "sided_power": "sided"
          }
        }
      ]
    },
    {
      "id": "pairedTTest_wo_R",
      "name": "Paired T-Test Calculator",
      "url": "https://www.smartdatatools.app/pairedTTest_wo_R/",
      "description": "Sample size for paired designs, given the two arms' means/SDs and their correlation.",
      "method": "Paired Student's t-test.",
      "calculators": [
        {
          "id": "default",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "results[].n_required"
            ]
          },
          "params": {
            "mean1": "number",
            "sd1": "number > 0",
            "mean2": "number",
            "sd2": "number > 0",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "power": "number, 0-1 exclusive, default 0.8",
            "testType": "'two-sided' or 'one-sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "mean1": "number, required",
            "sd1": "number > 0, required",
            "mean2": "number, required",
            "sd2": "number > 0, required",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "power": "number, 0-1 exclusive, default 0.80",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "testType": "sided"
          }
        }
      ]
    },
    {
      "id": "SurvivalAnalysis_SampleSize",
      "name": "Survival Analysis Calculator",
      "url": "https://www.smartdatatools.app/SurvivalAnalysis_SampleSize/",
      "description": "Sample size and power for time-to-event endpoints using the log-rank test, with uniform accrual + follow-up.",
      "method": "Schoenfeld (1981) formula for required log-rank events; exponential survival with uniform accrual for event-probability/sample-size conversion.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "total",
              "n1",
              "n2",
              "events_required",
              "events_expected"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80",
            "ss_alpha": "number, 0-1 exclusive, default 0.05",
            "ss_sided": "1 or 2, default 2",
            "ss_hr": "number > 0, != 1, default 0.70 — hazard ratio (treatment/control). Ignored if ss_median2 is given.",
            "ss_median2": "number > 0 — treatment median survival (months). If present, switches the page to 'median survivals' mode and HR is derived as ss_median/ss_median2.",
            "ss_median": "number > 0, default 12 — control median survival (months)",
            "ss_ratio": "number > 0, default 1 — allocation ratio n2/n1",
            "ss_accrual": "number >= 0, default 12 — accrual period (months)",
            "ss_followup": "number > 0, default 12 — follow-up period (months)"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2, default 2",
            "median_control": "number > 0, default 12",
            "median_treatment": "number > 0 — if supplied, overrides hazard_ratio as median_control/median_treatment",
            "hazard_ratio": "number > 0, != 1, default 0.7 — ignored if median_treatment supplied",
            "allocation_ratio": "number > 0, default 1",
            "accrual_months": "number >= 0, default 12",
            "followup_months": "number > 0, default 12"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_sided": "sided",
            "ss_median": "median_control",
            "ss_median2": "median_treatment",
            "ss_hr": "hazard_ratio",
            "ss_ratio": "allocation_ratio",
            "ss_accrual": "accrual_months",
            "ss_followup": "followup_months"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power",
              "events_expected"
            ]
          },
          "params": {
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_sided": "1 or 2, default 2",
            "pw_hr": "number > 0, != 1, default 0.70. Ignored if pw_median2 is given.",
            "pw_median2": "number > 0 — treatment median survival (months). If present, switches to 'median survivals' mode.",
            "pw_n1": "integer >= 2, default 100",
            "pw_n2": "integer >= 2, default 100",
            "pw_median": "number > 0, default 12 — control median survival (months)",
            "pw_accrual": "number >= 0, default 12",
            "pw_followup": "number > 0, default 12"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2, default 2",
            "n1": "integer >= 2, default 100",
            "n2": "integer >= 2, default 100",
            "median_control": "number > 0, default 12",
            "median_treatment": "number > 0 — overrides hazard_ratio",
            "hazard_ratio": "number > 0, != 1, default 0.7",
            "accrual_months": "number >= 0, default 12",
            "followup_months": "number > 0, default 12"
          },
          "paramAliases": {
            "pw_alpha": "alpha",
            "pw_sided": "sided",
            "pw_n1": "n1",
            "pw_n2": "n2",
            "pw_median": "median_control",
            "pw_median2": "median_treatment",
            "pw_hr": "hazard_ratio",
            "pw_accrual": "accrual_months",
            "pw_followup": "followup_months"
          }
        }
      ]
    },
    {
      "id": "OneSampleProp_Samplesize",
      "name": "One Sample Proportion Calculator",
      "url": "https://www.smartdatatools.app/OneSampleProp_Samplesize/",
      "description": "Sample size and power for testing a single sample's proportion against a fixed null value (binomial test).",
      "method": "Exact binomial test.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "n",
              "threshold",
              "threshold1",
              "threshold2"
            ]
          },
          "params": {
            "pNullInput": "number, 0.01-0.9999 — null proportion",
            "pAltInput": "number, 0.01-0.9999 — alternative/true proportion",
            "alphaInput": "number, 0.01-0.9999, default 0.05",
            "targetPowerInput": "number, 0.01-0.9999, default 0.80",
            "testTypeSelect": "'one-sided' or 'two-sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "p_null": "number, 0-1 exclusive, default 0.05",
            "p_alt": "number, 0-1 exclusive, default 0.5",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "target_power": "number, 0-1 exclusive, default 0.80",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "pNullInput": "p_null",
            "pAltInput": "p_alt",
            "alphaInput": "alpha",
            "targetPowerInput": "target_power",
            "testTypeSelect": "sided"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power",
              "threshold",
              "threshold1",
              "threshold2"
            ]
          },
          "params": {
            "pNullPowerInput": "number, 0.01-0.9999",
            "pAltPowerInput": "number, 0.01-0.9999",
            "nInput": "integer >= 2",
            "alphaPowerInput": "number, 0.01-0.9999, default 0.05",
            "testTypePowerSelect": "'one-sided' or 'two-sided'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "p_null": "number, 0-1 exclusive, default 0.05",
            "p_alt": "number, 0-1 exclusive, default 0.5",
            "n": "integer >= 2, default 4",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "pNullPowerInput": "p_null",
            "pAltPowerInput": "p_alt",
            "nInput": "n",
            "alphaPowerInput": "alpha",
            "testTypePowerSelect": "sided"
          }
        }
      ]
    },
    {
      "id": "CIcalculator",
      "name": "Confidence Interval of Proportions",
      "url": "https://www.smartdatatools.app/CIcalculator/",
      "description": "Confidence intervals for one or more proportions, with a choice of estimation method.",
      "method": "Clopper-Pearson (exact), Wald, Wilson, Agresti-Coull, Jeffreys, or Modified Wilson, selectable.",
      "calculators": [
        {
          "id": "default",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "results[].estimate",
              "results[].lowerBound",
              "results[].upperBound"
            ]
          },
          "params": {
            "numeratorInput": "text — comma-separated numerator(s), e.g. \"1,2\"",
            "denomInput": "integer, 2-1000000 — denominator (n)",
            "confidenceInput": "number, 0.5-0.999, default 0.95",
            "digitsInput": "integer, 1-10, default 1 — display rounding (does not affect the raw JSON-LD values)",
            "methodSelect": "'clopper-pearson' | 'wald' | 'wilson' | 'agresti-coull' | 'jeffreys' | 'modified wilson'"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "numerators": "comma-separated numbers or array, default '1,2'",
            "n": "integer > 0, default 10 — denominator",
            "confidence": "number, 0-1 exclusive, default 0.95",
            "method": "'clopper-pearson'|'wald'|'wilson'|'agresti-coull'|'jeffreys'|'modified wilson', default 'clopper-pearson'"
          },
          "paramAliases": {
            "numeratorInput": "numerators",
            "denomInput": "n",
            "confidenceInput": "confidence",
            "methodSelect": "method"
          }
        }
      ]
    },
    {
      "id": "SDratio",
      "name": "Standard Deviation of Ratio",
      "url": "https://www.smartdatatools.app/SDratio/",
      "description": "Standard deviation (and CV) of the ratio of two random variables via the delta method, across a range of correlations.",
      "method": "Delta method approximation for Var(X/Y).",
      "calculators": [
        {
          "id": "default",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "ratio",
              "stdev_uncorrelated",
              "rows[].corrCoef",
              "rows[].stdev_correlated"
            ]
          },
          "params": {
            "X": "number — mean of X",
            "SD_X": "number — SD of X",
            "Y": "number, != 0 — mean of Y",
            "SD_Y": "number — SD of Y"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "X": "number, required — mean of X",
            "SD_X": "number >= 0, required",
            "Y": "number, required, != 0 — mean of Y",
            "SD_Y": "number >= 0, required"
          },
          "paramAliases": {}
        }
      ]
    },
    {
      "id": "Simon2Stage",
      "name": "Simon Two Stage Designs",
      "url": "https://www.smartdatatools.app/Simon2Stage/",
      "description": "Search Simon two-stage Phase II designs meeting target error rates, reporting minimax and optimal designs.",
      "method": "Exact binomial search over (n1, n, r1, r) per Simon (1989).",
      "calculators": [
        {
          "id": "default",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "designs[]",
              "minimaxDesign",
              "optimalDesign"
            ],
            "note": "Best-effort: parsed from the rendered result table since the calculation logic lives in an obfuscated script this project does not modify. If table parsing fails, falls back to { inputs, rawResultText }."
          },
          "params": {
            "min_N1": "integer, 1-500 — minimum stage-1 sample size to search",
            "N1": "integer, 1-500 — starting stage-1 size (search lower bound)",
            "N2": "integer, 2-500 — max total sample size to search",
            "p0": "number, 0-1 — unacceptable response rate (null)",
            "p1": "number, 0-1 — desirable response rate (alternative)",
            "alpha": "number, 0-1, default 0.05 — Type I error",
            "power": "number, 0-1, default 0.8 — target power"
          }
        }
      ]
    },
    {
      "id": "BOIN",
      "name": "BOIN Design",
      "url": "https://www.smartdatatools.app/BOIN/",
      "description": "Bayesian Optimal Interval design for Phase I dose-finding: (a) generate the full escalation/de-escalation decision table, or (b) get a single dose decision for an observed cohort.",
      "method": "Bayesian Optimal Interval (BOIN) design, Yuan/Hess/Liu et al.",
      "calculators": [
        {
          "id": "decisionTable",
          "resultData": {
            "elementId": "result-data-a",
            "outputs": [
              "evaluableSubjects[]",
              "escalateIfDLTLessEq[]",
              "deescalateIfDLTGreaterEq[]"
            ]
          },
          "params": {
            "numDoses": "integer >= 1",
            "startingDose": "integer >= 1",
            "cohortSize": "integer >= 1",
            "numCohorts": "integer >= 1",
            "m": "integer >= 1 — max sample size per dose",
            "phi": "number, 0-1, default 0.30 — target toxicity rate",
            "phi1": "number, optional — lower bound (default 0.6×phi)",
            "phi2": "number, optional — upper bound (default 1.4×phi)",
            "mod1": "'1'/'true'/'yes' to check — modification 1",
            "mod2": "'1'/'true'/'yes' to check — modification 2",
            "accTitration": "'1'/'true'/'yes' to check — accelerated titration"
          }
        },
        {
          "id": "singleDecision",
          "resultData": {
            "elementId": "result-data-b",
            "outputs": [
              "decisionText",
              "decisionCategory",
              "escalationBoundaryLambdaE",
              "deescalationBoundaryLambdaD",
              "observedToxicityRate"
            ]
          },
          "params": {
            "m": "integer >= 1",
            "phi": "number, 0-1, default 0.30",
            "phi1": "number, optional",
            "phi2": "number, optional",
            "n": "integer >= 1 — evaluable subjects in current cohort",
            "x": "integer >= 0 — observed DLTs"
          }
        }
      ]
    },
    {
      "id": "NonInferiority_SampleSize",
      "name": "Non-Inferiority & Equivalence Calculator",
      "url": "https://www.smartdatatools.app/NonInferiority_SampleSize/",
      "description": "Sample size and power for non-inferiority (one-sided) or equivalence (TOST) trials, for means or proportions.",
      "method": "Means: exact noncentral t-distribution (Welch-type). Proportions: normal-approximation z-test. Equivalence power = sum of the two one-sided tests' powers minus 1 (a standard, slightly conservative approximation).",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "total",
              "n1",
              "n2",
              "achieved_power"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80",
            "ss_alpha": "number, 0-0.5 exclusive, default 0.025 — one-sided Type I error",
            "ss_outcome": "'means' or 'proportions'",
            "ss_design": "'ni' (non-inferiority) or 'equiv' (equivalence/TOST)",
            "ss_margin": "number > 0 — non-inferiority/equivalence margin",
            "ss_ratio": "number > 0, default 1 — allocation ratio n2/n1",
            "ss_delta": "number, default 0 — assumed true difference (means mode only)",
            "ss_sd1": "number > 0, default 1 — SD control (means mode only)",
            "ss_sd2": "number > 0, default 1 — SD treatment (means mode only)",
            "ss_p1": "number, 0-1 exclusive — proportion control (proportions mode only)",
            "ss_p2": "number, 0-1 exclusive — assumed proportion treatment (proportions mode only)"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "alpha": "number, 0-0.5 exclusive, default 0.025 — one-sided",
            "outcome": "'means'|'proportions', default 'means'",
            "design": "'ni'|'equiv', default 'ni'",
            "margin": "number > 0, required",
            "ratio": "number > 0, default 1",
            "delta": "number, default 0 (means mode only; proportions mode computes delta = p2 - p1)",
            "sd1": "number > 0, default 1 (means mode)",
            "sd2": "number > 0, default 1 (means mode)",
            "p1": "number, 0-1 exclusive, default 0.3 (proportions mode)",
            "p2": "number, 0-1 exclusive, default 0.3 (proportions mode)"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_outcome": "outcome",
            "ss_design": "design",
            "ss_margin": "margin",
            "ss_ratio": "ratio",
            "ss_delta": "delta",
            "ss_sd1": "sd1",
            "ss_sd2": "sd2",
            "ss_p1": "p1",
            "ss_p2": "p2"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power"
            ]
          },
          "params": {
            "pw_alpha": "number, 0-0.5 exclusive, default 0.025",
            "pw_outcome": "'means' or 'proportions'",
            "pw_design": "'ni' or 'equiv'",
            "pw_margin": "number > 0",
            "pw_n1": "integer >= 2",
            "pw_n2": "integer >= 2",
            "pw_delta": "number, default 0 (means mode)",
            "pw_sd1": "number > 0 (means mode)",
            "pw_sd2": "number > 0 (means mode)",
            "pw_p1": "number, 0-1 exclusive (proportions mode)",
            "pw_p2": "number, 0-1 exclusive (proportions mode)"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "alpha": "number, 0-0.5 exclusive, default 0.025",
            "outcome": "'means'|'proportions', default 'means'",
            "design": "'ni'|'equiv', default 'ni'",
            "margin": "number > 0, required",
            "n1": "integer >= 2, required",
            "n2": "integer >= 2, required",
            "delta": "number, default 0",
            "sd1": "number > 0, default 1",
            "sd2": "number > 0, default 1",
            "p1": "number, 0-1 exclusive, default 0.3",
            "p2": "number, 0-1 exclusive, default 0.3"
          },
          "paramAliases": {
            "pw_alpha": "alpha",
            "pw_outcome": "outcome",
            "pw_design": "design",
            "pw_margin": "margin",
            "pw_n1": "n1",
            "pw_n2": "n2",
            "pw_delta": "delta",
            "pw_sd1": "sd1",
            "pw_sd2": "sd2",
            "pw_p1": "p1",
            "pw_p2": "p2"
          }
        }
      ]
    },
    {
      "id": "ANOVA_SampleSize",
      "name": "One-Way ANOVA Calculator",
      "url": "https://www.smartdatatools.app/ANOVA_SampleSize/",
      "description": "Sample size and power for a one-way, fixed-effects ANOVA comparing 3 or more independent group means (equal n per group).",
      "method": "Cohen's f effect size with the exact noncentral F-distribution (computed via a Poisson-weighted mixture of central F distributions).",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "n_per_group",
              "total",
              "cohens_f",
              "achieved_power"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80",
            "ss_alpha": "number, 0-1 exclusive, default 0.05",
            "ss_k": "integer, 3-10 — number of groups",
            "ss_sd": "number > 0 — common within-group SD",
            "ss_mean_0": "number — mean of group 1 (…up to ss_mean_9 for a 10th group, only ss_k of them are used)"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "k": "integer 3-10, default 3 — number of groups",
            "sd": "number > 0, default 1 — common within-group SD",
            "means": "array of k numbers (preferred), or ss_mean_0..ss_mean_(k-1) aliases"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_k": "k",
            "ss_sd": "sd"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power",
              "cohens_f",
              "total"
            ]
          },
          "params": {
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_k": "integer, 3-10",
            "pw_sd": "number > 0",
            "pw_n": "integer >= 2 — sample size per group",
            "pw_mean_0": "number (…up to pw_mean_9)"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "n_per_group": "integer >= 2, default 20",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "k": "integer 3-10, default 3",
            "sd": "number > 0, default 1",
            "means": "array of k numbers (preferred), or pw_mean_0..pw_mean_(k-1) aliases"
          },
          "paramAliases": {
            "pw_n": "n_per_group",
            "pw_alpha": "alpha",
            "pw_k": "k",
            "pw_sd": "sd"
          }
        }
      ]
    },
    {
      "id": "GroupSequential_Boundaries",
      "name": "Group Sequential Design Boundaries",
      "url": "https://www.smartdatatools.app/GroupSequential_Boundaries/",
      "description": "O'Brien-Fleming or Pocock stopping boundaries for equally-spaced interim analyses in a group sequential trial.",
      "method": "Lan-DeMets alpha-spending functions, boundaries found via recursive numerical integration of the sequential test statistics' joint distribution. Simulation confirms the boundaries control the overall Type I error very closely to the target alpha, within numerical-integration tolerance.",
      "calculators": [
        {
          "id": "boundaries",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "information_fractions",
              "boundaries",
              "cumulative_alpha"
            ]
          },
          "params": {
            "k": "integer, 2-6 — number of equally-spaced analyses",
            "type": "'obf' (O'Brien-Fleming) or 'pocock'",
            "alpha": "number, 0-0.5 exclusive, default 0.05 — overall two-sided Type I error"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "k": "integer 2-6, default 4 — number of equally-spaced analyses",
            "type": "'obf'|'pocock', default 'obf'",
            "alpha": "number, 0-0.5 exclusive, default 0.05 — overall two-sided"
          },
          "paramAliases": {}
        }
      ]
    },
    {
      "id": "McNemar_Test",
      "name": "McNemar's Test Calculator",
      "url": "https://www.smartdatatools.app/McNemar_Test/",
      "description": "Sample size and power for McNemar's test on paired binary outcomes (e.g. before/after on the same subjects, or two raters/tests on the same subjects).",
      "method": "Connor's (1987) normal-approximation formula, parameterized by the odds ratio of the two discordant-pair probabilities and the overall discordant-pair proportion.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "n",
              "p01",
              "p10",
              "achieved_power"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80",
            "ss_alpha": "number, 0-1 exclusive, default 0.05 — two-sided",
            "ss_psi": "number > 0, != 1 — odds ratio p01/p10 of discordant pairs",
            "ss_pdisc": "number, 0-1 exclusive — expected proportion of discordant pairs"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "odds_ratio": "number > 0, != 1, required",
            "p_discordant": "number, 0-1 (0 exclusive), required"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_psi": "odds_ratio",
            "ss_pdisc": "p_discordant"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power",
              "p01",
              "p10"
            ]
          },
          "params": {
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_psi": "number > 0, != 1",
            "pw_pdisc": "number, 0-1 exclusive",
            "pw_n": "integer >= 2 — number of pairs"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "alpha": "number, 0-1 exclusive, default 0.05",
            "odds_ratio": "number > 0, != 1, required",
            "p_discordant": "number, 0-1 (0 exclusive), required",
            "n": "integer >= 2, required"
          },
          "paramAliases": {
            "pw_alpha": "alpha",
            "pw_psi": "odds_ratio",
            "pw_pdisc": "p_discordant",
            "pw_n": "n"
          }
        }
      ]
    },
    {
      "id": "ICC_SampleSize",
      "name": "ICC Sample Size Calculator",
      "url": "https://www.smartdatatools.app/ICC_SampleSize/",
      "description": "Number of subjects needed to estimate a one-way random-effects intraclass correlation coefficient (ICC) with a desired confidence interval width.",
      "method": "Bonett (2002) precision-based sample size formula.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data",
            "outputs": [
              "n"
            ]
          },
          "params": {
            "rho": "number, 0-1 exclusive — expected ICC",
            "k": "integer >= 2 — raters/replicates per subject",
            "width": "number, 0-2 exclusive — desired total CI width",
            "conf": "number, 0-1 exclusive, default 0.95 — confidence level"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "rho": "number, 0-1 exclusive, required — expected ICC",
            "k": "integer >= 2, required — raters/replicates per subject",
            "width": "number, 0-2 exclusive, required — desired total CI width",
            "confidence": "number, 0-1 exclusive, default 0.95"
          },
          "paramAliases": {
            "conf": "confidence"
          }
        }
      ]
    },
    {
      "id": "cutoffFinder",
      "name": "Optimal Cutoff Point",
      "url": "https://www.smartdatatools.app/cutoffFinder/",
      "description": "Find the optimal cutoff point for a binary classifier from a user-uploaded CSV, with bootstrap confidence intervals.",
      "method": "Youden-index-style cutoff search with bootstrap resampling.",
      "urlInvocable": false,
      "note": "Requires an uploaded CSV file (id=fileInput) — not parameterizable via URL query string. Not yet wired for URL autorun or JSON-LD output."
    },
    {
      "id": "AUC_SampleSize",
      "name": "ROC Curve AUC Calculator",
      "url": "https://www.smartdatatools.app/AUC_SampleSize/",
      "description": "Sample size and power for testing whether the area under a ROC curve (AUC) for a diagnostic test/classifier differs from a reference value (typically 0.5, chance-level discrimination).",
      "method": "Hanley-McNeil (1982) approximation to AUC variance (Q1/Q2 under a negative-exponential model), with a normal approximation for power; critical value calibrated under the reference AUC, power evaluated under the anticipated AUC.",
      "calculators": [
        {
          "id": "sampleSize",
          "resultData": {
            "elementId": "result-data-samplesize",
            "outputs": [
              "total",
              "n1",
              "n2"
            ]
          },
          "params": {
            "ss_power": "number, 0-1 exclusive, default 0.80 — target power",
            "ss_alpha": "number, 0-1 exclusive, default 0.05 — Type I error",
            "ss_auc0": "number, 0-1 exclusive, default 0.5 — reference AUC (H0)",
            "ss_auc1": "number, 0-1 exclusive, default 0.75 — anticipated true AUC (H1), must differ from ss_auc0",
            "ss_ratio": "number > 0, default 1 — negative:positive (n2/n1) allocation ratio",
            "ss_sided": "1 (one-sided) or 2 (two-sided), default 2"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "power": "number, 0-1 exclusive, default 0.80",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "auc0": "number, 0-1 exclusive, default 0.5 — reference AUC",
            "auc1": "number, 0-1 exclusive, default 0.75 — anticipated true AUC, must differ from auc0",
            "ratio": "number > 0, default 1 — n2/n1 allocation ratio",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "ss_power": "power",
            "ss_alpha": "alpha",
            "ss_auc0": "auc0",
            "ss_auc1": "auc1",
            "ss_ratio": "ratio",
            "ss_sided": "sided"
          }
        },
        {
          "id": "power",
          "resultData": {
            "elementId": "result-data-power",
            "outputs": [
              "power"
            ]
          },
          "params": {
            "pw_n1": "integer >= 2, default 30 — number of positive/diseased subjects",
            "pw_n2": "integer >= 2, default 30 — number of negative/non-diseased subjects",
            "pw_auc0": "number, 0-1 exclusive, default 0.5 — reference AUC (H0)",
            "pw_auc1": "number, 0-1 exclusive, default 0.75 — anticipated true AUC (H1)",
            "pw_alpha": "number, 0-1 exclusive, default 0.05",
            "pw_sided": "1 or 2, default 2"
          },
          "engineInvocable": true,
          "paramsCanonical": {
            "n1": "integer >= 2, default 30",
            "n2": "integer >= 2, default 30",
            "auc0": "number, 0-1 exclusive, default 0.5",
            "auc1": "number, 0-1 exclusive, default 0.75",
            "alpha": "number, 0-1 exclusive, default 0.05",
            "sided": "1|2|'one-sided'|'two-sided'|'one.sided'|'two.sided'|'one_sided'|'two_sided', default 2"
          },
          "paramAliases": {
            "pw_n1": "n1",
            "pw_n2": "n2",
            "pw_auc0": "auc0",
            "pw_auc1": "auc1",
            "pw_alpha": "alpha",
            "pw_sided": "sided"
          }
        }
      ]
    }
  ],
  "engine": {
    "version": "1.2.0",
    "url": "https://www.smartdatatools.app/engine/engine.mjs",
    "export": "calculate",
    "runtime": "ESM, no DOM, Node 18+",
    "coverage": "TTest_SampleSize, PearsonChisqr_SampleSize, OneSample_TTest_SampleSize, pairedTTest_wo_R, OneSampleProp_Samplesize, CIcalculator, SDratio, SurvivalAnalysis_SampleSize, ANOVA_SampleSize, NonInferiority_SampleSize, GroupSequential_Boundaries, McNemar_Test, ICC_SampleSize, AUC_SampleSize. BOIN and Simon2Stage are not covered: their deployed scripts are obfuscated and no clear source exists in this repo. cutoffFinder needs a file upload and is not engine-invocable either way.",
    "example": "import { calculate } from './engine.mjs'; calculate({ tool: 'TTest_SampleSize', calculator: 'sampleSize', params: { mean1: 0, sd1: 1, mean2: 0.5, sd2: 1 } })"
  }
}
