km_all <-survfit(S_strikes ~1, data = strikes)km_all
Call: survfit(formula = S_strikes ~ 1, data = strikes)
n events median 0.95LCL 0.95UCL
[1,] 62 61 27 21 41
Code
plot(km_all, xlab ="Durée de grève (jours)", ylab ="Probabilité de grève encore en cours",main ="Courbe de survie Kaplan–Meier\nToutes les grèves")
Ou avec {survminer} :
Code
if (requireNamespace("survminer", quietly =TRUE)) {ggsurvplot(km_all, conf.int =TRUE,xlab ="Durée de grève (jours)",ylab ="Probabilité de grève en cours")}
2.3 Kaplan–Meier par groupes
On veut comparer la durée des grèves selon le choc d’activité :
Code
km_cycle <-survfit(S_strikes ~ uoutput_q, data = strikes)summary(km_cycle)
if (requireNamespace("survminer", quietly =TRUE)) {ggsurvplot(km_cycle, data = strikes,conf.int =FALSE, pval =TRUE,legend.title ="Choc d'activité",legend.labs =levels(strikes$uoutput_q),xlab ="Durée de grève (jours)",ylab ="Probabilité de grève en cours")}
2.4 Test du log-rank
Hypothèse nulle \(H_0\) : même fonction de survie dans tous les groupes
Statistique de test \(\chi^2\) :
compare, à chaque temps \(t_j\), les événements observés vs attendus dans chaque groupe.
En R :
Code
survdiff(S_strikes ~ uoutput_q, data = strikes)
Call:
survdiff(formula = S_strikes ~ uoutput_q, data = strikes)
N Observed Expected (O-E)^2/E (O-E)^2/V
uoutput_q=Choc faible 25 24 32.4 2.198928 5.143950
uoutput_q=Choc moyen 17 17 16.9 0.000153 0.000219
uoutput_q=Choc fort 20 20 11.6 6.074740 8.183882
Chisq= 9.2 on 2 degrees of freedom, p= 0.01
Le test du log-rank compare les courbes de survie des trois groupes de choc (Choc faible, Choc moyen, Choc fort) sous
\(H_0\) : même fonction de survie pour les trois groupes.
La statistique de test \(\chi^2 = 9{,}2\) avec 2 ddl donne une p-valeur de 0,01. → Au seuil de 5 %, on rejette\(H_0\) : la durée des grèves dépend significativement du niveau de choc d’activité.
Tous les épisodes en cycle défavorable sont classés en Choc faible.
Les épisodes en cycle favorable se répartissent entre Choc moyen et Choc fort.
La matrice est quasi diagonale : les deux codages racontent la même histoire (choc défavorable vs favorable), l’un en version “signe”, l’autre en version “force du choc”.
On peut donc considérer que les deux échelles sont cohérentes.
7.1.2 Q2 – Corrélations entre variables explicatives
Variables explicatives potentielles :
uoutput (continu)
uoutput_q_num : version numérique de uoutput_q (1 = faible, 2 = moyen, 3 = fort)
Code
strikes <- strikes |>mutate(uoutput_q_num =as.numeric(uoutput_q))cor(dplyr::select(strikes, uoutput, uoutput_q_num), use ="complete.obs")
Le terme \(\exp(\eta_1)\) est le hazard ratio associé à une augmentation d’une unité de uoutput.
Comme uoutput est un choc macro petit en amplitude, on interprète plutôt de petites variations (par ex. aller d’un quantile faible à un quantile élevé).
Si \(\exp(\eta_1) > 1\), un choc plus favorable est associé à une fin plus rapide de la grève (durées plus courtes).
AIC :
On retient la valeur d’AIC affichée et on la comparera aux autres spécifications (M1, M3).
Un AIC plus faible signale un meilleur compromis ajustement / complexité.
7.2.2 Q7 – Version purement catégorielle du cycle
Code
cox_cat <-coxph(S_strikes ~ uoutput_q, data = strikes)summary(cox_cat)
Call:
coxph(formula = S_strikes ~ uoutput_q, data = strikes)
n= 62, number of events= 61
coef exp(coef) se(coef) z Pr(>|z|)
uoutput_qChoc moyen 0.3556 1.4271 0.3253 1.093 0.27435
uoutput_qChoc fort 0.9643 2.6229 0.3265 2.954 0.00314 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(coef) exp(-coef) lower .95 upper .95
uoutput_qChoc moyen 1.427 0.7007 0.7543 2.700
uoutput_qChoc fort 2.623 0.3813 1.3832 4.974
Concordance= 0.604 (se = 0.039 )
Likelihood ratio test= 8.47 on 2 df, p=0.01
Wald test = 8.81 on 2 df, p=0.01
Score (logrank) test = 9.3 on 2 df, p=0.01
\(\exp(\eta_2)\) : hazard ratio “Choc moyen” vs “Choc faible”.
\(\exp(\eta_3)\) : hazard ratio “Choc fort” vs “Choc faible”.
Si au moins un coefficient est significatif, on conclut à une différence de durée entre au moins deux niveaux de choc.
En pratique, avec ce petit échantillon, les intervalles de confiance sont larges → significativité parfois fragile, mais la direction va vers des grèves plus rapides en cas de choc plus fort.
Comparaison des déviances :
On lit les log-vraisemblances de cox_full et cox_cat dans les sorties et l’on compare :
une déviance plus faible\((-2\log L)\) indique un meilleur ajustement (à nombre de paramètres donné).
7.2.3 Q8 – Nombre de paramètres
Modèles :
M1 : S ~ uoutput
1 paramètre de pente ( \(\eta_1\) ).
M2 : S ~ uoutput + uoutput_q_num
2 paramètres de pente ( \(\eta_1, \eta_2\) ).
M3 : S ~ uoutput_q (facteur 3 modalités)
2 paramètres de pente (deux dummies vs référence : Choc moyen, Choc fort).
Emboîtement :
M1 est inclus dans M2 si l’on impose (eta_2 = 0).
M3 n’est pas emboîté dans M1/M2 (spécification complètement catégorielle vs continue).
7.2.4 Q9 – Choix de la meilleure mesure du cycle
Code
cox_M1 <-coxph(S_strikes ~ uoutput, data = strikes)cox_M2 <-coxph(S_strikes ~ uoutput + uoutput_q, data = strikes)cox_M3 <-coxph(S_strikes ~ uoutput_q, data = strikes)anova(cox_M1, cox_M2, test ="LRT")
Analysis of Deviance Table
Cox model: response is S_strikes
Model 1: ~ uoutput
Model 2: ~ uoutput + uoutput_q
loglik Chisq Df Pr(>|Chi|)
1 -192.65
2 -192.47 0.3621 2 0.8344
Code
anova(cox_M1, cox_M3, test ="LRT")
Analysis of Deviance Table
Cox model: response is S_strikes
Model 1: ~ uoutput
Model 2: ~ uoutput_q
loglik Chisq Df Pr(>|Chi|)
1 -192.65
2 -192.63 0.0382 1 0.845
Commentaires :
LR(M1 vs M2) : si la p-valeur est élevée → l’ajout de uoutput_q_num ne permet pas une amélioration significative → on peut préférer le modèle plus simple M1.
LR(M1 vs M3) : si la p-valeur est faible → la version catégorielle du choc (M3) capture un effet non linéaire utile.
On combine ces tests avec les AIC pour choisir :
soit une spécification continue simple (M1),
soit une spécification catégorielle (M3) si les effets par classe sont plus lisibles et mieux ajustés.
7.3 3. Modèles paramétriques – Correction
7.3.1 Q10 – Modèle de Weibull
Code
weib_best <-survreg(S_strikes ~ uoutput, data = strikes, dist ="weibull")summary(weib_best)
Call:
survreg(formula = S_strikes ~ uoutput, data = strikes, dist = "weibull")
Value Std. Error z p
(Intercept) 3.79012 0.13944 27.18 <2e-16
uoutput -9.67700 3.00825 -3.22 0.0013
Log(scale) 0.00631 0.10180 0.06 0.9506
Scale= 1.01
Weibull distribution
Loglik(model)= -285.4 Loglik(intercept only)= -290.2
Chisq= 9.6 on 1 degrees of freedom, p= 0.002
Number of Newton-Raphson Iterations: 6
n= 62
Nombre de paramètres estimés :
Intercept ((\(\alpha\) ))
Coefficient de uoutput (( \(\eta_1\) ))
Paramètre de scale (lié au paramètre de forme du Weibull)
→ Au total, 3 paramètres dans ce modèle.
Comparaison AIC :
On calcule l’AIC du Weibull et on le compare à l’AIC du Cox retenu :
AIC(Weibull) plus faible → modèle paramétrique préféré.
AIC(Cox) similaire ou plus faible → on peut rester en Cox, plus souple (baseline non paramétrique).
7.3.2 Q11 – Courbes de survie pour différents scénarios
On utilise ici le modèle de Cox simple cox_uoutput pour illustrer les différences de survie selon le choc :
Code
newdata <-data.frame(uoutput =quantile(strikes$uoutput, probs =c(.2, .5, .8)))surv_cox <-survfit(cox_uoutput, newdata = newdata)plot( surv_cox,xlab ="Durée de grève (jours)",ylab ="Probabilité de grève en cours")legend("topright",legend =paste0("uoutput = ", round(newdata$uoutput, 3)),lty =1,bty ="n")
Commentaires :
Pour les valeurs de uoutputélevées (choc favorable), la courbe de survie est en dessous des autres : les grèves ont une probabilité plus faible de “survivre” longtemps → elles se terminent plus vite.
Pour les valeurs faibles / négatives (choc défavorable), la courbe de survie est au-dessus : les grèves ont une probabilité plus forte de durer.
La forme du risque implicite (hazard) augmente avec le temps au début, puis peut se stabiliser, ce qui est cohérent avec un modèle de type Weibull.
7.3.3 Q12 – Interprétation économique
En combinant :
les hazard ratios des modèles de Cox,
les courbes de survie (Kaplan–Meier et prédictions de modèles),
on peut conclure :
En période de conjoncture favorable (choc d’activité positif / fort), les grèves ont plus de chances de se terminer rapidement → hazard plus élevé, survie plus faible.
En période de conjoncture défavorable, les grèves ont tendance à durer plus longtemps → hazard plus faible, survie plus élevée.
En termes de négociation :
Quand l’activité est bonne, les employeurs ont davantage de marges (les pertes liées à la grève sont plus coûteuses à court terme), ce qui peut favoriser des accords plus rapides.
Quand la conjoncture est mauvaise, les coûts d’opportunité sont plus faibles et les rapports de force différents, ce qui peut conduire à des grèves plus longues.