Domaine SDTM GF en R : expression génique et RNA-seq

Tabulez les résultats de transcription — TPM, FPKM dérivés du RNA-seq et expression relative qPCR — dans le domaine CDISC GF comme résultats numériques, la mesure dans GFSTRESN et son unité dans GFSTRESU

Le workflow complet d’expression génique pour le domaine CDISC SDTM Genomics Findings (GF). S’appuyant sur les fondamentaux du domaine GF et la leçon sur les variants, cette leçon mappe les résultats de transcription — expression RNA-seq normalisée (TPM, FPKM, comptages normalisés) et expression relative qPCR (fold-change, Ct/Cq) — en enregistrements GF de la classe Findings. Contrairement à un appel de variant, qui est un résultat caractère, l’expression génique est une quantité mesurée : la valeur atterrit dans la variable de résultat numérique GFSTRESN avec son unité dans GFSTRESU, la technique dans GFMETHOD, et le gène dans GFTESTCD/GFTEST. Découvrez ce que signifie chaque mesure d’expression et où elle se mappe, pourquoi la qPCR sur un seul gène, un panel et l’expression par gène dérivée du RNA-seq ne diffèrent que par la méthode, et — le principe cardinal — pourquoi GF contient la mesure d’expression rapportée, jamais les reads FASTQ ni la matrice de comptage brute. Le tout avec R de base et sdtm.oak, chaque code étant un espace réservé illustratif à vérifier contre la terminologie contrôlée CDISC.

Date de publication

1 juillet 2026

Modifié

7 juillet 2026

AstucePoints clés
  • L’expression génique est un résultat GF numérique. Là où un appel de variant est un résultat caractère (DETECTED), une mesure d’expression génique — le degré d’activité de transcription d’un gène — est un nombre. Dans le domaine CDISC SDTM (Study Data Tabulation Model) GF (Genomics Findings), elle atterrit dans la variable de résultat numérique GFSTRESN, avec son unité dans GFSTRESU — pas dans le GFSTRESC caractère qu’utilise un variant.
  • L’unité est le point crucial — ne la supprimez jamais. Un nombre d’expression n’a aucun sens sans son unité : TPM (transcrits par million), FPKM/RPKM, un comptage normalisé, un fold-change qPCR, une valeur de cycle Ct/Cq. Portez l’unité d’origine dans GFORRESU et l’unité standardisée dans GFSTRESU.
  • GFCAT la marque comme expression, pas comme variation. La catégorie de transcription (à titre illustratif GENE EXPRESSION) sépare ces résultats des lignes GENETIC VARIATION de la leçon sur les variants — même domaine, même forme Findings, une catégorie différente et un résultat numérique.
  • La technique réside dans GFMETHOD ; le gène réside dans GFTESTCD/GFTEST. La qPCR sur un seul gène, un panel d’expression ciblé et l’expression par gène dérivée du RNA-seq ne diffèrent que par la méthode — une ligne GF par gène, par spécimen, quel qu’ait été l’instrument de mesure.
  • GF contient la mesure d’expression, jamais les reads. Une valeur TPM PD-L1 est un résultat GF ; les reads FASTQ et la matrice de comptage RNA-seq brute à partir desquels elle a été quantifiée sont hors du périmètre de SDTM — le séquençage et la quantification relèvent de l’analyse en amont.

Introduction

Le run RNA-seq a produit environ 20 000 valeurs d’expression génique par tumeur. Le dossier de soumission ne veut pas les reads, et il ne veut pas les 20 000 gènes — il veut l’expression PD-L1, l’expression EGFR, le marqueur de prolifération, tabulée comme tout autre résultat. C’est le rôle du domaine GF pour les données de transcription.

L’expression génique est le degré d’activité de transcription d’un gène en ARN — le signal biologique sur lequel repose la biologie d’une tumeur, et un biomarqueur que les régulateurs demandent de plus en plus. Le RNA-seq (séquençage de l’ARN) et la qPCR (réaction en chaîne par polymérase quantitative) sont les deux techniques qui la mesurent. Cette leçon mappe leurs résultats dans GF (Genomics Findings), le domaine de la classe Findings du SDTM (Study Data Tabulation Model) de CDISC (Clinical Data Interchange Standards Consortium) pour les données pharmacogénomiques.

Elle suppose que vous savez déjà ce qu’est GF. Sinon, commencez par le domaine Genomics Findings (GF) — sa structure, les variables de la classe Findings, le lien biospécimen, et le principe cardinal selon lequel GF tabule le résultat appelé, jamais les fichiers FASTQ/BAM/VCF bruts. La leçon sur les mutations et variants a mappé la moitié variation de GF — les changements génomiques sous forme d’appels caractère. Cette leçon mappe l’autre moitié : la transcription. Ensemble, elles complètent le cluster génomique : fondamentaux → variants → expression.

La distinction qui gouverne tout ce qui suit : un variant est un résultat caractère ; l’expression est un nombre. Voici où nous allons — un petit panel d’expression RNA-seq, trois gènes sur trois spécimens de tumeur pulmonaire, chaque valeur étant un enregistrement GF en attente de tabulation :

A subject-by-gene heatmap of RNA-seq gene-expression values for three lung-tumour subjects. Rows are subjects (01-701-1033, 01-701-1034, 01-701-1047); columns are three genes (CD274/PD-L1, EGFR, MKI67). Each tile is shaded on a continuous azure scale from lighter (low expression) to darker (high expression) and labelled with its TPM value: subject 1033 has CD274 48.2, EGFR 112.5, MKI67 76.3; subject 1034 has CD274 6.4, EGFR 88.1, MKI67 41.7; subject 1047 has CD274 21.9, EGFR 54.0, MKI67 95.2. The point is that a matrix of numeric expression measures becomes a set of tidy, numeric SDTM findings, one per gene per specimen.

Chaque tuile est un enregistrement GF — l’expression d’un gène sur un spécimen prélevé, un nombre avec une unité. À la fin de cette leçon, vous les aurez tous construits à partir d’un export d’expression brut, ajouté l’unité et la méthode, et relié chacun à son biospécimen.

Note

Ceci est de la tabulation, pas de l’analyse — et c’est tout l’intérêt. Le pilier Bioinformatique enseigne le travail en amont : aligner les reads RNA-seq, quantifier l’expression par gène, et exécuter l’analyse d’expression différentielle. Cette leçon commence là où cela s’arrête — à partir d’une table de valeurs d’expression déjà quantifiées — et les tabule en aval vers CDISC SDTM pour un dossier de soumission. Quantifiez l’expression là-bas ; tabulez la mesure rapportée ici. Les deux ne se recoupent jamais.

Pourquoi l’expression se mappe différemment d’un variant

Un appel de variant et une mesure d’expression sont tous deux des résultats GF, mais ils remplissent des variables de résultat différentes — et bien le comprendre, c’est toute la leçon. Rappelez-vous que GF, comme tout domaine Findings, sépare un résultat entre un côté collecté (--ORRES, tel que le laboratoire l’a rapporté) et un côté standardisé, et le côté standardisé comporte deux variables : une caractère (GFSTRESC) et une numérique (GFSTRESN).

Résultat Nature Collecté Caractère standardisé Numérique standardisé + unité
Variant (leçon sur les variants) Appel catégoriel GFORRES = p.L858R GFSTRESC = DETECTED — (aucun nombre significatif)
Expression génique (cette leçon) Quantité mesurée GFORRES = 48.2, GFORRESU = TPM GFSTRESC = 48.2 GFSTRESN = 48.2, GFSTRESU = TPM

La règle : une valeur d’expression mesurée atterrit dans GFSTRESN (numérique) avec son unité dans GFSTRESU, exactement comme un résultat de laboratoire tel que l’hémoglobine atterrit dans LBSTRESN/LBSTRESU. Un appel de variant n’a aucun nombre significatif, il utilise donc GFSTRESC et laisse GFSTRESN vide ; une valeur d’expression n’a pas d’appel détecté/non détecté, elle remplit donc les variables numériques. Placez un nombre d’expression dans un champ caractère sans GFSTRESN, et un évaluateur ne peut pas calculer dessus — l’erreur de mapping d’expression la plus fréquente.

GFCAT marque aussi la séparation au niveau de la catégorie : les lignes de variant portent GENETIC VARIATION ; les lignes d’expression portent une catégorie de transcription, à titre illustratif GENE EXPRESSION. Contrairement au code de test, GFCAT et GFSCAT sont des regroupements définis par le promoteur sans liste de codes CDISC publiée — seuls le code de test Genomic Findings (GFTESTCD, C181178) et le nom de test (GFTEST, C181179) relèvent de la terminologie contrôlée, le domaine GF étant détaillé dans le SDTMIG v3.4, le guide d’implémentation SDTM qui a publié GF — choisissez les valeurs de catégorie de façon cohérente et documentez-les, sans jamais en affirmer une comme officielle CDISC.

Les mesures d’expression — et leurs unités

L’unité est le résultat. Un nombre d’expression sans son unité est inutilisable, et chaque technique rapporte sa propre mesure. Connaissez celles que vous rencontrerez, ce que chacune signifie, et où elle se mappe dans GF :

Mesure Ce que c’est Unité typique Résultat GF
TPM (transcrits par million) Abondance normalisée en RNA-seq ; par échantillon, les valeurs somment à un million, si bien qu’un TPM est la part d’un gène dans le pool de transcrits — comparable entre échantillons TPM GFSTRESN + GFSTRESU = TPM
FPKM / RPKM (fragments / reads par kilobase par million) Normalisation RNA-seq plus ancienne ; corrige la longueur du gène et la profondeur, mais n’est pas comparable entre échantillons comme l’est le TPM FPKM / RPKM GFSTRESN + GFSTRESU = FPKM
Comptage normalisé Un comptage RNA-seq mis à l’échelle par un facteur de taille de librairie (p. ex. par un pipeline d’expression différentielle) normalized count GFSTRESN + GFSTRESU = normalized count
Expression relative / fold-change Résultat qPCR par rapport à un gène de référence et à un calibrateur (la méthode 2^−ΔΔCt) — de combien de fois un gène est sur- ou sous-exprimé fold change GFSTRESN + GFSTRESU = fold change
Ct / Cq (cycle seuil / cycle de quantification) Le cycle qPCR brut auquel le signal franchit le seuil ; un Cq plus bas signifie plus de matrice de départ, il est donc inversement lié à l’expression Ct (cycles) GFSTRESN + GFSTRESU = Ct

Deux choses à intégrer. Premièrement, le TPM est la mesure RNA-seq par défaut vers laquelle se tourner car, contrairement au FPKM/RPKM, il est cohérent entre les échantillons — RPKM/FPKM étaient les mesures RNA-seq d’origine (Mortazavi et al. 2008) mais leurs totaux par échantillon diffèrent, si bien qu’un FPKM brut n’est pas directement comparable entre sujets. Deuxièmement, la qPCR rapporte une mesure relative, pas une mesure absolue : la méthode d’expression relative 2^−ΔΔCt donne un fold-change par rapport à un gène de référence et à un calibrateur, et le Cq sous-jacent est défini par les directives MIQE (Minimum Information for Publication of Quantitative Real-Time PCR Experiments) — reportez celle que le laboratoire a rapportée, et son unité, à l’identique.

La leçon : quelle que soit la mesure, la valeur va dans GFSTRESN et l’unité dans GFSTRESU. La mesure change avec la technique ; la cible du mapping, non.

Construire un domaine GF à partir d’un export d’expression RNA-seq

Deux entrées pilotent la construction : l’export d’expression brut issu de la technique, et la connaissance de la structure GF dans laquelle le mapper. Un pipeline RNA-seq vous remet une ligne par gène et par échantillon — un sujet, le spécimen, le gène, la valeur quantifiée, et l’unité. Nous construisons d’abord cette table brute. Les références de spécimens (SPEC4.1, SPEC5.1, SPEC6.1) sont de vrais identifiants de biospécimens issus des données d’exemple be que nous relierons plus loin — les trois spécimens de tumeur pulmonaire qu’a aussi utilisés la leçon sur les variants.

library(sdtm.oak)

# A raw RNA-seq expression export: one row per gene per specimen. TPM (transcripts
# per million) is the normalized expression measure; the reads and the full count
# matrix are NOT here — they stay upstream and never reach SDTM. PD-L1 is the protein
# name for the gene CD274 (a checkpoint-immunotherapy biomarker); MKI67 marks proliferation.
expr_raw <- data.frame(
  SUBJ   = c("01-701-1033","01-701-1033","01-701-1033",
             "01-701-1034","01-701-1034","01-701-1034",
             "01-701-1047","01-701-1047","01-701-1047"),
  SPECREF = c("SPEC4.1","SPEC4.1","SPEC4.1",
              "SPEC5.1","SPEC5.1","SPEC5.1",
              "SPEC6.1","SPEC6.1","SPEC6.1"),
  GENE   = c("CD274","EGFR","MKI67", "CD274","EGFR","MKI67", "CD274","EGFR","MKI67"),
  TPM    = c(48.2, 112.5, 76.3, 6.4, 88.1, 41.7, 21.9, 54.0, 95.2),
  UNIT   = rep("TPM", 9),
  ASSAY  = rep("RNA-seq", 9),
  COLLDT = c("2025-09-10","2025-09-10","2025-09-10",
             "2025-10-05","2025-10-05","2025-10-05",
             "2025-11-01","2025-11-01","2025-11-01"),
  stringsAsFactors = FALSE
)

head(expr_raw)
         SUBJ SPECREF  GENE   TPM UNIT   ASSAY     COLLDT
1 01-701-1033 SPEC4.1 CD274  48.2  TPM RNA-seq 2025-09-10
2 01-701-1033 SPEC4.1  EGFR 112.5  TPM RNA-seq 2025-09-10
3 01-701-1033 SPEC4.1 MKI67  76.3  TPM RNA-seq 2025-09-10
4 01-701-1034 SPEC5.1 CD274   6.4  TPM RNA-seq 2025-10-05
5 01-701-1034 SPEC5.1  EGFR  88.1  TPM RNA-seq 2025-10-05
6 01-701-1034 SPEC5.1 MKI67  41.7  TPM RNA-seq 2025-10-05

Chaque ligne est un résultat d’expression : un sujet, le spécimen tumoral (SPECREF), le gène, la valeur TPM quantifiée, et son unité. Il y a trois gènes ici — pas 20 000 : le dossier de soumission porte les gènes biomarqueurs pré-spécifiés, pas tout le transcriptome. Et notez ce qui est absent : pas de reads, pas de matrice de comptage, seulement la mesure rapportée.

Mapper l’export brut vers la structure GF

Maintenant, remplissez les colonnes GF à partir des champs bruts avec R de base. La valeur est numérique, donc — contrairement à un variant — elle remplit GFSTRESN, et son unité remplit GFORRESU/GFSTRESU. GFCAT est la catégorie de transcription pour chaque ligne ; GFMETHOD enregistre la technique. Nous construisons GFTESTCD à partir du gène en suivant la convention de fragment-suffixe de GF — et le signalons clairement comme illustratif, à vérifier contre C181178, non affirmé comme un code officiel.

# GFTESTCD below is ILLUSTRATIVE (gene root + "EXP"), following the GF suffix-fragment
# convention. The authoritative code list is NCI EVS subset C181178 — verify there.
# Expression is a NUMBER: it lands in GFSTRESN (numeric) with its unit in GFSTRESU,
# NOT in the character GFSTRESC a variant call uses.
gf <- data.frame(
  STUDYID  = "CDISCPILOT01",
  DOMAIN   = "GF",
  USUBJID  = expr_raw$SUBJ,
  GFREFID  = expr_raw$SPECREF,                          # links to the biospecimen
  GFTESTCD = paste0(expr_raw$GENE, "EXP"),              # illustrative — verify vs C181178
  GFTEST   = paste(expr_raw$GENE, "Expression"),
  GFCAT    = "GENE EXPRESSION",                         # illustrative transcription category
  GFORRES  = as.character(expr_raw$TPM),                # the value, as reported
  GFORRESU = expr_raw$UNIT,                             # original unit (TPM)
  GFSTRESC = as.character(expr_raw$TPM),                # standardized character form
  GFSTRESN = expr_raw$TPM,                              # standardized NUMERIC value
  GFSTRESU = expr_raw$UNIT,                             # standardized unit (TPM)
  GFSPEC   = "TUMOR TISSUE",
  GFMETHOD = expr_raw$ASSAY,                            # the assay: RNA-seq
  GFDTC    = expr_raw$COLLDT,
  stringsAsFactors = FALSE
)

gf[, c("USUBJID", "GFTESTCD", "GFCAT", "GFORRES", "GFSTRESN", "GFSTRESU", "GFMETHOD")]
      USUBJID GFTESTCD           GFCAT GFORRES GFSTRESN GFSTRESU GFMETHOD
1 01-701-1033 CD274EXP GENE EXPRESSION    48.2     48.2      TPM  RNA-seq
2 01-701-1033  EGFREXP GENE EXPRESSION   112.5    112.5      TPM  RNA-seq
3 01-701-1033 MKI67EXP GENE EXPRESSION    76.3     76.3      TPM  RNA-seq
4 01-701-1034 CD274EXP GENE EXPRESSION     6.4      6.4      TPM  RNA-seq
5 01-701-1034  EGFREXP GENE EXPRESSION    88.1     88.1      TPM  RNA-seq
6 01-701-1034 MKI67EXP GENE EXPRESSION    41.7     41.7      TPM  RNA-seq
7 01-701-1047 CD274EXP GENE EXPRESSION    21.9     21.9      TPM  RNA-seq
8 01-701-1047  EGFREXP GENE EXPRESSION      54     54.0      TPM  RNA-seq
9 01-701-1047 MKI67EXP GENE EXPRESSION    95.2     95.2      TPM  RNA-seq

L’expression de chaque gène est désormais une ligne : la valeur numérique dans GFSTRESN, son unité dans GFSTRESU, la catégorie de transcription dans GFCAT, et la technique dans GFMETHOD. Le GFSTRESC caractère porte la valeur sous forme de texte (les domaines Findings remplissent les deux formes), mais c’est le nombre dans GFSTRESN sur lequel un évaluateur calcule — et qui serait vide sur une ligne de variant.

Numéroter les enregistrements avec derive_seq

Un enregistrement Findings conforme a besoin d’un numéro de séquence unique au sein de chaque sujet. derive_seq() de sdtm.oak — le moteur raw-to-SDTM de pharmaverse — ordonne les lignes et les numérote par sujet, exactement comme il le fait pour LBSEQ ou VSSEQ.

gf <- derive_seq(gf, tgt_var = "GFSEQ",
                 rec_vars = c("USUBJID", "GFTESTCD"),
                 sbj_vars = "USUBJID")
gf <- as.data.frame(gf)
gf <- gf[, c("STUDYID", "DOMAIN", "USUBJID", "GFSEQ", "GFREFID", "GFTESTCD", "GFTEST",
             "GFCAT", "GFORRES", "GFORRESU", "GFSTRESN", "GFSTRESU", "GFSPEC",
             "GFMETHOD", "GFDTC")]

head(gf[, c("USUBJID", "GFSEQ", "GFTESTCD", "GFSTRESN", "GFSTRESU", "GFSPEC")])
      USUBJID GFSEQ GFTESTCD GFSTRESN GFSTRESU       GFSPEC
1 01-701-1033     1 CD274EXP     48.2      TPM TUMOR TISSUE
2 01-701-1033     2  EGFREXP    112.5      TPM TUMOR TISSUE
3 01-701-1033     3 MKI67EXP     76.3      TPM TUMOR TISSUE
4 01-701-1034     1 CD274EXP      6.4      TPM TUMOR TISSUE
5 01-701-1034     2  EGFREXP     88.1      TPM TUMOR TISSUE
6 01-701-1034     3 MKI67EXP     41.7      TPM TUMOR TISSUE

Voilà un squelette GF conforme pour l’expression : les identifiants, un GFSEQ par sujet, le code de test topic, et — le point crucial — un résultat numérique avec une unité, chacun rattaché à un spécimen TUMOR TISSUE. Une vérification structurelle rapide confirme le contrat, y compris les deux choses qu’un résultat d’expression ne doit jamais manquer : un nombre et son unité.

cat("one domain code:              ", length(unique(gf$DOMAIN)) == 1, "\n")
one domain code:               TRUE 
cat("GFSEQ unique within subject:  ", !any(duplicated(gf[c("USUBJID", "GFSEQ")])), "\n")
GFSEQ unique within subject:   TRUE 
cat("every value is numeric:       ", all(!is.na(gf$GFSTRESN)), "\n")
every value is numeric:        TRUE 
cat("every numeric value has a unit:", all(nchar(gf$GFSTRESU) > 0), "\n")
every numeric value has a unit: TRUE 

Quatre TRUE — structurellement sain, et surtout chaque GFSTRESN porte un GFSTRESU. En production, un outil de conformité (Pinnacle 21) exécute le jeu de règles complet qu’appliquerait un régulateur ; ici, l’essentiel est qu’un domaine GF d’expression est une construction Findings numérique ordinaire, une fois l’expression quantifiée.

Même résultat, une méthode différente : la qPCR

Le RNA-seq n’est pas la seule façon de mesurer l’expression. La qPCR mesure un seul gène (ou un petit panel) et rapporte un résultat relatif — un fold-change par rapport à un gène de référence et à un calibrateur. Le résultat reste de l’expression génique ; seuls la méthode et l’unité changent. Observez comment le même mapping GF l’absorbe — un GFMETHOD différent, un GFSTRESU différent, la valeur toujours dans GFSTRESN :

# A single-gene qPCR export: CD274 (PD-L1) relative expression by the 2^-ddCt method,
# reported as a fold-change vs a normal-tissue calibrator. Different assay, different
# unit — same numeric GF mapping (value in GFSTRESN, unit in GFSTRESU).
qpcr_raw <- data.frame(
  SUBJ   = c("01-701-1033","01-701-1034","01-701-1047"),
  SPECREF = c("SPEC4.1","SPEC5.1","SPEC6.1"),
  GENE   = rep("CD274", 3),
  FC     = c(3.2, 0.8, 1.9),                 # fold-change (2^-ddCt) vs calibrator
  UNIT   = rep("fold change", 3),
  ASSAY  = rep("RT-qPCR", 3),
  COLLDT = c("2025-09-10","2025-10-05","2025-11-01"),
  stringsAsFactors = FALSE
)

gf_qpcr <- data.frame(
  STUDYID  = "CDISCPILOT01",
  DOMAIN   = "GF",
  USUBJID  = qpcr_raw$SUBJ,
  GFREFID  = qpcr_raw$SPECREF,
  GFTESTCD = paste0(qpcr_raw$GENE, "EXP"),   # illustrative — verify vs C181178
  GFTEST   = paste(qpcr_raw$GENE, "Expression"),
  GFCAT    = "GENE EXPRESSION",
  GFORRES  = as.character(qpcr_raw$FC),
  GFORRESU = qpcr_raw$UNIT,
  GFSTRESN = qpcr_raw$FC,                     # the numeric value again
  GFSTRESU = qpcr_raw$UNIT,                   # but the unit is fold change, not TPM
  GFSPEC   = "TUMOR TISSUE",
  GFMETHOD = qpcr_raw$ASSAY,                  # RT-qPCR, not RNA-seq
  GFDTC    = qpcr_raw$COLLDT,
  stringsAsFactors = FALSE
)

gf_qpcr[, c("USUBJID", "GFTESTCD", "GFSTRESN", "GFSTRESU", "GFMETHOD")]
      USUBJID GFTESTCD GFSTRESN    GFSTRESU GFMETHOD
1 01-701-1033 CD274EXP      3.2 fold change  RT-qPCR
2 01-701-1034 CD274EXP      0.8 fold change  RT-qPCR
3 01-701-1047 CD274EXP      1.9 fold change  RT-qPCR

Même gène (CD274), même catégorie, même cible numérique — mais GFMETHOD est RT-qPCR et GFSTRESU est fold change, pas TPM. Voilà pourquoi l’unité et la méthode ne sont pas décoratives : sans elles, un fold-change 3.2 et un TPM 48.2 ressemblent au même type de nombre et ne sont absolument pas comparables. C’est aussi pourquoi l’expression par gène en RNA-seq, un panel d’expression ciblé et la qPCR sur un seul gène sont un domaine, plusieurs méthodes — la structure de ligne ne change jamais, GFMETHOD et GFSTRESU enregistrent ce qui a produit la valeur.

Relier un résultat à son biospécimen

Chaque valeur d’expression n’est interprétable que si vous savez sur quoi elle a été mesurée. Chaque enregistrement GF portait la référence du spécimen tumoral dans GFREFID, si bien qu’un merge() en R de base contre les données de biospécimens-événements be retrace chaque résultat d’expression jusqu’à l’échantillon physique — le même lien de spécimen que la leçon sur le domaine GF construit en entier. Les données d’exemple be de pharmaverse sont un vrai domaine de biospécimens-événements ; ses enregistrements de collecte sont les spécimens eux-mêmes.

library(pharmaversesdtm)
data(be)
be <- as.data.frame(be)

# the collection events = the specimens themselves
spec <- be[be$BECAT == "COLLECTION", c("USUBJID", "BEREFID", "BELOC", "BEDTC")]

link <- merge(
  gf[, c("USUBJID", "GFSEQ", "GFTESTCD", "GFSTRESN", "GFSTRESU", "GFREFID")],
  spec, by.x = c("USUBJID", "GFREFID"), by.y = c("USUBJID", "BEREFID"), all.x = TRUE
)
link <- link[order(link$USUBJID, link$GFSEQ), ]

head(link[, c("USUBJID", "GFTESTCD", "GFSTRESN", "GFSTRESU", "GFREFID", "BELOC")])
      USUBJID GFTESTCD GFSTRESN GFSTRESU GFREFID BELOC
1 01-701-1033 CD274EXP     48.2      TPM SPEC4.1  LUNG
2 01-701-1033  EGFREXP    112.5      TPM SPEC4.1  LUNG
3 01-701-1033 MKI67EXP     76.3      TPM SPEC4.1  LUNG
4 01-701-1034 CD274EXP      6.4      TPM SPEC5.1  LUNG
5 01-701-1034  EGFREXP     88.1      TPM SPEC5.1  LUNG
6 01-701-1034 MKI67EXP     41.7      TPM SPEC5.1  LUNG

Désormais, chaque résultat d’expression est entièrement traçable : l’expression CD274 de 48.2 TPM du sujet 01-701-1033 a été mesurée sur le spécimen SPEC4.1, un échantillon LUNG. Cette chaîne — valeur d’expression → spécimen → événement de collecte — est ce qui rend un résultat de biomarqueur auditable dans un dossier de soumission, et pourquoi GF ne voyage jamais sans les domaines de biospécimens à ses côtés.

🟢 Avec un agent IA

Demandez à Prova « dans le domaine CDISC SDTM GF, comment tabuler une valeur d’expression TPM RNA-seq par rapport à un fold-change qPCR, et où vont le résultat numérique et son unité ? » — elle répond en s’appuyant sur les leçons de ce pilier et le standard génomique CDISC, avec du R exécutable que vous pouvez essayer sur les données d’exemple. The runtime is the judge. Demandez à Prova →

Problèmes fréquents

Vous placez une matrice de comptage RNA-seq brute (ou les reads FASTQ) dans GF et rien ne colle. Ce ne sera jamais le cas — les reads bruts et la matrice de comptage complète sont hors du périmètre de SDTM, de la même façon que les fichiers BAM/VCF le sont pour les variants. GF tabule la mesure d’expression rapportée (une valeur TPM, un fold-change) pour les gènes pré-spécifiés, pas la sortie de séquençage à partir de laquelle elle a été quantifiée. Extrayez les valeurs rapportées dans des lignes GF ; archivez les reads et la matrice dans le dépôt génomique de l’étude et référencez-les, ne les tabulez pas.

Vous stockez le nombre d’expression mais oubliez l’unité. Un 48.2 sans unité est inutilisable — est-ce du TPM, du FPKM, un fold-change ? Renseignez GFORRESU (originale) et GFSTRESU (standardisée) sur chaque ligne d’expression numérique. Un GFSTRESN sans GFSTRESU échoue à la revue la plus élémentaire d’un résultat numérique.

Vous placez la valeur d’expression dans le résultat caractère et laissez GFSTRESN vide. L’expression est une quantité mesurée : elle a sa place dans le GFSTRESN numérique (un évaluateur calcule dessus), pas seulement dans le GFSTRESC caractère. Ce schéma caractère-seul convient à un appel de variant (DETECTED), pas à un nombre.

Vous réutilisez la catégorie de variant pour un résultat d’expression. Une ligne d’expression est un résultat de transcription, à titre illustratif GFCAT = "GENE EXPRESSION" — pas le GENETIC VARIATION de la leçon sur les variants. Les mélanger empêche un évaluateur de séparer les deux types de résultat. Confirmez le terme exact de catégorie contre C181178 plutôt que d’affirmer l’un ou l’autre comme officiel.

Questions fréquentes

Comme un enregistrement Findings numérique. L’expression de chaque gène sur un spécimen est une ligne GF (Genomics Findings) avec GFCAT fixé à une catégorie de transcription (à titre illustratif GENE EXPRESSION), le gène dans GFTESTCD/GFTEST, la technique dans GFMETHOD, et — le point crucial — la valeur mesurée dans le GFSTRESN numérique avec son unité dans GFSTRESU. C’est différent d’un appel de variant, qui est un résultat caractère (GFSTRESC = DETECTED). Vérifiez les codes et la catégorie contre le sous-ensemble NCI EVS C181178.

Non. GF stocke la mesure d’expression rapportée (une valeur TPM, un FPKM, un fold-change qPCR), jamais les reads FASTQ bruts ni la matrice de comptage RNA-seq à partir desquels ils ont été quantifiés. Ceux-ci sont hors du périmètre de SDTM — le séquençage, l’alignement et la quantification relèvent de l’analyse en amont (le pilier Bioinformatique) ; ils sont archivés dans un dépôt génomique spécialisé et référencés, tandis que GF ne porte que les valeurs tabulées qu’un évaluateur lit enregistrement par enregistrement.

La valeur va dans la variable de résultat standardisée numérique GFSTRESN, et l’unité (TPM, FPKM, fold change, Ct) va dans GFSTRESU — avec la valeur et l’unité d’origine dans GFORRES/GFORRESU. L’expression est une quantité mesurée, elle remplit donc les variables de résultat numériques exactement comme une valeur de laboratoire remplit LBSTRESN/LBSTRESU. Ne laissez jamais une valeur d’expression numérique dans un champ caractère uniquement, et ne supprimez jamais l’unité.

Les deux sont des enregistrements GF de la classe Findings, mais ils diffèrent par la catégorie et le type de résultat. Un variant est GFCAT = "GENETIC VARIATION", un appel catégoriel dans le GFSTRESC caractère (DETECTED), avec la chaîne HGVS dans GFORRES. L’expression génique est une catégorie de transcription (à titre illustratif GENE EXPRESSION), un nombre dans GFSTRESN avec une unité dans GFSTRESU. Même domaine, même forme Findings — un GFCAT différent et les variables de résultat numériques au lieu de la caractère.

Non — seuls GFMETHOD et l’unité changent. La qPCR sur un seul gène, un panel d’expression ciblé et l’expression par gène dérivée du RNA-seq sont un domaine, plusieurs méthodes : une ligne GF par gène et par spécimen, la valeur dans GFSTRESN. GFMETHOD enregistre la technique (RNA-seq, RT-qPCR), et GFSTRESU enregistre son unité (TPM pour le RNA-seq, fold change ou Ct pour la qPCR) — ce qui explique exactement pourquoi la méthode et l’unité sont déterminantes : un TPM et un fold-change ne sont pas des nombres comparables.

Testez vos connaissances

La construction ci-dessus a tabulé l’expression RNA-seq en TPM. Supposez qu’un pipeline d’expression différentielle rapporte plutôt l’expression EGFR du sujet 01-701-1034 comme un comptage normalisé de 1840. Esquissez la ligne GF : quel GFCAT elle porte, quelles variables de résultat contiennent la valeur et l’unité, et ce que seraient GFMETHOD et GFTESTCD — en notant que seuls l’unité et la méthode diffèrent de la ligne TPM.

Un comptage normalisé reste un nombre mesuré, il se mappe donc exactement comme un TPM — même variable de résultat numérique, même emplacement pour l’unité — seuls la chaîne de l’unité et la méthode changent. La catégorie ne change pas : c’est toujours un résultat de transcription.

Le résultat en comptage normalisé reste un enregistrement GF GENE EXPRESSION numérique :

  • GFCAT reste "GENE EXPRESSION" (un résultat de transcription, pas GENETIC VARIATION).
  • La valeur va dans le GFSTRESN numérique = 1840, avec GFSTRESU = "normalized count" (et GFORRES = "1840", GFORRESU = "normalized count") — la même cible numérique que la ligne TPM, une chaîne d’unité différente.
  • GFMETHOD nomme la technique/le pipeline (p. ex. RNA-seq), et GFTESTCD/GFTEST nomment le test d’expression EGFR — vérifié contre C181178.
  • GFSPEC/GFREFID le rattachent toujours au spécimen.

Même domaine, même forme Findings numérique — seuls l’unité et la méthode distinguent un comptage normalisé d’un TPM. La valeur atterrit toujours dans GFSTRESN ; l’unité atterrit toujours dans GFSTRESU.

A. Dans le résultat caractère GFSTRESC, avec GFSTRESN laissé vide B. Dans le résultat numérique GFSTRESN, avec l’unité TPM dans GFSTRESU C. Dans la matrice de comptage brute, jointe au dossier de soumission comme fichier

B. L’expression génique est une quantité mesurée, une valeur TPM atterrit donc dans le GFSTRESN numérique avec son unité dans GFSTRESU — le même schéma que toute valeur de laboratoire. A est le schéma de variant (un appel caractère sans nombre significatif), erroné pour une valeur mesurée. C est entièrement hors du périmètre de SDTM — la matrice de comptage brute et les reads n’entrent jamais dans GF ; seule la mesure d’expression rapportée y entre.

Conclusion

L’expression génique complète le cluster GF comme la moitié numérique du domaine. Quelle que soit la technique — TPM, FPKM en RNA-seq, un comptage normalisé, un fold-change ou un Ct en qPCR — le résultat est un enregistrement de transcription par gène et par spécimen : la valeur mesurée dans GFSTRESN, son unité dans GFSTRESU, la technique dans GFMETHOD, le gène dans GFTESTCD/GFTEST, et GFCAT la marquant comme expression plutôt que variation. Gardez chaque GFTESTCD et catégorie comme un espace réservé illustratif jusqu’à ce que C181178 le confirme, et — le principe cardinal une fois de plus — gardez les reads et la matrice de comptage brute hors de SDTM : GF porte la mesure rapportée, pas le séquençage qui l’a produite.

Cela clôt le cluster génomique : les fondamentaux du domaine GF ont établi la structure de la classe Findings et la frontière résultats-et-non-fichiers-bruts ; la leçon sur les variants a mappé la variation génétique sous forme d’appels caractère ; et cette leçon a mappé la transcription sous forme de résultats numériques. Trois leçons, un domaine — chaque résultat génomique que produit un essai de médecine de précision, prêt pour la soumission.

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 domaine Genomics Findings (GF) — les fondamentaux sur lesquels s’appuie cette leçon : la structure de la classe Findings, résultats-et-non-fichiers-bruts, GF versus PF, et le lien biospécimen. · Mapper les données de mutation et de variant vers le domaine GF — la moitié variation du cluster, mappant SNV, indels, CNV et fusions sous forme d’appels caractère. · Mapper des données EDC brutes vers un domaine SDTM Findings avec sdtm.oak — la construction des signes vitaux qui établit le schéma numérique de la classe Findings que suit l’expression GF. · Le pilier Bioinformatique — la quantification RNA-seq en amont et l’analyse d’expression différentielle qui produit les valeurs d’expression que cette leçon tabule.
  • Où cela s’insère : les fondamentaux du domaine GF → le mapping des données de mutation et de variant → le mapping de l’expression génique et du RNA-seq (vous êtes ici) — la leçon qui complète le cluster génomique. GF est là où les résultats de médecine de précision, variation comme transcription, entrent dans une soumission CDISC.
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 = {Domaine SDTM GF en R : expression génique et RNA-seq},
  date = {2026-07-01},
  url = {https://www.datanovia.com/learn/pharma-clinical/02-sdtm-programming/gene-expression-rnaseq-gf},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Domaine SDTM GF en R : expression génique et RNA-seq.” 2026. July 1. https://www.datanovia.com/learn/pharma-clinical/02-sdtm-programming/gene-expression-rnaseq-gf.