Skip to content
Back to skills

Model Calibration Curve

ASecurity

Use when assessing how well a survival model's predicted probabilities agree with observed outcomes by fitting a Cox model and generating bootstrap calibration curves at one or more prediction horizons from a clinical CSV file. NOT for: nomogram construction, univariate Cox screening, ROC analysis, or decision-curve analysis.

  • 1,793 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 6, 2026
datagoshellbashtestingperformance

Works with

  • cli

Security analysis

A100/100

Pro scans all 12 files and shows the line behind each finding

Scanned June 6, 2026

npx -y skills add aipoch/medical-research-skills --skill model-calibration-curve --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Model Calibration Curve?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Model Calibration Curve
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aipoch-model-calibration-curve/badge)](https://www.skillsdirectory.com/skills/aipoch-model-calibration-curve)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: model-calibration-curve
description: "Use when assessing how well a survival model's predicted probabilities agree with observed outcomes by fitting a Cox model and generating bootstrap calibration curves at one or more prediction horizons from a clinical CSV file. NOT for: nomogram construction, univariate Cox screening, ROC analysis, or decision-curve analysis."
license: MIT
skill-author: AIPOCH
---

# Model Calibration Curve

## When to Use

Use this skill when you need to:
- validate a survival model with bootstrap calibration curves;
- compare predicted and observed survival probabilities at multiple horizons;
- export calibration statistics together with a PDF visualization.

Typical user requests:
- "Generate 1-, 2-, and 3-year calibration curves for this prognosis model."
- "Check whether the Cox model built from age, gender, and risk is well calibrated."
- "Export calibration statistics and a calibration PDF from this clinical cohort."

## When Not to Use

Do not use this skill for:
- nomogram construction;
- univariate or multivariable Cox feature screening;
- ROC, calibration-free discrimination, or decision-curve analysis;
- non-survival endpoints or multiclass classification tasks.

## When to Read External Files

| Situation | File to Read | Purpose |
|-----------|--------------|---------|
| Need algorithm details | `references/algorithm.md` | Statistical method and formulas |
| Need to run analysis | `scripts/main.R` | Get the complete command |
| Encounter errors | `references/troubleshooting.md` | Find solutions |
| Need CLI examples | `references/cli-guide.md` | Parameter usage examples |

## Input Validation

This skill accepts:

- A clinical CSV file with sample IDs as row names, survival time, event indicator, and pre-selected prognostic features
- Requests to assess calibration of a survival (Cox) model via bootstrap resampling at one or more prediction horizons

If the user's request does not involve survival model calibration from a clinical CSV file — for example, asking to construct a nomogram, screen Cox features, generate an ROC curve, analyze a decision curve, or work with non-survival outcomes — do not proceed with this workflow. Instead respond:

> "model-calibration-curve is designed to validate survival model calibration by generating bootstrap calibration curves from a clinical CSV file. Your request appears to be outside this scope. Please use a nomogram-construction skill for nomogram building, a roc-diagnostic-performance skill for ROC analysis, or a decision-curve-analysis skill for DCA."

---

## Prerequisites

R packages required: `rms`, `qs`, `openxlsx`, `optparse`.

Install with:
```r
install.packages(c("rms", "qs", "openxlsx", "optparse"), repos = "https://cloud.r-project.org")
```

Or run the bootstrap installer:
```bash
Rscript scripts/install_dependencies.R
```

> Note: `--help` requires `optparse` to be loaded. If the package check fires before option parsing, install `optparse` first, then run `--help`. The root fix (deferring heavy package checks until after argument parsing) must be applied in `scripts/main.R`.

---

## Usage

```bash
Rscript scripts/main.R \
  --data_file ./clinical_data.csv \
  --features age,stage,risk \
  --years 1,2,3 \
  --output_dir ./output/
```

---

## Arguments

| Short | Long | Type | Default | Description |
|-------|------|------|---------|-------------|
| `-d` | `--data_file` | character | **required** | Clinical CSV file with sample IDs as row names |
| `-f` | `--features` | character | **required** | Comma-separated model features used in the Cox model |
| `-t` | `--time_col` | character | `futime` | Survival time column |
| `-e` | `--event_col` | character | `fustat` | Event indicator column using 0/1 encoding |
| `-y` | `--years` | character | `1,2,3` | Prediction horizons in the same units as `time_col` |
| `-b` | `--bootstrap_reps` | integer | `1000` | Bootstrap replications for `rms::calibrate()` |
| `-o` | `--output_dir` | character | `./output/` | Output directory |
|  | `--overwrite` | flag | `FALSE` | Allow writing into a non-empty output directory |
| `-s` | `--seed` | integer | `42` | Random seed for reproducibility |
| `-T` | `--timeout_seconds` | integer | `0` | Elapsed time limit in seconds; `0` disables timeout |
|  | `--plot_width` | double | `6` | PDF width in inches |
|  | `--plot_height` | double | `6` | PDF height in inches |
|  | `--font_family` | character | `sans` | PDF font family |
|  | `--line_width` | double | `1.5` | Calibration curve line width |
|  | `--colors` | character | `#0073C2,#EFC000,#868686,#CD534C,#7AA6DD` | Comma-separated colors for time-point curves |
|  | `--plot_title` | character | `Calibration Curve` | Plot title |
|  | `--base_cex` | double | `0.9` | Base text-size multiplier |

---

## Input Format

### Clinical Data (`--data_file`)

CSV file with row names as sample IDs and columns for model features, survival time, and event indicator.

```csv
"",age,gender,stage,futime,fustat,risk
"SAMPLE_001",">65","Female","StageI&II",1.12,0,"high"
"SAMPLE_002","<=65","Male","StageIII&IV",1.92,1,"high"
"SAMPLE_003",">65","Male","StageI&II",4.47,1,"low"
```

**Requirements**
- File extension must be `.csv`.
- Row names must be unique sample IDs.
- All requested features plus `time_col` and `event_col` must exist.
- Survival time values must be finite numbers greater than `0`.
- Event values must use `0/1` encoding.
- Complete-case filtering must leave at least 30 samples and at least 10 events.

### Feature Selection (`--features`)

- Comma-separated without line breaks: `age,gender,risk`
- Character predictors are converted to factors before Cox fitting.
- If every requested feature is absent after validation, the run stops.

---

## Output Files

| File | Format | Description |
|------|--------|-------------|
| `data/calibration_data.qs` | QS serialized object | Serialized calibration result bundle, including calibration objects and summary metadata |
| `table/calibration_statistics.xlsx` | Excel workbook (`.xlsx`) | Per-time-point means and overall model summary |
| `plot/calibration_curve.pdf` | PDF (`.pdf`) | Combined calibration curve visualization |
| `session_info.txt` | Plain text (`.txt`) | Session information and run parameters |

### `calibration_statistics.xlsx`

Workbook sheets:
- `Time_Point_Stats`: predicted mean, observed mean, and bias-corrected mean for each calibration horizon.
- `Model_Summary`: overall C-index, sample count, event count, selected features, and fitted formula.

---

## Workflow

### Step 1: Validate Input
- Confirm the clinical CSV exists and is readable.
- Check that requested features, survival time, and event columns are present.
- Remove incomplete rows across all required columns.

### Step 2: Prepare Survival Modeling Data
- Convert survival time and event columns to numeric.
- Convert character predictors to factors.
- Reject data with non-positive follow-up times, invalid event coding, too few samples, or too few events.

### Step 3: Build Calibration Models
- Fit a Cox proportional hazards model with the requested features.
- Run `rms::calibrate()` for each prediction horizon using bootstrap resampling.
- Compute the concordance index for the fitted model.

### Step 4: Save Outputs
- Serialize the calibration result bundle as `.qs`.
- Export statistics to Excel.
- Render a combined calibration PDF.
- Record session metadata for reproducibility.

---

## Examples

### Basic Calibration Analysis

```bash
Rscript scripts/main.R \
  --data_file clinical_data.csv \
  --features age,stage,risk \
  --output_dir ./output/
```

### Custom Horizons And Bootstrap Count

```bash
Rscript scripts/main.R \
  --data_file clinical_data.csv \
  --features age,gender,risk \
  --years 1,3,5 \
  --bootstrap_reps 1500 \
  --output_dir ./custom_output/
```

### Custom Plot Styling

```bash
Rscript scripts/main.R \
  --data_file clinical_data.csv \
  --features age,stage,risk \
  --plot_width 7 \
  --plot_height 6 \
  --line_width 2 \
  --colors "#1B9E77,#D95F02,#7570B3" \
  --plot_title "Three-Horizon Calibration" \
  --output_dir ./styled_output/
```

### With Bundled Test Data

```bash
Rscript scripts/main.R \
  --data_file tests/data/sample_clinical_survival_data.csv \
  --features age,gender,risk \
  --bootstrap_reps 20 \
  --output_dir tests/output/ \
  --overwrite
```

---

## Error Handling

| Error | Cause | Solution |
|-------|-------|----------|
| `SKILL_INVALID_PARAMETER` | Missing required argument, invalid numeric values, invalid event coding, insufficient complete cases, insufficient events, or failed model fitting | Check argument values, data validity, and event/sample counts |
| `SKILL_FILE_NOT_FOUND` | Input CSV does not exist | Verify the path |
| `SKILL_MISSING_COLUMNS` | Required feature/time/event columns are absent | Check column names and spelling |
| `SKILL_EMPTY_DATA` | Input file is empty, complete-case filtering removed all rows, or no requested features remained | Check file content and requested feature names |
| `SKILL_SAMPLE_MISMATCH` | Reserved for cross-file sample mismatch scenarios | Not expected for this single-file workflow |
| `SKILL_PACKAGE_NOT_FOUND` | Required R package is missing | Install with: `Rscript -e "install.packages(c('rms', 'qs', 'openxlsx'), repos='https://cloud.r-project.org')"` |

**IF error persists**, READ: `references/troubleshooting.md`

---

## Testing

### Smoke Test With Included Data

```bash
Rscript scripts/main.R --help

Rscript scripts/main.R \
  --data_file tests/data/sample_clinical_survival_data.csv \
  --features age,gender,risk \
  --bootstrap_reps 20 \
  --output_dir tests/output/ \
  --overwrite
```

### Automated Smoke Test Script

```bash
Rscript tests/run_smoke_test.R
```

Optional shell wrapper:

```bash
bash tests/run_smoke_test.sh
```

### Expected Output

```text
tests/output/
|-- data/calibration_data.qs
|-- plot/calibration_curve.pdf
|-- session_info.txt
`-- table/calibration_statistics.xlsx
```

---

## References

1. Harrell FE. *Regression Modeling Strategies*.
2. Steyerberg EW et al. Assessing the performance of prediction models.
3. Austin PC, Steyerberg EW. Graphical assessment of calibration for survival models.

**For detailed algorithm**, READ: `references/algorithm.md`

---

## Implementation Checklist

- [x] CLI parsing with `optparse`
- [x] `set.seed()` for reproducibility
- [x] Top-level CRAN dependency checks
- [x] Session info recording
- [x] Timeout parameter exposed as CLI option
- [x] Relative-path `source()` usage via `get_script_dir()`
- [x] Modular script structure in `scripts/`
- [x] Test data provided in `tests/data/`
- [x] Error handling with `SKILL_*` codes
- [x] Reference docs provided in `references/`

---

*Last updated: 2026-04-27 | Version: 2.1.0*

Files in this skill

  • SKILL.md10.6 KB
  • eval_report_model-calibration-curve_result.json13.2 KB
  • references/algorithm.md3 KB
  • references/cli-guide.md2.1 KB
  • references/troubleshooting.md2.7 KB
  • scripts/functions.R5.4 KB
  • scripts/main.R4.6 KB
  • scripts/run_analysis.R4.5 KB
  • scripts/utils.R4.4 KB
  • tests/data/sample_clinical_survival_data.csv42.1 KB
  • tests/run_smoke_test.R1.9 KB
  • tests/run_smoke_test.sh127 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.