Comment étudier la relation non linéaire entre une variable quantitative et une variable censurée en présence de covariables.

On travaille sur des variables censurées, on utilise donc le package survival.

library(package="survival")
## Loading required package: splines

Approche linéaire

On utilise le jeu de données kidney fourni par le package survival. Les deux variables disease et sex sont des facteurs, age est numérique continue.

L'approche de base consiste à introduire dans le modèle les variables d'intérêt sans transformations.

survKidney <- with(kidney, Surv(time=time, event=status))

mod1 <- coxph(survKidney ~ age + as.factor(sex) + disease, data=kidney)

Si on regarde l'effet de la variable age sur la survie, on constate qu'il est contraint à être linéaire par le modèle :

termplot(mod1, rug = TRUE, se = TRUE, term = "age")

plot of chunk unnamed-chunk-3

Approche non linéaire

Explications générales

Il est possible d'effectuer des transformations de la variable age pour éviter de contraindre une relation linéaire.

La transformation la plus simple consiste à appliquer une transformation mathématique à la variable. Le modèle va donc contraindre une relation linéaire avec la variable transformée. Cette approche est utile si on pense connaitre la relation exacte. Par exemple si on pense qu'il existe une relation log-linéaire avec la variable, alors la relation sera linéaire avec la variable a qui on appliqué une transformation log. Cette approche n'est pas intéressante dans notre cas.

La seconde approche consiste à ajouter au modèle des termes quadratiques de la variable d'intérêt (age comme avant, puis age au carré, au cube…). On conserve ensuite les termes jusqu'au dernier terme significatif (ou jusqu'au dernier terme pertinent, le risque de sur-ajustement n'est pas négligeable !). Cette approche n'est pas très souple et pose des problèmes pour les valeurs extrêmes (en gros par construction mathématique on contraint les bouts des courbes à être recroquevillés, on ne peut pas avoir de plateau pour les valeurs extrêmes de age par exemple).

L'approche qu'on va utiliser ici consiste à appliquer une transformation arbitraire à la variable. Pour cela on utilise des fonctions mathématiques qui peuvent prendre des formes assez libres. En pratique on utilise beaucoup les splines et les polynomes fractionnaires.

On met quand même un contrainte à ces fonctions, c'est le nombre de degrès de liberté (ddl). En gros on leur dit à quel point elles peuvent tortiller comme des spaghettis. Si on met trop de degrès de liberté il existe un risque d'overfitting. On peut choisir automatiquement le nombre de ddl mais ça pose en fait beaucoup de problème. En pratique on choisit à vue de nez, on erra ça plus tard.

Mise en oeuvre

Pour indiquer qu'on veut transformer age on utilise la fonction pspline.

mod2 <- coxph(survKidney ~ pspline(age) + as.factor(sex) + disease, data=kidney)

termplot(mod2, rug = TRUE, se = TRUE, term = "pspline(age)")

plot of chunk unnamed-chunk-4

Là on voit que la fonction tortille un peu trop, surtout vu l'énorme intervalle de confiance. On peut donc tenter de lui enlever des degrès de liberté pour voir un peu ce que ça donne (attention à bien nommer l'argument term de termplot exactement comme il apparait dans le summary du modèle, y compris les espaces, sinon ça marche pas) :

mod3 <- coxph(survKidney ~ pspline(age, df=3) + as.factor(sex) + disease, data=kidney)

termplot(mod3, rug = TRUE, se = TRUE, term = "pspline(age, df = 3)")

plot of chunk unnamed-chunk-5

mod4 <- coxph(survKidney ~ pspline(age, df=2) + as.factor(sex) + disease, data=kidney)

termplot(mod4, rug = TRUE, se = TRUE, term = "pspline(age, df = 2)")

plot of chunk unnamed-chunk-5

On voit qu'en fait 2 ddl, le minimum, suffisent. Là franchement il n'y a pas de cutoff clair qui ressort sur l'âge. Mais tu comprends bien qu si tu trouves que ta relation c'est un plateau, un fort dénivellé puis un autre plateau tu peux mettre un cutoff au niveau du dénivellé.