Pharmakokinetische und Pharmakodynamische Modellierung
Wann anwenden
Jede Frage dazu, was der Körper mit einem Wirkstoff macht oder was der Wirkstoff mit dem Körper macht: Ableitung von Expositionsmetriken aus Konzentrations-Zeit-Daten, Anpassen eines Strukturmodells, Aufbauen oder Überprüfen einer Populationsanalyse, Auswahl einer Dosis oder eines Dosierungsschemas, Verknüpfung von Exposition und Wirkung, Vergleich von Formulierungen oder Skalierung auf eine neue Population.
Die drei Regeln
1. Lege die Expositionsmetrik und die Analysepopulation fest, bevor irgendetwas berechnet wird. AUC(0-t), AUC(0-inf), AUC(0-tau) im Steady State und Cavg sind unterschiedliche Größen und beantworten unterschiedliche Fragen. Das gilt auch für AUCinf basierend auf beobachtetem versus vorhergesagtem Clast. Die Wahl erst nach dem Betrachten der Zahlen zu treffen, ist der Grund, warum aus einer negativen Studie eine positive wird.
2. Strukturmodell, Variabilitätsmodell und Kovariatenmodell sind drei getrennte Entscheidungen. Sie werden ständig vermischt – ein zusätzliches Kompartiment, das hinzugefügt wird, um eigentlich unmodellierte Variabilität zwischen Gelegenheiten aufzunehmen, eine Kovariate, die hinzugefügt wird, um eine eigentlich falsch spezifizierte Absorption zu korrigieren. Diagnostiziere, welches falsch ist, bevor du eines von ihnen änderst.
3. Konvergenz ist nicht gleich Identifizierbarkeit. Ein Fit, der mit einem relativen Standardfehler von 200% für einen Parameter oder einer Korrelation von 0,99 zwischen zweien konvergiert, zeigt an, dass die Daten sie nicht trennen können. Jedes Fitting-Skript hier meldet beide und markiert sie, denn die Parameter-Tabelle allein sieht in genau dieser Situation gut aus.
Anwendungsbereich
Dieses Skill berechnet, diagnostiziert und strukturiert. Es entscheidet nicht darüber, ob eine Formulierung bioäquivalent ist, wählt keine Dosis für eine Studie aus, empfiehlt keine Dosis für einen Patienten, zieht nicht den Schluss, dass ein Wirkstoff keine QT-Verlängerung verursacht, und ersetzt keinen qualifizierten Pharmakometriker, klinischen Pharmakologen oder die regulatorische Prüfung. Die Skripte berichten; keines von ihnen schlussfolgert. tdm_bayes.py ist insbesondere eine Modellierungshilfe – jede Änderung des Therapieschemas eines Patienten liegt in der Verantwortung des behandelnden Arztes.
Skripte
cd skills/pkpd-modellierung/scripts
| Skript | Beantwortete Frage |
|---|---|
nca.py | Was sind die Expositionsmetriken, und ist die terminale Phase gut genug, um sie zu berichten? |
fit_compartmental.py | Welches Strukturmodell wird von diesen Daten gestützt, und sind seine Parameter identifizierbar? |
simulate_regimen.py | Was bewirkt dieses Schema im Steady State und bei welchem Anteil der Population? |
check_popk_dataset.py | Wird NONMEM diesen Datensatz so lesen, wie ich es denke? |
exposure_response.py | Gibt es eine Expositions-Wirkungs-Beziehung, und liegt das Plateau in den Daten? |
bioequivalence.py | Erfüllt das 90%-KI das Kriterium, und welches Kriterium kommt zur Anwendung? |
allometry_and_fih.py | Was ist die Anfangsdosis oder die Dosis in einer kleineren/jüngeren Population? |
ddi_static.py | Lösen die In-vitro-Daten eine klinische DDI-Studie gemäß ICH M12 aus? |
tdm_bayes.py | Was sind die individuellen Parameter dieses Patienten aus seinen gemessenen Spiegeln? |
Alle akzeptieren --format table|tsv|json. Daten gehen nach stdout, Provenienz und Befunde nach stderr, sodass sie mit > out.tsv getrennt bleiben. Der Exit-Code ist 0 für keine Befunde, 1 wenn Befunde gemeldet wurden, 2 für fehlerhafte Eingabe, sodass jedes von ihnen einen Workflow steuern kann.
Zwei private Module enthalten die gemeinsame Funktionalität: _models.py (analytische Lösungen für lineare mammilläre Modelle, plus integrierte Michaelis-Menten-, TMDD- und indirekte Antwortstrukturen) und _common.py (E/A und Berichterstattung). Importiere sie, anstatt eine Bateman-Funktion neu herzuleiten.
Workflow
1. Nicht-kompartimentelle Analyse
python3 nca.py -i profil.csv --dosis 100 --applikation extravaskulär --partial-auc 0-24
Vier Entscheidungen bestimmen das Ergebnis und werden normalerweise implizit gelassen. Dieses Skript macht alle vier explizit: --auc-methode (Standard linup-logdown), --blq-regel, --lambda-z-punkte oder ein explizites --lambda-z-fenster, und ob Sie auc_inf_obs oder auc_inf_pred berichten.
Die Lambda_z-Auswahl verwendet die Standardregel: Beginne mit den letzten drei quantifizierbaren Punkten, erweitere rückwärts, behalte das längere Fenster nur, wenn sich das korrigierte R² um mehr als 0,0001 verbessert. Das einfache R² kann nur steigen, wenn Punkte hinzugefügt werden, daher würde es immer das längste Fenster wählen. Punkte bei oder vor Tmax sind nie zulässig – die Einbeziehung von Tmax passt den Absorptionsschwanz an und verzerrt Halbwertszeit, Vz und AUCinf nach unten.
Auf einem rauschfreien simulierten Ein-Kompartiment-oralen Profil mit CL/F = 5, V/F = 20, ka = 1,2:
id cmax tmax auc_last lambda_z t_half r2_adj auc_inf_obs pct_auc_extrap cl_f vz_f
1 3.29678 1.5 19.8737 0.25 2.77259 1 19.8739 0.000781037 5.03173 20.1269
Die 0,6% Überschätzung der CL/F ist die Trapezregel bei einer dünn besetzten Absorptionsphase, kein Fehler – es ist die unvermeidbare Verzerrung der NCA bei diesem Abtastplan, und es ist der Grund, warum NCA- und Kompartiment-Schätzungen der Clearance nie genau übereinstimmen.
Die Befunde sind der Punkt. Ein Steady-State-Profil, das bei tau abgeschnitten ist, erzeugt:
befund: Subjekt A: 25,2% der AUCinf werden extrapoliert (über 20%); die AUCinf wird durch den
Lambda_z-Fit bestimmt, nicht durch Daten
befund: Subjekt A: Das Lambda_z-Fenster umfasst 0,58 Halbwertszeiten (unter 2,0); die terminale
Phase wurde möglicherweise nicht erreicht
Beide sind korrekt und beide werden routinemäßig ignoriert. Im Steady State ist die berichtbare Expositionsmetrik AUC(0-tau), nicht AUCinf; das Skript berechnet AUCinf trotzdem und teilt mit, dass man ihr nicht vertrauen soll.
2. Kompartimentelles Fitten und Modellauswahl
python3 fit_compartmental.py -i profil.csv --dosis 500 --applikation iv-bolus --vergleiche 1cmt,2cmt,3cmt
Parameter werden auf der logarithmischen Skala geschätzt, sodass sie nicht negativ werden können und ihre Konfidenzintervalle asymmetrisch ausfallen. Die Gewichtung ist standardmäßig 1/y2 (konstanter CV), was die richtige Voreinstellung für PK und die falsche für einen homoskedastischen PD-Endpunkt ist.
Fitten von simulierten Zwei-Kompartiment-Daten (CL 4, V1 12, Q 6, V2 40, 8% proportionaler Fehler):
modell parameter wssr aic bic f_vs_einfacher f_p_wert verglichen_mit
1cmt 2 3.13201 -19.4956 -18.0795 n/a n/a n/a
2cmt 4 0.0309579 -84.7477 -81.9155 550.936 9.38016e-12 1cmt
3cmt 6 0.0232859 -85.0193 -80.771 1.4826 0.27762 2cmt
AIC wählt das Drei-Kompartiment-Modell. BIC und der F-Test lehnen es beide ab. AICs feste Strafe von 2 pro Parameter ist bei dieser Stichprobengröße schwach, und es wählt das überparametrisierte Modell häufiger, als Praktiker erwarten. Die Parametertabelle klärt es:
befund: fit: Q3 hat 98% RSE – aus diesen Daten bei dieser Modellgröße nicht schätzbar
befund: fit: V3 hat 71% RSE – aus diesen Daten bei dieser Modellgröße nicht schätzbar
Der Ein-Kompartiment-Fit erhält derweil:
befund: fit: Residuenvorzeichen sind nicht zufällig (Runs-Test p = 0,0036) – eine strukturelle
Fehlspezifikation, die keine Neugewichtung beheben wird
Diese Unterscheidung – strukturelle Fehlspezifikation versus falsches Fehlermodell – ist diejenige, die man richtig treffen muss. Ein Residuen-über-Zeit-Diagramm mit Läufen desselben Vorzeichens bedeutet, dass die Modellform falsch ist. Heteroskedastische Residuen mit zufälligen Vorzeichen bedeuten, dass die Gewichtung falsch ist. Die Neugewichtung des ersten Falls verbirgt es, ohne es zu beheben.
3. Populations-PK
Überprüfe den Datensatz, bevor du etwas ausführst. Hier geht die Zeit tatsächlich hin.
python3 check_popk_dataset.py -i nmdaten.csv --kovariaten WT,CRCL --zeitvariierend WT
Die Mängel, die zählen, sind die stillen. NM-TRAN lehnt eine nicht-numerische DV nicht ab – es liest BLQ als Null und passt es als echte Nullkonzentration an. Eine leere Kovariate wird zu 0, also wird ein fehlendes Körpergewicht zu einem 0 kg Patienten. ADDL ohne II platziert keine zusätzlichen Dosen. Datensätze, die denselben Zeitstempel teilen, werden in der Dateireihenfolge angewendet, sodass es davon abhängt, welche Zeile zuerst kam, ob ein Spiegel vor oder nach der Dosis liegt. Keines davon stoppt einen Lauf.
schweregrad prüfung detail
fehler nicht-numerische DV DV enthält Text... NM-TRAN liest sie als 0
fehler Subjekt ohne Dosis 1 Subjekt(e) haben Beobachtungen, aber keine Dosis: 2
fehler TIME nicht sortiert 1 Subjekt(e) haben nicht geordnete TIME: 1
fehler Kovariate WT fehlt 1 Datensatz/Datensätze haben keinen Wert...
warnung doppelte TIME innerhalb eines Subjekts NONMEM wendet sie in Dateireihenfolge an...
Für die eigentliche Schätzung implementiert dieses Skill NLME nicht neu – siehe references/populations-pk.md für Schätzmethoden, die BLQ-M1-M7-Methoden, den Kovariatenmodellaufbau und die Diagnostiken, die entscheiden, ob ein Modell akzeptabel ist, und references/software-oekosystem.md für das richtige Werkzeug.
4. Simulation und Schemaauswahl
python3 simulate_regimen.py --cl 5 --v 40 --dosis 500 --intervall 12 --n-dosen 10 --steady-state
python3 simulate_regimen.py --cl 5 --v 40 --dosis 500 --intervall 12 --n-dosen 10 \
--simuliere 2000 --omega-cl 0.35 --omega-v 0.25 --ziel-tal 4.0
Deterministische Simulation beantwortet „wie sieht der typische Patient aus“, was fast nie die Frage ist:
metrik p5 p25 median p75 p95 geo_mean
spitze 11.861 14.6018 16.6702 19.1476 22.9339 16.6453
tal 0.863226 2.15191 3.64412 5.49655 9.21053 3.27035
ziel anteil_erreichend
tal >= 4 0.444
Der typische Talwert ist 3,6 und das Ziel ist 4, also erreichen 44% der Population es. Ein Schema, das auf den typischen Patienten abgestimmt ist, lässt etwa die Hälfte der Population auf der falschen Seite des Ziels. Die berichtete Zielerreichung ist hier noch optimistisch: Dies ist nur die Variabilität zwischen den Subjekten, ohne residuale oder zwischengelegene Komponente.
Lineare Modelle werden analytisch gelöst und überlagert, was exakt ist. --nichtlinear schaltet auf integrierte Michaelis-Menten-Elimination um, bei der die Superposition ungültig ist und das Verhalten bei Mehrfachdosen überhaupt nicht aus einer Einzeldosis abgeleitet werden kann.
5. Expositions-Wirkung
python3 exposure_response.py --emax -i er.csv --sigmoid
python3 exposure_response.py --cqtc -i qt.csv --cmax 250
Der Emax-Fit meldet anteil_emax_erreicht und markiert einen Fit, dessen Plateau außerhalb der Daten liegt. Wenn die höchste beobachtete Exposition nur ein Drittel des geschätzten Emax erreicht, sind Emax und EC50 Extrapolationen, die stark miteinander korreliert sind; sie als unabhängige Schätzwerte anzugeben, ist nicht haltbar, und eine „lineare“ Expositions-Wirkung ist einfach der Nieder-Konzentrations-Ast derselben Kurve.
--cqtc bewertet die Obergrenze des zweiseitigen 90%-Konfidenzintervalls der vorhergesagten Placebo-korrigierten Änderung des QTc gegenüber dem Ausgangswert im Vergleich zum 10-ms-Schwellenwert, was die Frage ist, die ICH E14 tatsächlich stellt. Eine Punktschätzung oder ein 95%-Intervall beantwortet eine andere. Das gebündelte Modell ist eine gewöhnliche lineare Regression zum Screening; eine einreichungsreife C-QTc-Analyse benötigt ein gemischtes Modell mit zufälligem Achsenabschnitt und Steigung pro Subjekt.
Jeder Modus enthält denselben Vorbehalt, weil es derjenige ist, der vergessen wird: Patienten werden randomisiert auf die Dosis, nicht auf die Exposition. Die Expositions-Wirkung über Quantile hinweg ist selbst innerhalb einer randomisierten Studie beobachtend und kann die Kovariaten widerspiegeln, die die Clearance antreiben.
6. Bioäquivalenz
python3 bioequivalence.py -i be.csv --design 2x2 --metrik AUC
python3 bioequivalence.py -i be.csv --design replicate --metrik Cmax --skalierung beide
python3 bioequivalence.py --power --cv 0.30 --gmr 0.95 --ziel-power 0.80
Drei Kriterien teilen das Wort „Bioäquivalenz“ und sind nicht austauschbar: durchschnittliche BE (90%-KI innerhalb von 80,00-125,00%), EMAs ABEL (Grenzen erweitert als Funktion des CVwR, gedeckelt bei 69,84-143,19%, Punktschätzung immer noch innerhalb von 80-125%) und FDAs RSABE (eine skalierte linearisierte Grenze mittels Hyslops Methode, überhaupt kein Intervall). --skalierung weigert sich, bei einem 2x2-Design zu laufen:
fehler: Referenzskalierung erfordert --design replicate. Hohe beobachtete Variabilität in einer
2x2-Studie berechtigt nicht zur Erweiterung: Ohne wiederholte Referenzapplikationen gibt es
keine Schätzung der Innersubjekt-Referenzvariabilität, auf die skaliert werden könnte.
Der Stichprobenumfang reproduziert die veröffentlichten Tabellen exakt (CV 30%, GMR 0,95, 80% Power → N = 40 für eine 2x2). Die Power wird durch Integration über die Stichprobenverteilung der geschätzten Standardabweichung berechnet, anstatt den Standardfehler als bekannt zu behandeln – die Normalapproximation überschätzt die Power bei realistischen Stichprobengrößen. Beachte, dass N weitaus mehr vom angenommenen GMR als vom CV getrieben wird; die Annahme von 1,00 anstelle von 0,95 halbiert das berechnete N grob und ist der übliche Grund, warum eine BE-Studie zu wenig Power hat.
7. Skalierung, Pädiatrie und Erstdosis am Menschen
python3 allometry_and_fih.py --skaliere --cl 5 --gewicht-von 70 --gewicht-nach 6 --pma-wochen 44
python3 allometry_and_fih.py --fih --noael ratte=50,hund=10 --sicherheitsfaktor 10
Die Skalierung allein nach Größe unterhalb von etwa 2 Jahren überschätzt die Clearance, bei einem Neugeborenen um ein Mehrfaches, weil die Clearance durch die Enzym- und Nierenreifung und nicht durch die Größe begrenzt wird. Die Angabe von --pma-wochen fügt den sigmoidalen Reifungsterm nach Anderson-Holford hinzu; das Weglassen unter 20 kg führt zu einem Befund.
parameter referenz exponent groessenskaliert reifungsfaktor end
CL 5 0.75 0.792063 0.30634 0.242641
V 40 1 3.42857 1 3.42857
Allein nach Größe würde 0,79 l/h vorhergesagt; mit Reifung bei 44 Wochen postmenstruellem Alter sind es 0,24 l/h, ein 3,3-facher Unterschied. Das Volumen ist nicht gereift – die Reifung beschreibt die Eliminationskapazität, nicht den Verteilungsraum.
--fih verwendet die Körperoberflächenumrechnung aus der FDA-Leitlinie von 2005 zur maximal sicheren Anfangsdosis und gibt immer einen Befund aus, dass eine MRSD basierend auf NOAEL allein für agonistische Immunmodulatoren nicht ausreicht: Berechne MABEL mit --mabel und nimm den niedrigeren Wert.
8. Wirkstoffinteraktionen
python3 ddi_static.py --basic --ki 0.5 --imax 2.0 --fu 0.05 --dosis 0.4
python3 ddi_static.py --msm --ki 0.5 --imax 2.0 --fu 0.05 --dosis 0.4 --fm 0.9 --fg 0.7