How to calculate insulin dose

Reading File
Finding Sources
Finding Sources
Finding Sources
Searching the Web

how to calculate insulin dose basal bolus weight-based formula

Searching PubMed

"insulin dosing" AND algorithm

Reading File
Reading File

How to Calculate an Insulin Dose

Insulin dosing is individualized, but the standard clinical approach follows a stepwise process: estimate the total daily dose (TDD), split it into basal and bolus (prandial) components, then fine-tune meal doses with an insulin-to-carb ratio and a correction factor. Below is the framework used across major references (Harrison's, Goldman-Cecil, Tintinalli's, Washington Manual, Textbook of Family Medicine).

1. Estimate the Total Daily Dose (TDD)

TDD is weight-based and depends on diabetes type and insulin sensitivity:
  • Type 1 diabetes: 0.4-1.0 units/kg/day (typical starting point ~0.5 units/kg/day for a metabolically stable patient). A common teaching formula is simply weight (kg) x 0.5-0.7 - Textbook of Family Medicine, p. 989; Tintinalli's Emergency Medicine.
  • Type 2 diabetes (insulin-naive, starting basal only): often lower, roughly 0.1-0.2 units/kg/day or a flat 10 units/day to start, titrated upward.
  • Insulin resistance (obesity, steroids, infection): may need up to 1.0-1.5+ units/kg/day.
  • Insulin-sensitive patients (renal impairment, elderly, lean): use the lower end, 0.3-0.5 units/kg/day, to reduce hypoglycemia risk.
Example: a 70 kg patient x 0.5-0.7 units/kg ≈ 35-49 units/day total.

2. Split TDD into Basal and Bolus

  • Basal: ~50% of TDD (range 40-50%), given as one long-acting injection (glargine, detemir, degludec) or as a pump basal rate - Goldman-Cecil Medicine; Fuster & Hurst's The Heart.
  • Bolus/prandial: remaining ~50%, divided across meals (roughly equally, or weighted toward the largest meal).
Example: TDD 40 units -> 20 units basal (once daily) + 20 units bolus, split ~6-7 units per meal (3 meals).

3. Calculate Mealtime (Bolus) Dose Using Insulin-to-Carb Ratio (ICR)

The ICR tells you how many grams of carbohydrate 1 unit of rapid-acting insulin covers.
  • Starting estimate ("500 rule"): ICR = 500 / TDD. E.g., TDD = 50 units -> 500/50 = 1 unit per 10 g carb (1:10).
  • A common typical adult ratio is 1 unit per 10-15 g carbohydrate - Harrison's Principles of Internal Medicine, 22nd ed., p. 1090.
  • Meal bolus dose = grams of carbohydrate in the meal ÷ ICR

4. Add a Correction (Sliding Scale) Dose for Hyperglycemia

Uses a correction factor (CF), i.e., insulin sensitivity factor, which estimates how much 1 unit lowers blood glucose.
  • Starting estimate ("1800 rule" for rapid-acting, or "1500 rule" for regular insulin): CF = 1800 / TDD (mg/dL drop per unit).
  • Correction dose = (current blood glucose - target blood glucose) ÷ CF
Total prandial dose given at a meal = carb-coverage dose + correction dose (if glucose is above target). Avoid "stacking" corrections by accounting for insulin already on board.

5. Titrate

  • Adjust basal insulin by ~1-2 units (or 10-20%) every few days based on fasting glucose trends until fasting glucose is at target (commonly <100-130 mg/dL).
  • Adjust prandial/ICR based on 2-hour postprandial glucose (<180 mg/dL) and pattern review, not single readings.
  • Reassess after any illness, steroid use, activity changes, or renal/hepatic function changes.

Special Situations (brief)

  • Pregnancy: insulin requirements rise progressively; by late third trimester bolus insulin may reach ~75% of TDD (vs ~50% pre-pregnancy) - Creasy & Resnik's Maternal-Fetal Medicine.
  • Pediatrics: pump therapy uses the same three components (basal rate, ICR, correction factor) but doses are scaled to body size and adjusted more frequently - Harriet Lane Handbook, 23rd ed.
  • Inpatient/perioperative: ICR, correction factor, basal regimen, and glucose targets should be verified preoperatively and often reduced for fasting patients - Barash's Clinical Anesthesia.
  • IV insulin (DKA/critical illness): uses separate weight-based infusion protocols (typically 0.1 unit/kg/hr), not the subcutaneous TDD method above.

Important Caveats

These are starting estimates only - actual dosing must be individualized and supervised by the treating clinician or diabetes team, with frequent blood glucose monitoring (or CGM) to titrate safely and avoid hypoglycemia. Formulas differ slightly between references (e.g., 0.5, 0.55, or 0.7 units/kg for TDD), reflecting that these are teaching heuristics, not fixed rules.
A recent systematic review notes growing interest in machine-learning-based dose titration tools for basal insulin in type 2 diabetes, though these remain investigational and haven't replaced standard weight-based/ratio methods in guidelines (Thomsen et al., 2024, PMID: 36562599).

Create a quick reference PDF with insulin dosing formulas and calculations

Reading File
Running Command

mkdir -p /tmp/workspace/insulin-dosing-reference && ls -la /tmp/workspace/

Writing File

~/insulin-dosing-reference/build_pdf.py

#!/usr/bin/env python3
"""Build an Insulin Dosing Quick Reference PDF."""

from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    ListFlowable, ListItem, HRFlowable, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT

styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    "TitleStyle", parent=styles["Title"], fontSize=18, textColor=colors.HexColor("#1a3a5c"),
    spaceAfter=2, alignment=TA_CENTER
)
subtitle_style = ParagraphStyle(
    "SubtitleStyle", parent=styles["Normal"], fontSize=9.5, textColor=colors.HexColor("#555555"),
    alignment=TA_CENTER, spaceAfter=12
)
h1_style = ParagraphStyle(
    "H1", parent=styles["Heading1"], fontSize=13, textColor=colors.white,
    backColor=colors.HexColor("#1a3a5c"), spaceBefore=10, spaceAfter=8,
    leftIndent=6, borderPadding=(4, 4, 4, 4)
)
h2_style = ParagraphStyle(
    "H2", parent=styles["Heading2"], fontSize=11, textColor=colors.HexColor("#1a3a5c"),
    spaceBefore=8, spaceAfter=4
)
body_style = ParagraphStyle(
    "Body", parent=styles["Normal"], fontSize=9.5, leading=13, spaceAfter=4
)
formula_style = ParagraphStyle(
    "Formula", parent=styles["Normal"], fontSize=10.5, leading=14, spaceAfter=4,
    textColor=colors.HexColor("#7a1f1f"), fontName="Helvetica-Bold",
    backColor=colors.HexColor("#f7f0f0"), borderPadding=(6, 6, 6, 6),
    leftIndent=4, rightIndent=4
)
example_style = ParagraphStyle(
    "Example", parent=styles["Normal"], fontSize=9, leading=12.5, spaceAfter=4,
    textColor=colors.HexColor("#2d5a2d"), fontName="Helvetica-Oblique",
    leftIndent=8
)
caution_style = ParagraphStyle(
    "Caution", parent=styles["Normal"], fontSize=8.8, leading=12, spaceAfter=4,
    textColor=colors.HexColor("#7a1f1f")
)
source_style = ParagraphStyle(
    "Source", parent=styles["Normal"], fontSize=7.3, leading=9.5, textColor=colors.HexColor("#888888")
)
footer_style = ParagraphStyle(
    "Footer", parent=styles["Normal"], fontSize=7.5, textColor=colors.HexColor("#999999"),
    alignment=TA_CENTER
)

def table_default_style(header_bg="#1a3a5c"):
    return TableStyle([
        ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor(header_bg)),
        ("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
        ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
        ("FONTSIZE", (0, 0), (-1, -1), 8.7),
        ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#f2f2f2")]),
        ("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#cccccc")),
        ("VALIGN", (0, 0), (-1, -1), "TOP"),
        ("LEFTPADDING", (0, 0), (-1, -1), 5),
        ("RIGHTPADDING", (0, 0), (-1, -1), 5),
        ("TOPPADDING", (0, 0), (-1, -1), 4),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
    ])

story = []

# ---- Title ----
story.append(Paragraph("Insulin Dosing Quick Reference", title_style))
story.append(Paragraph(
    "Formulas &amp; worked calculations for basal-bolus insulin dosing &bull; Adult, non-critical-care setting",
    subtitle_style
))
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor("#1a3a5c")))
story.append(Spacer(1, 8))

# ---- Caution box up top ----
story.append(Paragraph(
    "&#9888; These are standard teaching formulas for STARTING doses only. Always individualize based on "
    "renal/hepatic function, age, hypoglycemia history, and clinical judgment. Titrate using home glucose "
    "monitoring / CGM data, not a single reading.",
    caution_style
))
story.append(Spacer(1, 6))

# ---- Section 1: TDD ----
story.append(Paragraph("1. Total Daily Dose (TDD)", h1_style))
story.append(Paragraph(
    "TDD is the foundation for all subsequent calculations. It is weight-based and depends on diabetes type "
    "and insulin sensitivity.", body_style
))

tdd_data = [
    ["Population / Context", "Typical TDD (units/kg/day)"],
    ["Type 1 DM (metabolically stable, starting dose)", "0.4 - 1.0 (commonly ~0.5)"],
    ["Type 1 DM - simple estimate", "Weight (kg) x 0.5 - 0.7"],
    ["Type 2 DM, insulin-naive (starting basal only)", "0.1 - 0.2 (or flat 10 units/day)"],
    ["Insulin-resistant (obesity, steroids, infection, T2DM advanced)", "up to 1.0 - 1.5+"],
    ["Insulin-sensitive (renal impairment, elderly, lean)", "0.3 - 0.5 (use lower end)"],
]
t = Table(tdd_data, colWidths=[3.5*inch, 2.6*inch])
t.setStyle(table_default_style())
story.append(t)
story.append(Spacer(1, 6))

story.append(Paragraph("TDD = Weight (kg) &times; units/kg/day (from table above)", formula_style))
story.append(Paragraph(
    "Example: 70 kg patient, T1DM &rarr; 70 kg &times; 0.5-0.7 units/kg &asymp; <b>35-49 units/day</b>",
    example_style
))
story.append(Paragraph(
    "Source: Textbook of Family Medicine 9e, p.989; Tintinalli's Emergency Medicine; Goldman-Cecil Medicine; "
    "Washington Manual of Medical Therapeutics", source_style
))

# ---- Section 2: Basal / Bolus split ----
story.append(Paragraph("2. Basal / Bolus Split", h1_style))
story.append(Paragraph(
    "Once TDD is known, split it roughly evenly between basal (background) and bolus (prandial/meal) insulin.",
    body_style
))

split_data = [
    ["Component", "% of TDD", "Notes"],
    ["Basal (glargine, detemir, degludec, or pump basal rate)", "40 - 50%", "Given once daily (or pump-continuous); controls fasting/overnight glucose"],
    ["Bolus / Prandial (rapid-acting: lispro, aspart, glulisine)", "50 - 60%", "Divided across meals, proportional to carb content"],
]
t2 = Table(split_data, colWidths=[3.0*inch, 1.0*inch, 2.1*inch])
t2.setStyle(table_default_style())
story.append(t2)
story.append(Spacer(1, 6))

story.append(Paragraph("Basal dose = 50% &times; TDD &nbsp;&nbsp;|&nbsp;&nbsp; Bolus dose (total/day) = 50% &times; TDD", formula_style))
story.append(Paragraph(
    "Example: TDD = 40 units &rarr; Basal = 20 units (once daily) + Bolus = 20 units total, split "
    "&asymp; 6-7 units per meal across 3 meals",
    example_style
))
story.append(Paragraph(
    "Some patients need a 40/60 split favoring bolus. Titrate basal by ~1-2 units (or 10-20%) every "
    "few days based on fasting glucose trend until fasting BG &lt;100-130 mg/dL.", body_style
))
story.append(Paragraph(
    "Source: Fuster &amp; Hurst's The Heart, 15th ed.; Goodman &amp; Gilman's Pharmacological Basis of "
    "Therapeutics; Textbook of Family Medicine 9e, p.989-990", source_style
))

story.append(PageBreak())

# ---- Section 3: Insulin-to-Carb Ratio ----
story.append(Paragraph("3. Meal (Bolus) Dose: Insulin-to-Carb Ratio (ICR)", h1_style))
story.append(Paragraph(
    "ICR = grams of carbohydrate covered by 1 unit of rapid-acting insulin. Estimate a starting ratio "
    "with the <b>500 Rule</b>, then adjust from actual postprandial responses.", body_style
))

story.append(Paragraph("ICR (starting estimate) = 500 &divide; TDD", formula_style))
story.append(Paragraph(
    "Example: TDD = 50 units &rarr; 500 &divide; 50 = ICR of 1:10 (1 unit covers 10 g carbohydrate)",
    example_style
))
story.append(Paragraph(
    "Typical adult range: 1 unit per 10-15 g carbohydrate (Harrison's Principles of Internal Medicine, "
    "22nd ed., p.1090).", body_style
))

story.append(Paragraph("Meal bolus dose = Grams of carbohydrate in meal &divide; ICR", formula_style))
story.append(Paragraph(
    "Example: ICR = 1:10, meal has 60 g carbs &rarr; 60 &divide; 10 = <b>6 units</b> before the meal",
    example_style
))

# ---- Section 4: Correction Factor ----
story.append(Paragraph("4. Correction (Sliding-Scale) Dose: Correction Factor (CF)", h1_style))
story.append(Paragraph(
    "CF (a.k.a. insulin sensitivity factor) = mg/dL drop in blood glucose per 1 unit of rapid-acting insulin.",
    body_style
))

story.append(Paragraph("CF (starting estimate) = 1800 &divide; TDD &nbsp;(rapid-acting) &nbsp;|&nbsp; 1500 &divide; TDD (regular insulin)", formula_style))
story.append(Paragraph(
    "Example: TDD = 50 units, rapid-acting &rarr; 1800 &divide; 50 = CF of 36 (1 unit lowers glucose &asymp;36 mg/dL)",
    example_style
))

story.append(Paragraph("Correction dose = (Current BG &minus; Target BG) &divide; CF", formula_style))
story.append(Paragraph(
    "Example: Current BG = 250 mg/dL, target = 130 mg/dL, CF = 36 &rarr; (250&minus;130) &divide; 36 "
    "= 120 &divide; 36 &asymp; <b>3.3 &rarr; 3 units</b>",
    example_style
))

story.append(Paragraph(
    "Total mealtime dose = Carb-coverage dose + Correction dose (only add correction if BG is above target). "
    "Do not stack corrections - account for insulin already on board before correcting again.", body_style
))
story.append(Paragraph(
    "Source: Endocrine &amp; Diabetes Plus Clinic patient education materials; Harriet Lane Handbook, "
    "23rd ed.; standard ADA patient-education formulas (500/1800/1500 rules)", source_style
))

# ---- Section 5: Worked full example ----
story.append(Paragraph("5. Full Worked Example", h1_style))

example_data = [
    ["Step", "Calculation", "Result"],
    ["Patient", "70 kg adult, T1DM", "-"],
    ["1. TDD", "70 kg x 0.6 units/kg", "42 units/day"],
    ["2. Basal (50%)", "42 x 0.5", "21 units (once daily)"],
    ["2. Bolus total (50%)", "42 x 0.5", "21 units/day (~7/meal)"],
    ["3. ICR", "500 / 42", "1:12 (1 unit per 12 g carb)"],
    ["3. Meal dose (60 g carb lunch)", "60 / 12", "5 units"],
    ["4. CF", "1800 / 42", "43 mg/dL per unit"],
    ["4. Correction (BG 220, target 120)", "(220-120) / 43", "2.3 -> 2 units"],
    ["Total lunch dose", "5 units (carb) + 2 units (correction)", "7 units"],
]
t3 = Table(example_data, colWidths=[2.0*inch, 2.6*inch, 1.5*inch])
t3.setStyle(table_default_style("#2d5a2d"))
story.append(t3)
story.append(Spacer(1, 8))

# ---- Section 6: Special populations ----
story.append(Paragraph("6. Special Situations", h1_style))
special_items = [
    "<b>Pregnancy:</b> insulin needs rise progressively; bolus insulin may reach ~75% of TDD by late 3rd trimester (vs ~50% pre-pregnancy). - Creasy &amp; Resnik's Maternal-Fetal Medicine",
    "<b>Pediatrics:</b> same 3 components (basal rate, ICR, correction factor) but doses scaled to body size and titrated more often. - Harriet Lane Handbook, 23rd ed.",
    "<b>Perioperative/Inpatient:</b> verify ICR, CF, basal regimen, and glucose targets preoperatively; often reduce bolus doses for fasting patients. - Barash's Clinical Anesthesia, 9th ed.",
    "<b>DKA / IV insulin:</b> uses separate weight-based infusion protocols (typically 0.1 unit/kg/hr) - NOT the subcutaneous TDD method on this sheet.",
    "<b>Renal/hepatic impairment or elderly:</b> use lower end of TDD range (0.3-0.5 units/kg/day) to reduce hypoglycemia risk.",
]
story.append(ListFlowable(
    [ListItem(Paragraph(item, body_style), bulletColor=colors.HexColor("#1a3a5c")) for item in special_items],
    bulletType="bullet", start="circle", leftIndent=14
))

story.append(Spacer(1, 10))
story.append(HRFlowable(width="100%", thickness=0.75, color=colors.HexColor("#cccccc")))
story.append(Spacer(1, 4))
story.append(Paragraph(
    "For educational/clinical reference use only. Not a substitute for individualized medical judgment. "
    "Compiled from: Harrison's Principles of Internal Medicine 22e; Goldman-Cecil Medicine; Tintinalli's "
    "Emergency Medicine; Textbook of Family Medicine 9e; Washington Manual of Medical Therapeutics; "
    "Fuster &amp; Hurst's The Heart 15e; Goodman &amp; Gilman's Pharmacological Basis of Therapeutics; "
    "Harriet Lane Handbook 23e; Creasy &amp; Resnik's Maternal-Fetal Medicine; Barash's Clinical Anesthesia 9e.",
    footer_style
))

doc = SimpleDocTemplate(
    "/tmp/workspace/insulin-dosing-reference/Insulin_Dosing_Quick_Reference.pdf",
    pagesize=letter,
    topMargin=0.55*inch, bottomMargin=0.55*inch,
    leftMargin=0.6*inch, rightMargin=0.6*inch,
    title="Insulin Dosing Quick Reference"
)
doc.build(story)
print("PDF created successfully.")
Running Command

cd /tmp/workspace/insulin-dosing-reference && python3 build_pdf.py

Running Command

cd /tmp/workspace/insulin-dosing-reference && ls -la && python3 -c " from pypdf import PdfReader r = PdfReader('Insulin_Dosing_Quick_Reference.pdf') print('Pages:', len(r.pages)) "

Your PDF quick reference is ready:

Insulin Dosing Quick Reference

PDF Document · PDF

It's a 3-page document covering:
  1. Total Daily Dose (TDD) - weight-based ranges by population (T1DM, T2DM, insulin-resistant, insulin-sensitive)
  2. Basal/Bolus Split - 50/50 formula with worked example
  3. Insulin-to-Carb Ratio (ICR) - the "500 Rule" for meal dosing
  4. Correction Factor (CF) - the "1800/1500 Rule" for correction doses
  5. A full worked example - 70 kg T1DM patient walked through every calculation step by step
  6. Special situations - pregnancy, pediatrics, perioperative, DKA/IV insulin, renal/hepatic impairment
Each formula is highlighted in a callout box with a worked numeric example beneath it, and every section is sourced to the textbook it came from (Harrison's, Goldman-Cecil, Tintinalli's, Textbook of Family Medicine, Harriet Lane Handbook, etc.), plus a safety caution banner at the top reminding that these are starting-dose estimates requiring individualization and monitoring.
This is a shared conversation. Sign in to Orris to start your own chat.