Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Clinical pharmacology principles for dosing, drug interactions, and patient s...
.claude/skills/brycewang-stanford-clinical-pharmacology-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 25% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 57% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 60% | 0% |
A skill for applying clinical pharmacology principles to research and practice. Covers pharmacokinetic/pharmacodynamic modeling, drug interaction assessment, therapeutic drug monitoring, and special population dosing.
The most widely used PK/PD model relates drug concentration to effect:
pythonimport numpy as np import matplotlib.pyplot as plt def emax_model(concentration: np.ndarray, emax: float, ec50: float, hill: float = 1, baseline: float = 0) -> np.ndarray: """ Sigmoid Emax (Hill) model. Args: concentration: Drug concentration array emax: Maximum effect ec50: Concentration producing 50% of Emax hill: Hill coefficient (steepness) baseline: Baseline effect (E0) """ effect = baseline + (emax * concentration**hill) / (ec50**hill + concentration**hill) return effect # Example: dose-response curve conc = np.logspace(-2, 3, 200) effect = emax_model(conc, emax=100, ec50=10, hill=1.5) fig, ax = plt.subplots(figsize=(8, 5)) ax.semilogx(conc, effect) ax.set_xlabel('Concentration (ng/mL)') ax.set_ylabel('Effect (%)') ax.set_title('Sigmoid Emax Model') ax.axhline(y=50, color='gray', linestyle='--', alpha=0.5) ax.axvline(x=10, color='gray', linestyle='--', alpha=0.5) ax.annotate('EC50', xy=(10, 50), fontsize=12) plt.tight_layout()
pythondef predict_cyp_interaction(victim_drug: dict, perpetrator_drug: dict) -> dict: """ Predict metabolic drug-drug interaction potential. Args: victim_drug: {'name': str, 'primary_cyp': str, 'fraction_metabolized': float} perpetrator_drug: {'name': str, 'cyp_effects': dict} cyp_effects maps CYP enzyme to 'inhibitor'|'inducer'|'none' """ cyp = victim_drug['primary_cyp'] fm = victim_drug['fraction_metabolized'] # fraction metabolized by this CYP perp_effect = perpetrator_drug['cyp_effects'].get(cyp, 'none') if perp_effect == 'inhibitor': # AUC ratio = 1 / (1 - fm) for complete inhibition auc_ratio = 1 / (1 - fm) if fm < 1 else float('inf') risk = 'high' if auc_ratio > 5 else 'moderate' if auc_ratio > 2 else 'low' elif perp_effect == 'inducer': # Induction decreases exposure auc_ratio = 1 - fm * 0.7 # approximate 70% induction risk = 'high' if auc_ratio < 0.3 else 'moderate' if auc_ratio < 0.5 else 'low' else: auc_ratio = 1.0 risk = 'none' return { 'victim': victim_drug['name'], 'perpetrator': perpetrator_drug['name'], 'affected_cyp': cyp, 'interaction_type': perp_effect, 'predicted_auc_ratio': round(auc_ratio, 2), 'clinical_risk': risk, 'recommendation': ( 'Dose adjustment required' if risk == 'high' else 'Monitor closely' if risk == 'moderate' else 'No action needed' ) }
Drugs requiring routine TDM due to narrow therapeutic windows:
| Drug | Therapeutic Range | Toxic Level | Monitoring Frequency | |------|------------------|-------------|---------------------| | Vancomycin | AUC/MIC 400-600 | AUC/MIC > 600 | Trough before 4th dose | | Lithium | 0.6-1.2 mEq/L | > 1.5 mEq/L | Weekly initially, then monthly | | Digoxin | 0.8-2.0 ng/mL | > 2.0 ng/mL | At steady state (5-7 days) | | Phenytoin | 10-20 mcg/mL | > 20 mcg/mL | 2 weeks after dose change | | Tacrolimus | 5-15 ng/mL | > 20 ng/mL | Twice weekly post-transplant |
pythondef bayesian_dose_adjustment(prior_cl: float, prior_cl_cv: float, measured_conc: float, expected_conc: float, current_dose: float) -> dict: """ Simple Bayesian dose adjustment using one-point TDM. Args: prior_cl: Population clearance estimate (L/hr) prior_cl_cv: CV of clearance in population (0-1) measured_conc: Observed trough concentration expected_conc: Expected concentration at population CL current_dose: Current dose (mg) """ # Individual clearance estimate (MAP approach, simplified) ratio = expected_conc / measured_conc individual_cl = prior_cl * ratio # Bayesian shrinkage toward population weight = 1 / (1 + prior_cl_cv**2) posterior_cl = weight * prior_cl + (1 - weight) * individual_cl # New dose to achieve target target_conc = (measured_conc + expected_conc) / 2 # midpoint of range new_dose = current_dose * (posterior_cl / prior_cl) return { 'individual_CL': round(individual_cl, 2), 'posterior_CL': round(posterior_cl, 2), 'recommended_dose': round(new_dose, 1), 'dose_change_pct': round((new_dose - current_dose) / current_dose * 100, 1) }
Dosing considerations for specific patient groups:
All clinical pharmacology studies should follow ICH guidelines (E4 for dose-response, E5 for ethnic factors, E7 for geriatric, E11 for pediatric). Report results in standardized population PK/PD formats compatible with FDA and EMA submission requirements.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 30,000 | 29,747 | -1% | 1 | 1 | 0% | 6,484 | 7,242 | +12% | 0 | 0 | — |
case-02 | fail→fail | 44,278 | 16,668 | -62% | 1 | 1 | 0% | 8,065 | 4,956 | -39% | 0 | 0 | — |
case-03 | fail→pass | 49,484 | 39,532 | -20% | 1 | 1 | 0% | 8,259 | 9,097 | +10% | 0 | 0 | — |
case-04 | pass→pass | 17,791 | 12,905 | -27% | 1 | 1 | 0% | 3,388 | 4,230 | +25% | 0 | 0 | — |
case-05 | pass→pass | 18,802 | 19,160 | +2% | 1 | 1 | 0% | 3,064 | 4,802 | +57% | 0 | 0 | — |
case-06 | fail→fail | 21,868 | 15,738 | -28% | 1 | 1 | 0% | 3,444 | 4,271 | +24% | 0 | 0 | — |
case-07 | fail→fail | 13,885 | 11,304 | -19% | 1 | 1 | 0% | 2,276 | 3,443 | +51% | 0 | 0 | — |
case-08 | pass→pass | 15,538 | 14,996 | -3% | 1 | 1 | 0% | 2,501 | 4,013 | +60% | 0 | 0 | — |
case-09 | fail→fail | 18,370 | 24,523 | +33% | 1 | 1 | 0% | 2,857 | 6,080 | +113% | 0 | 0 | — |
case-10 | pass→pass | 25,148 | 28,320 | +13% | 1 | 1 | 0% | 4,512 | 7,149 | +58% | 0 | 0 | — |
case-11 | pass→pass | 21,432 | 29,260 | +37% | 1 | 1 | 0% | 3,441 | 7,028 | +104% | 0 | 0 | — |
case-12 | pass→pass | 17,564 | 17,563 | -0% | 1 | 1 | 0% | 2,835 | 4,664 | +65% | 0 | 0 | — |
case-13 | pass→pass | 19,050 | 26,540 | +39% | 1 | 1 | 0% | 3,178 | 6,087 | +92% | 0 | 0 | — |
case-14 | fail→fail | 19,945 | 25,781 | +29% | 1 | 1 | 0% | 3,183 | 5,856 | +84% | 0 | 0 | — |
case-15 | fail→fail | 16,882 | 16,293 | -3% | 1 | 1 | 0% | 2,972 | 4,828 | +62% | 0 | 0 | — |
case-16 | fail→pass | 14,387 | 7,203 | -50% | 1 | 1 | 0% | 2,561 | 3,075 | +20% | 0 | 0 | — |
case-17 | pass→pass | 6,863 | 7,942 | +16% | 1 | 1 | 0% | 1,230 | 2,928 | +138% | 0 | 0 | — |
case-18 | pass→pass | 21,646 | 23,241 | +7% | 1 | 1 | 0% | 3,439 | 5,401 | +57% | 0 | 0 | — |
case-19 | pass→pass | 16,375 | 16,940 | +3% | 1 | 1 | 0% | 3,176 | 4,880 | +54% | 0 | 0 | — |
case-20 | pass→pass | 11,749 | 20,348 | +73% | 1 | 1 | 0% | 2,008 | 4,889 | +143% | 0 | 0 | — |
case-21 | pass→pass | 20,359 | 17,388 | -15% | 1 | 1 | 0% | 3,185 | 4,449 | +40% | 0 | 0 | — |
case-22 | pass→pass | 15,652 | 16,938 | +8% | 1 | 1 | 0% | 2,599 | 4,165 | +60% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.