PDF-Version

Aufgabe 6-1

Der Datensatz sim.sas7bdat enthält für 100 Patienten (id) simulierte Überlebenszeiten (time) und Werte für drei Kovariablen (X1, X2, X3).

a)

Passen Sie zunächst ein Proportional-Hazards-Modell mit Haupteffekten für X1, X2 und X3 an. Recherchieren Sie, wie man mit PROC PHREG Residuen berechnet und erstellen Sie geeignete Residuenplots. Beschreiben Sie Auffälligkeiten.

Residuen:

PROC PHREG data = survival.sim noprint;
    MODEL time*status(0) = X1 X2 X3;
    OUTPUT out=sim_resids resdev=resdev resmart=resmart ressch=ressch ressco=resco;
RUN;
QUIT;

Plots(s)

PROC LOESS DATA=sim_resids PLOTS(ONLY)=FitPlot; 
MODEL resdev=x1 /CLM; 
RUN;
knitr::include_graphics("plots/Aufgabe06/1b_resids_outlier.png")

Wir sehen zwei recht eindeutige Ausreißer.

b)

Entfernen Sie offensichtliche Ausreißer und passen Sie das Modell erneut an.

data survival.sim_clean; set survival.sim;
if id = 45 OR id = 88 then delete;
run;
quit;

/* new model */
PROC PHREG data = survival.sim_clean noprint;
    MODEL time*status(0) = X1 X2 X3;
    OUTPUT out=sim_clean_resids resdev=resdev resmart=resmart ressch=ressch ressco=resco;
RUN;
QUIT;

c)

Überprüfen Sie mit dem um Ausreißer reduzierten Datensatz für jede Kovariable, ob die funktionale Form angemessen erscheint. Falls nicht, finden Sie eine (einfache) Transformation, die eine bessere Anpassung ergibt.

Via Martingal-Residuen:

%MACRO plot_loess(y, x, data);
    PROC LOESS DATA=&data. PLOTS(ONLY)=FitPlot; 
        MODEL &y. = &x. /CLM; 
    RUN;
%MEND;

%plot_loess(resmart, X1, sim_clean_resids);
%plot_loess(resmart, X2, sim_clean_resids);
%plot_loess(resmart, X3, sim_clean_resids);
knitr::include_graphics(c(
  "plots/Aufgabe06/1c-resmart-X1.png",
  "plots/Aufgabe06/1c-resmart-X2.png",
  "plots/Aufgabe06/1c-resmart-X3.png"
))

X1 sieht ziemlich logarithmierbar aus, X2 ist okay und X3 hat einen Knick, den wir vermutlich auch nicht ohne Weiteres wegtransformiert bekommen.

/* when in doubt, take a log */
data survival.sim_clean; set survival.sim_clean;
X1_log = log(X1);
run;
quit;

/* re-fit model */
PROC PHREG data = survival.sim_clean;
    MODEL time*status(0) = X1_log X2 X3;
    OUTPUT out=sim_clean_resids_trans resdev=resdev resmart=resmart ressch=ressch ressco=resco;
RUN;
QUIT;

Neue Residuenplots:

knitr::include_graphics(c(
  "plots/Aufgabe06/1c-resmart-trans-X1.png",
  "plots/Aufgabe06/1c-resmart-trans-X2.png",
  "plots/Aufgabe06/1c-resmart-trans-X3.png"
))

Jetzt haben wir zwar überall einen Knick, aber der ist zumindest relativ klein. So wirklich geradegebügelt bekommen wir das vermutlich nicht ohne klügere Transformationen.

d)

Überprüfen Sie außerdem mit dem reduzierten Datensatz jede Kovariable auf zeitabhängige Effekte.

Ich habe keine klügere Möglichkeit gefunden, bestimmte Residuen gegen time zu plotten, aber “mal im Modell umsortieren und gucken was passiert” hat funktioniert.

PROC PHREG data = survival.sim_clean;
    MODEL time*status(0) = X1_log X2 X3;
    OUTPUT out=sim_clean_resids_trans_X1 resdev=resdev resmart=resmart ressch=ressch;
RUN;
QUIT;

PROC PHREG data = survival.sim_clean;
    MODEL time*status(0) = X2 X1_log X3;
    OUTPUT out=sim_clean_resids_trans_X2 resdev=resdev resmart=resmart ressch=ressch;
RUN;
QUIT;

PROC PHREG data = survival.sim_clean;
    MODEL time*status(0) = X3 X2 X1_log;
    OUTPUT out=sim_clean_resids_trans_X3 resdev=resdev resmart=resmart ressch=ressch;
RUN;
QUIT;

%plot_loess(ressch, time, sim_clean_resids_trans_X1);
%plot_loess(ressch, time, sim_clean_resids_trans_X2);
%plot_loess(ressch, time, sim_clean_resids_trans_X3);
knitr::include_graphics(c(
  "plots/Aufgabe06/1d-resschoen-X1.png",
  "plots/Aufgabe06/1d-resschoen-X2.png",
  "plots/Aufgabe06/1d-resschoen-X3.png"
))

  • X1: Relativ gerade, gegen Ende ein leichter negativer Trend, allerdings auch mit wenig Datengrundlage
  • X2: Analog X1, aber mit positivem Trend
  • X3: Etwas uneindeutig im mittleren Bereich mit positivem Trend gegen Ende. Etwas schwierig einzuschätzen, aber kein eindeutiger positiver/negativer Trend, wenn auch nicht konstant über die Zeit.

Aufgabe 6-2

Der Datensatz sim2.sas7bdat enthält für 130 Patienten simulierte Überlebenszeiten (time), das Geschlecht (sex) und die Behandlung (treat).

a)

Überprüfen Sie graphisch die Proportional-Hazards-Annahme für die Variablen sex und treat.

PROC LIFETEST data = survival.sim2 plots=loglogs;
  STRATA treat sex;
  TIME time * status(0);
run;
knitr::include_graphics(c(
  "plots/Aufgabe06/2a-loglog-km.png",
  "plots/Aufgabe06/2a-loglog-loglog.png"
))

Wir sehen sowohl für den K-M als auch für den log-log-Plot Überschneidungen. Die PH-Annahme sieht hier recht verletzt aus.

b)

Passen Sie zunächst ein Proportional-Hazards-Modell mit beiden Haupteffekten an, und vergleichen Sie dieses mit einem nach Geschlecht stratifiziertem Modell.

/* Two main effects */
PROC PHREG data = survival.sim2;
  CLASS sex;
  MODEL time*status(0) = treat sex;
RUN;
QUIT;

/* stratified per sex */
PROC PHREG data = survival.sim2;
  CLASS sex;
    MODEL time*status(0) = treat sex;
    STRATA sex;
RUN;
QUIT;

Modell mit zwei Haupteffekten:

knitr::include_graphics(c(
  "plots/Aufgabe06/2b-both-effects-parameters.png"
))

Stratifiziertes Modell:

knitr::include_graphics(c(
  "plots/Aufgabe06/2b-stratified-parameters.png"
))

Im stratifizierten Modell ist der Treatmenteffekt etwas kleiner als im Modell mit zwei Haupteffekten.

c)

Welches Modell ist hier besser geeignet und warum?

Da die PH-Annahme verletzt ist, und Männer und Frauen unterschiedliche Basisrisiken zu haben scheinen, scheint hier die stratifizierte Auswertung angemessener zu sein.

d)

Welche Annahmen liegen dem stratifizierten Modell zugrunde?

Das stratifizierte Modell nimmt nur proportional hazards zwischen jeweils einer Vergleichsgruppe (Frauen bzw. Männer) und der jeweiligen Behandlung an, das heißt wir vermeiden so Schätzfehler aufgrund der unterschiedlichen Basisrisiken der Frauen und Männer.