Tableau d’efficacité en R : ANCOVA et moyennes LS

Construisez le résultat d’efficacité principal d’un Clinical Study Report — l’analyse de covariance (ANCOVA) de la variation par rapport à la valeur initiale, avec la moyenne des moindres carrés par bras et la différence de traitement ajustée, l’IC à 95 % et la p-value — avec summarize_ancova de tern sur des données pharmaverse publiques

Un tutoriel complet et exécutable pour le tableau d’analyse d’efficacité clinique — le tableau ANCOVA (analyse de covariance) qui rapporte le critère principal d’un Clinical Study Report. Apprenez ce que montre le tableau (n par bras, la variation moyenne ajustée ou des moindres carrés (LS) par rapport à la valeur initiale avec son erreur standard, et la différence traitement-versus-référence des moyennes LS avec un IC à 95 % et une p-value, en ajustant sur la valeur initiale), puis construisez-le avec rtables et tern : basic_table() |> split_cols_by(arm, ref_group=) |> summarize_ancova(vars, variables = list(arm=, covariates=), conf_level=) — sur des données ADVS pharmaverseadam publiques, pour que chaque ligne s’exécute. Inclut la distinction moyennes-LS-vs-moyennes-brutes, le choix du bras de référence, et pourquoi la valeur initiale entre comme covariable.

Date de publication

1 juillet 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Le tableau d’efficacité est le résultat sur le critère principal d’un Clinical Study Report — la réponse formelle à le médicament a-t-il fonctionné ? Pour un critère continu, c’est une analyse de covariance (ANCOVA) de la variation par rapport à la valeur initiale, comparant chaque bras de traitement au bras de référence tout en ajustant sur la valeur initiale.
  • Il rapporte des moyennes ajustées, pas brutes. La cellule de chaque bras est la moyenne des moindres carrés (moyenne LS) — la variation moyenne attendue si les bras avaient la même valeur initiale moyenne — avec son erreur standard. La ligne de comparaison est la différence des moyennes LS, son intervalle de confiance (IC) à 95 %, et une p-value.
  • La valeur initiale est une covariable, pas la réponse. Le critère est CHG (variation par rapport à la valeur initiale) ; BASE (la valeur initiale) figure à droite du modèle comme ajustement. Mettre la valeur initiale du côté de la réponse est une erreur classique.
  • Une seule fonction tern le construit. summarize_ancova() ajuste le modèle linéaire, extrait les moyennes LS avec emmeans, et met le résultat en page — n, moyenne ajustée, différence, IC, p — dans une mise en page rtables.
  • Le bras de référence est le premier niveau de facteur. split_cols_by("TRT01A", ref_group = "Placebo") fixe le placebo comme comparateur ; chaque différence est bras moins placebo.

Introduction

Le tableau démographique dit qui participait à l’essai et le tableau des événements indésirables dit s’il était sûr. Le tableau d’efficacité répond à la question pour laquelle l’essai a été mené : le traitement a-t-il fonctionné ? C’est l’analyse du critère principal d’un Clinical Study Report (CSR) — et pour un critère continu mesuré avant et après le traitement, cette analyse est presque toujours une analyse de covariance (ANCOVA) de la variation par rapport à la valeur initiale.

Le tableau est compact mais dense. Pour chaque bras de traitement, il donne le nombre de sujets analysés et la variation moyenne ajustée (des moindres carrés) par rapport à la valeur initiale ; puis, pour chaque bras actif face à la référence, la différence des moyennes ajustées avec son intervalle de confiance (IC) à 95 % et sa p-value. « Ajustée » est tout l’enjeu : la comparaison est faite comme si chaque bras était parti de la même valeur initiale, de sorte qu’un déséquilibre fortuit de la sévérité initiale ne puisse se faire passer pour un effet du traitement.

C’est un tableau du flux de travail TLF (tables, listings et figures) en pharma, construit à partir d’un seul jeu de données d’analyse : un BDS (Basic Data Structure) ADaM (Analysis Data Model) — le jeu de données d’efficacité à une ligne par sujet et par visite qui porte déjà la valeur d’analyse AVAL, la valeur initiale BASE, et la variation CHG, conformément au CDISC ADaM Implementation Guide (ADaMIG). Nous le construisons à la façon de l’industrie — avec le moteur de mise en page rtables et son compagnon clinique tern — sur des données pharmaverse publiques, pour que chaque ligne s’exécute telle quelle, en suivant la référence canonique summarize_ancova() de tern, réécrite en une seule construction guidée.

Voici où nous allons — la variation moyenne ajustée par rapport à la valeur initiale dans chaque bras, avec son IC à 95 %, calculée à partir de l’ANCOVA que nous construisons ci-dessous :

Point-and-interval plot of the adjusted (least-squares) mean change from baseline in diastolic blood pressure at Week 24 for each treatment arm, with 95 percent confidence intervals. Placebo (azure) sits at about minus 1.6 mmHg, Xanomeline Low Dose (orange) at about minus 0.1 mmHg, and Xanomeline High Dose (green) at about minus 1.4 mmHg. A dashed horizontal line marks zero change. All three intervals span zero and overlap heavily, showing no clear treatment effect on this endpoint.

Les trois intervalles chevauchent la ligne pointillée du zéro et se recouvrent largement : sur ce critère, les données ne montrent aucun effet du traitement. C’est aussi un vrai résultat, et d’ici la fin de cette leçon vous l’aurez produit sous forme de tableau ANCOVA formel — et, tout aussi important, vous saurez lire si un IC franchit le zéro. Si « ADaM », « BDS », « variation par rapport à la valeur initiale » ou « bras de traitement » vous sont nouveaux, commencez par Créer l’ADSL en R avec admiral, qui construit le jeu de données au niveau sujet dont proviennent les indicateurs de population.

Ce que montre un tableau d’efficacité (ANCOVA)

Un tableau d’efficacité pour un critère continu a une anatomie fixe. C’est le résumé visible d’un seul modèle linéaire — CHG ~ arm + baseline — lu un bras par colonne :

Partie Ce que c’est Dans cette leçon
Critère La réponse continue, en général la variation par rapport à la valeur initiale (CHG) Variation de la pression artérielle diastolique à la semaine 24
Ajustement La ou les covariables sur lesquelles le modèle conditionne Valeur initiale (BASE)
Colonnes Les bras de traitement ; le premier est la référence Placebo (réf) · Xanomeline Low · Xanomeline High
n Sujets contribuant au modèle dans ce bras Effectif analysé par bras
Moyenne ajustée (LS) La variation moyenne du bras à la valeur initiale moyenne commune p. ex. Placebo −1.6 mmHg
Différence des moyennes LS Bras actif moins la référence p. ex. Low − Placebo
IC à 95 % L’intervalle autour de cette différence Exclut 0 ⇒ significatif
p-value Test que la différence vaut 0 (non ajusté pour la multiplicité) p. ex. 0.48

Trois conventions décident si le tableau est juste :

  • Le critère est la variation, et la valeur initiale est une covariable — pas la réponse. Vous modélisez CHG (ou AVAL avec ajustement sur la valeur initiale), et BASE entre du côté droit comme terme d’ajustement. Analyser la variation et ajuster sur la valeur initiale est l’approche standard de l’ICH E9 : elle retire la part de la réponse expliquée par le point de départ du sujet, de sorte que la comparaison des traitements soit équitable.
  • Les moyennes sont ajustées, pas brutes. La cellule d’un bras est sa moyenne des moindres carrés (moyenne LS) — aussi appelée moyenne marginale estimée — l’estimation par le modèle de la variation moyenne de ce bras si tous les bras partageaient la même valeur initiale moyenne. Quand la valeur initiale diffère d’un bras à l’autre (c’est en général le cas, un peu), la moyenne LS et la moyenne brute diffèrent. Rapporter la moyenne brute à la place est une erreur courante.
  • La comparaison se fait face à une référence fixe. Un bras — ici le placebo — est la référence, et chaque différence est ce bras actif moins la référence. Un IC à 95 % sur la différence qui exclut 0 est un effet du traitement ajusté statistiquement significatif ; un IC qui inclut 0 ne l’est pas.

Les données

Nous utilisons le jeu de données ADVS (Analysis Data Vital Signs) fourni dans pharmaverseadam — l’étude pilote CDISC (Clinical Data Interchange Standards Consortium) synthétique et libre de licence comparant le placebo à deux doses de Xanomeline. ADVS est un BDS (Basic Data Structure) ADaM : une ligne par sujet, par paramètre et par visite, portant déjà la valeur d’analyse AVAL, la valeur initiale BASE, et la variation par rapport à la valeur initiale CHG — donc aucune dérivation n’est nécessaire ici.

Notre critère est la variation par rapport à la valeur initiale de la pression artérielle diastolique (PARAMCD == "DIABP", en mmHg) à la semaine 24, la fin de la période de traitement en double aveugle. La pression artérielle diastolique est une mesure clinique continue qui tient lieu de critère d’efficacité de l’essai ; dans une vraie étude sur la maladie d’Alzheimer, le critère principal serait un score cognitif, mais le tableau ANCOVA se construit de façon identique pour tout critère continu de variation par rapport à la valeur initiale.

Trois filtres mettent en place la population d’analyse. Nous gardons les enregistrements d’analyse pour le critère (PARAMCD, AVISIT, et — parce que les signes vitaux sont mesurés dans plusieurs positions corporelles — la mesure en décubitus ATPT == "AFTER LYING DOWN FOR 5 MINUTES", de sorte qu’il y ait exactement une ligne par sujet) ; l’indicateur d’analyse ANL01FL == "Y" (l’enregistrement choisi pour l’analyse) ; et la population de sécurité SAFFL == "Y". Les analyses d’efficacité sont conventionnellement menées sur la population en intention de traiter (ITT) ou d’analyse complète ; cet ADaM pilote ne fournit que l’indicateur de sécurité, nous l’utilisons donc en signalant la distinction.

library(dplyr, warn.conflicts = FALSE)
library(pharmaverseadam)

arm_levels <- c("Placebo", "Xanomeline Low Dose", "Xanomeline High Dose")

# ADVS (BDS) — one row per subject per visit; keep the Week 24 diastolic-BP
# change-from-baseline analysis record, supine, for the safety population.
anl <- pharmaverseadam::advs %>%
  filter(
    PARAMCD  == "DIABP",
    AVISIT   == "Week 24",
    ATPT     == "AFTER LYING DOWN FOR 5 MINUTES",
    ANL01FL  == "Y",
    SAFFL    == "Y",
    !is.na(CHG), !is.na(BASE)
  ) %>%
  mutate(TRT01A = factor(TRT01A, levels = arm_levels))

anl %>%
  select(USUBJID, TRT01A, PARAM, AVISIT, BASE, AVAL, CHG) %>%
  head(5)
# A tibble: 5 × 7
  USUBJID     TRT01A               PARAM                AVISIT  BASE  AVAL   CHG
  <chr>       <fct>                <chr>                <chr>  <dbl> <dbl> <dbl>
1 01-701-1015 Placebo              Diastolic Blood Pre… Week …    56    63     7
2 01-701-1028 Xanomeline High Dose Diastolic Blood Pre… Week …    85    73   -12
3 01-701-1034 Xanomeline High Dose Diastolic Blood Pre… Week …    60    81    21
4 01-701-1097 Xanomeline Low Dose  Diastolic Blood Pre… Week …    72    83    11
5 01-701-1118 Placebo              Diastolic Blood Pre… Week …    84    76    -8

Faire de TRT01A un facteur avec le placebo en premier remplit deux rôles : cela fixe l’ordre des colonnes du tableau (placebo, puis dose croissante), et — parce que l’ANCOVA prend le premier niveau de facteur comme référence — cela fait du placebo le comparateur. Regardez l’image brute avant de modéliser :

anl %>%
  group_by(TRT01A) %>%
  summarise(
    n         = n(),
    mean_base = round(mean(BASE), 1),   # average baseline diastolic BP
    mean_chg  = round(mean(CHG), 2),    # raw mean change from baseline
    .groups   = "drop"
  )
# A tibble: 3 × 4
  TRT01A                   n mean_base mean_chg
  <fct>                <int>     <dbl>    <dbl>
1 Placebo                 59      73.9    -1.05
2 Xanomeline Low Dose     25      76.6    -0.8 
3 Xanomeline High Dose    28      76.4    -1.93

Deux choses à remarquer. Les bras comptent 59, 25 et 28 sujets analysables à la semaine 24 (les bras actifs sont plus petits — les abandons éclaircissent les visites tardives). Et la valeur initiale moyenne diffère d’un bras à l’autre (le placebo part un peu plus bas), ce qui est précisément pourquoi nous ajustons : l’ANCOVA rapportera la variation de chaque bras à la valeur initiale moyenne commune, de sorte que cette différence de départ ne se répercute pas dans la comparaison des traitements.

Construire le tableau d’efficacité ANCOVA

La fonction tern qui crée la mise en page pour cela est summarize_ancova(). Vous lisez la mise en page de haut en bas comme une recette : démarrez un tableau, répartissez les colonnes par bras de traitement en nommant la référence, ajoutez les effectifs de colonne, puis appelez summarize_ancova() avec le critère (vars), l’arm et les covariates du modèle, et le niveau de confiance. Rien n’est calculé jusqu’à ce que build_table() applique la mise en page aux données — moment où tern ajuste lm(CHG ~ TRT01A + BASE), extrait les moyennes LS avec emmeans, et formate les lignes.

library(rtables)
library(tern)

lyt <- basic_table(
    title     = "Table 14-2.01",
    subtitles = "ANCOVA of Change from Baseline in Diastolic BP at Week 24 (Safety Population)"
  ) %>%
  split_cols_by("TRT01A", ref_group = "Placebo") %>%   # placebo is the reference column
  add_colcounts() %>%                                  # the (N=xx) header row
  summarize_ancova(
    vars       = "CHG",
    variables  = list(arm = "TRT01A", covariates = "BASE"),  # CHG ~ TRT01A + BASE
    conf_level = 0.95,
    var_labels = "Change from Baseline (adjusted for baseline)"
  )

build_table(lyt, df = anl)
Table 14-2.01
ANCOVA of Change from Baseline in Diastolic BP at Week 24 (Safety Population)

———————————————————————————————————————————————————————————————————————————————————————————————————
                                               Placebo   Xanomeline Low Dose   Xanomeline High Dose
                                               (N=59)          (N=25)                 (N=28)       
———————————————————————————————————————————————————————————————————————————————————————————————————
Change from Baseline (adjusted for baseline)                                                       
  n                                              59              25                     28         
  Adjusted Mean                                 -1.61           -0.13                 -1.35        
  Difference in Adjusted Means                                  1.48                   0.26        
    95% CI                                                  (-2.69, 5.66)         (-3.75, 4.27)    
    p-value                                                    0.4823                 0.8983       

Les deux arguments qui définissent l’analyse sont ref_group = "Placebo" (dans split_cols_by()) et variables = list(arm = "TRT01A", covariates = "BASE"). L’arm est la variable de traitement dont nous comparons les moyennes ajustées ; covariates est l’ensemble d’ajustement — ici juste la valeur initiale, mais vous ajouteriez des facteurs de stratification (c("BASE", "STRATA1")) exactement de la même manière. conf_level = 0.95 fixe l’IC.

Lire la sortie

Parcourez le tableau comme le fait un évaluateur :

  • n — 59 sous placebo, 25 sous faible dose, 28 sous forte dose sont entrés dans le modèle.
  • Adjusted Mean — la moyenne LS de variation par rapport à la valeur initiale, à la valeur initiale moyenne commune : environ −1.6 mmHg sous placebo, −0.1 sous faible dose, et −1.4 sous forte dose. Ce sont les estimations équitables du modèle par bras. Comparez-les aux moyennes brutes du résumé ci-dessus — elles diffèrent légèrement parce que la valeur initiale différait d’un bras à l’autre ; les moyennes LS sont les moyennes brutes après suppression de cette différence de valeur initiale.
  • Difference in Adjusted Means — chaque bras actif moins le placebo : +1.5 mmHg en faible dose et +0.3 mmHg en forte dose. Positif ici signifie que la pression diastolique du bras a baissé moins que celle du placebo.
  • IC à 95 % — la différence en faible dose est d’environ (−2.7, 5.7) et la différence en forte dose (−3.8, 4.3). Les deux intervalles incluent confortablement 0.
  • p-value0.48 et 0.90, toutes deux bien au-dessus de 0.05.

La lecture est sans ambiguïté : après ajustement sur la valeur initiale, aucune des deux doses de Xanomeline ne modifie la pression artérielle diastolique différemment du placebo — chaque IC couvre le zéro et chaque p est grand. Quand un IC à 95 % sur la différence exclut 0 (de façon équivalente p < 0.05), vous avez un effet du traitement ajusté statistiquement significatif ; ici, ce n’est pas le cas. Un résultat nul, proprement rapporté, est exactement ce que ce tableau existe pour montrer, et sa forme est identique à celle que vous présenteriez pour un essai positif — seuls les nombres changent.

Note

Les p-values que tern rapporte sont les tests par paires non ajustés du modèle. Quand une étude comporte plus d’un bras actif face à un témoin commun, le plan d’analyse peut exiger un ajustement de multiplicité (Dunnett, Bonferroni, une procédure de gatekeeping) pour que le taux d’erreur par famille soit contrôlé — le plan d’analyse statistique pré-spécifié décide lequel. Cet ajustement se superpose au même modèle de moyennes LS.

Quand l’ANCOVA ne suffit pas : une note sur le MMRM

Le tableau ci-dessus analyse une seule visite (semaine 24) et écarte les sujets qui ne l’ont pas atteinte — une ANCOVA en cas complets. Les essais longitudinaux modernes utilisent plus souvent un modèle mixte à mesures répétées (MMRM) : il modélise toutes les visites post-inclusion d’un coup, utilise les données disponibles de chaque sujet (ainsi un sujet ayant manqué la semaine 24 mais présent à la semaine 20 contribue encore), et gère la corrélation intra-sujet entre les visites. Le MMRM est le choix d’analyse principale par défaut dans beaucoup de soumissions récentes car il fait des hypothèses plus faibles sur les données manquantes que l’ANCOVA à visite unique ou le report de la dernière observation. Le tableau de rapport se ressemble beaucoup — des moyennes LS par bras, une différence, un IC, un p — c’est pourquoi l’ANCOVA est le bon endroit pour apprendre le schéma en premier. Le MMRM fera l’objet de sa propre leçon ; le modèle est ajusté avec le package mmrm et mis en tableau avec tern.mmrm.

🟢 Avec un agent IA

Demandez à Prova « comment ajouter un facteur de stratification à mon tableau d’efficacité summarize_ancova de tern, et comment cela change-t-il les moyennes LS ? » — elle répond en s’appuyant sur les leçons de ce pilier, avec du code exécutable que vous pouvez essayer sur les données d’exemple pharmaverse. The runtime is the judge. Demandez à Prova →

Problèmes fréquents

Vous avez rapporté les moyennes brutes, pas les moyennes LS. Un group_by(arm) |> summarise(mean(CHG)) donne la variation moyenne non ajustée ; le tableau d’efficacité rapporte la moyenne des moindres carrés de l’ANCOVA — la moyenne ajustée à la valeur initiale commune. Elles diffèrent dès que la valeur initiale est déséquilibrée entre les bras (presque toujours, un peu). summarize_ancova() renvoie la moyenne LS (lsmean) ; ne l’écrasez pas avec un aggregate() brut.

La valeur initiale est du mauvais côté du modèle. Le critère est la variation (CHG), et la valeur initiale (BASE) est une covariable — elle a sa place dans covariates, à droite de la formule, jamais comme réponse. Si vous modélisez par erreur BASE comme réponse (ou analysez AVAL sans ajuster du tout sur BASE), le tableau répond à la mauvaise question. Modélisez CHG ~ arm + BASE.

Le mauvais bras est la référence. L’ANCOVA prend le premier niveau de facteur de la variable de bras comme référence, et split_cols_by(..., ref_group = "Placebo") le rend explicite. Si le placebo n’est pas en premier (p. ex. les bras sont tombés par ordre alphabétique, si bien que “Xanomeline High Dose” est en tête), chaque “différence” est calculée face au mauvais comparateur et change de signe. Réglez les niveaux de facteur avec le placebo en premier et passez ref_group.

Plus d’une ligne par sujet se glisse dans le modèle. L’ANCOVA attend un enregistrement d’analyse par sujet. Les signes vitaux sont mesurés dans plusieurs positions corporelles et à plusieurs instants, si bien que sans fixer le paramètre, la visite, la position et l’indicateur d’analyse (PARAMCD, AVISIT, ATPT, ANL01FL == "Y") vous pouvez donner trois lignes par sujet au modèle et gonfler silencieusement n. Filtrez d’abord vers un seul enregistrement d’analyse, et vérifiez n() par bras avant de modéliser.

Questions fréquentes

C’est le tableau qui rapporte le résultat sur le critère principal (ou secondaire clé) de l’essai — la réponse formelle à le traitement a-t-il fonctionné ? Pour un critère continu, c’est une ANCOVA (analyse de covariance) de la variation par rapport à la valeur initiale : par bras de traitement, il montre le nombre de sujets et la variation moyenne ajustée (des moindres carrés), puis, pour chaque bras actif face à la référence, la différence des moyennes ajustées avec un IC à 95 % et une p-value, en ajustant sur la valeur initiale. Il figure en section 14.2 d’un Clinical Study Report, dont la structure suit la directive ICH E3.

Utilisez summarize_ancova() : basic_table() |> split_cols_by("TRT01A", ref_group = "Placebo") |> add_colcounts() |> summarize_ancova(vars = "CHG", variables = list(arm = "TRT01A", covariates = "BASE"), conf_level = 0.95), puis appliquez-le avec build_table(df = anl). tern ajuste lm(CHG ~ TRT01A + BASE), extrait les moyennes des moindres carrés avec emmeans, et met en page n, la moyenne ajustée, la différence, l’IC et la p-value. La construction complète est détaillée ci-dessus sur des données pharmaverse publiques.

Une moyenne des moindres carrés (aussi appelée moyenne marginale estimée) est une estimation par modèle de la moyenne d’un bras à une valeur commune des covariables — ici, la variation moyenne par rapport à la valeur initiale si chaque bras avait la même valeur initiale moyenne. Une moyenne brute fait simplement la moyenne des valeurs observées dans le bras. Elles coïncident uniquement lorsque la covariable est parfaitement équilibrée entre les bras ; quand la valeur initiale diffère (comme c’est en général le cas), la moyenne LS est l’estimation équitable ajustée et la moyenne brute ne l’est pas. Le tableau d’efficacité rapporte toujours la moyenne LS.

Parce qu’une partie du résultat d’un sujet s’explique par son point de départ. Ajuster sur la valeur initiale (comme covariable) retire cette variabilité, ce qui augmente la précision de l’estimation du traitement et protège contre un déséquilibre fortuit de la valeur initiale qui serait lu comme un effet du traitement. Analyser la variation par rapport à la valeur initiale et inclure la valeur initiale comme covariable est l’approche standard recommandée dans ICH E9 et la recommandation EMA/FDA sur les covariables initiales.

La différence des moyennes ajustées est la moyenne LS du bras actif moins la moyenne LS du bras de référence — l’effet du traitement estimé sur le critère, dans les unités du critère. Son IC à 95 % est l’éventail des effets compatibles avec les données : si l’intervalle exclut 0, l’effet est statistiquement significatif (de façon équivalente p < 0.05) ; s’il inclut 0, comme dans le tableau de cette leçon, il n’y a pas de différence significative par rapport à la référence. Lisez toujours l’IC, pas seulement la p-value — sa largeur vous dit à quel point l’estimation est précise.

L’ANCOVA analyse un seul instant (p. ex. la visite de fin de traitement) comme variation par rapport à la valeur initiale ajustée sur la valeur initiale — simple, et ce que construit cette leçon. Le MMRM (modèle mixte à mesures répétées) analyse conjointement toutes les visites post-inclusion, garde les sujets à suivi partiel, et modélise la corrélation intra-sujet, de sorte qu’il fait des hypothèses plus faibles sur les données manquantes et est le choix d’analyse principale par défaut dans beaucoup d’essais récents. Le tableau de rapport se ressemble (des moyennes LS, une différence, un IC, un p) ; le modèle est ajusté avec le package mmrm et mis en tableau avec tern.mmrm. Apprenez l’ANCOVA d’abord — le schéma se transfère directement.

Testez vos connaissances

En utilisant l’objet anl de cette leçon, construisez le même tableau ANCOVA mais ajoutez la moyenne arithmétique brute de CHG comme statistique supplémentaire, pour voir côte à côte la moyenne ajustée (LS) et la moyenne brute. Quel bras voit sa moyenne LS s’éloigner le plus de sa moyenne brute, et pourquoi ?

L’argument .stats de summarize_ancova() contrôle quelles statistiques apparaissent ; le défaut est c("n", "lsmean", "lsmean_diff", "lsmean_diff_ci", "pval"). Il n’offre pas de moyenne brute, alors calculez-la séparément avec group_by(TRT01A) |> summarise(raw = mean(CHG)) et lisez-la à côté du tableau. La moyenne LS s’écartera le plus de la moyenne brute dans le bras dont la valeur initiale est la plus éloignée de la valeur initiale moyenne globale — c’est le bras que l’ajustement sur la valeur initiale déplace le plus.

library(dplyr)
library(rtables)
library(tern)

# the LS (adjusted) means — from the ANCOVA
lyt <- basic_table() %>%
  split_cols_by("TRT01A", ref_group = "Placebo") %>%
  add_colcounts() %>%
  summarize_ancova(
    vars = "CHG",
    variables = list(arm = "TRT01A", covariates = "BASE"),
    conf_level = 0.95,
    var_labels = "Change from Baseline (adjusted)"
  )
build_table(lyt, df = anl)

# the RAW means and mean baselines — for comparison
anl %>%
  group_by(TRT01A) %>%
  summarise(n = n(), mean_base = round(mean(BASE), 1),
            raw_mean_chg = round(mean(CHG), 2), .groups = "drop")

La moyenne ajustée (LS) et la moyenne brute diffèrent parce que les valeurs initiales moyennes des bras diffèrent. Le bras dont la valeur initiale moyenne se situe le plus loin de la moyenne globale est celui que l’ajustement déplace le plus — ce déplacement est précisément ce que fait l’ANCOVA, et pourquoi le tableau d’efficacité rapporte la moyenne LS plutôt que la moyenne brute.

A. La moyenne arithmétique brute de la variation par rapport à la valeur initiale dans ce bras B. La variation moyenne du bras par rapport à la valeur initiale estimée à la valeur initiale moyenne commune (la moyenne LS) C. La différence entre ce bras et le placebo

B. La « Adjusted Mean » est la moyenne des moindres carrés (moyenne LS) — l’estimation par le modèle de la variation moyenne du bras si tous les bras partageaient la même valeur initiale moyenne. A est la moyenne brute, qui ignore l’ajustement sur la valeur initiale et diffère dès que la valeur initiale est déséquilibrée ; C est la ligne distincte « Difference in Adjusted Means », la moyenne LS du bras moins la moyenne LS de la référence.

Conclusion

Le tableau d’efficacité est la lecture du critère principal d’un Clinical Study Report, et pour un critère continu, il se résume à un seul modèle linéaire : variation par rapport à la valeur initiale, ajustée sur la valeur initiale, comparée entre les bras. Avec rtables et tern, ce modèle est un seul appel de mise en page — summarize_ancova(vars = "CHG", variables = list(arm = "TRT01A", covariates = "BASE")) à l’intérieur d’un split_cols_by("TRT01A", ref_group = "Placebo") — et la sortie est le tableau standard : n et la moyenne LS ajustée par bras, puis la différence des moyennes LS avec son IC à 95 % et sa p-value face à la référence. Lisez d’abord l’IC : exclut zéro et l’effet est significatif ; inclut zéro, comme ici, et il ne l’est pas. Faites trois choses correctement — modéliser la variation avec la valeur initiale comme covariable, rapporter la moyenne LS et non la moyenne brute, et fixer le bras de référence — et votre tableau d’efficacité répond correctement à la question centrale de l’essai, quel que soit le sens où tombent les nombres.

Note

Cette leçon est reproductible : chaque résultat de cette page a été produit par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.

Leçons connexes

  • Le tableau démographique rtables — la Table 1, le résumé initial qui ouvre le rapport, construit avec le même moteur de mise en page rtables/tern. · Le tableau des événements indésirables — la pièce maîtresse de sécurité, les EI survenus sous traitement par classe de système d’organes et terme préféré. · Construire le jeu de données ADaM de délai jusqu’à l’événement (ADTTE) — le jeu de données d’efficacité derrière la figure de Kaplan-Meier, la prochaine sortie de la série.
  • Où cela s’inscrit : construire les ADaM avec admiral (ADSL, ADVS, ADTTE) → générer les tables, listings et figures (le tableau démographique → le tableau de synthèse des EI → le tableau d’efficacité / ANCOVA (vous êtes ici) → la figure de Kaplan-Meier) → assembler la soumission. Le tableau d’efficacité est le résultat sur le critère principal de cette séquence.
Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Tableau d’efficacité en R : ANCOVA et moyennes LS},
  date = {2026-07-01},
  url = {https://www.datanovia.com/learn/pharma-clinical/04-tlf-generation/efficacy-table-tern},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Tableau d’efficacité en R : ANCOVA et moyennes LS.” 2026. July 1. https://www.datanovia.com/learn/pharma-clinical/04-tlf-generation/efficacy-table-tern.