Die Analyse von Genexpressionsdaten stellt oft eine große Herausforderung dar: die Vielzahl der Variablen. Wenn es darum geht, die Expression von Tausenden von Genen zwischen zwei Gruppen (z. B. 'betroffene' vs. 'nicht betroffene' Probanden) zu vergleichen, besteht der naive Ansatz oft darin, Makros zu verwenden, um jede Variable in einer Schleife zu durchlaufen.
Diese Methode kann jedoch auf Leistungsprobleme und, noch heimtückischer, auf Datenstrukturfehler stoßen, die zu Null-Ergebnissen führen ($n=0$).
Die Falle der PAIRED-Anweisung und fehlender Daten
Stellen Sie sich einen Datensatz vor, bei dem jede Zeile einen Probanden darstellt. Sie haben Spalten für die Gene von gesunden Personen (unaffected_gene_x) und andere für kranke Personen (affected_gene_x).
Wenn Sie versuchen, die PAIRED-Anweisung in PROC TTEST zu verwenden:
Die Lösung: Daten umstrukturieren ("Wide to Long")
Anstatt ein komplexes Makro zu erstellen, das PROC TTEST 2500 Mal ausführt (was ineffizient ist), besteht die beste Vorgehensweise darin, die Daten so umzustrukturieren, dass nur eine einzige Wertespalte und eine Identifikationsspalte (Gruppe/Status) vorhanden sind.
So transformieren Sie Ihre 'breiten' Daten mit einem DATA-Schritt und Arrays (ARRAY) in 'lange' Daten:
data analyse_genes;
set donnees_source;
/* Déclaration des tableaux pour vos colonnes existantes */
/* Ajustez la dimension (ici 10) au nombre réel de gènes (ex: 2500) */
array u unaffected_gene_1 - unaffected_gene_10;
array a affected_gene_1 - affected_gene_10;
/* Boucle pour pivoter les données */
do gene_id = 1 to dim(u);
/* Traitement du cas 'Non Affecté' */
if u[gene_id] ne . then do;
status = 'Unaffected';
value = u[gene_id];
output;
end;
/* Traitement du cas 'Affecté' */
if a[gene_id] ne . then do;
status = 'Affected';
value = a[gene_id];
output;
end;
end;
keep gene_id status value;
run;
/* Tri indispensable pour le traitement par groupe */
proc sort data=analyse_genes;
by gene_id;
run;
1
DATA analyse_genes;
2
SET donnees_source;
3
/* Déclaration des tableaux pour vos colonnes existantes */
4
/* Ajustez la dimension (ici 10) au nombre réel de gènes (ex: 2500) */
5
array u unaffected_gene_1 - unaffected_gene_10;
6
array a affected_gene_1 - affected_gene_10;
7
8
/* Boucle pour pivoter les données */
9
DO gene_id = 1 to dim(u);
10
/* Traitement du cas 'Non Affecté' */
11
IF u[gene_id] ne . THENDO;
12
STATUS = 'Unaffected';
13
value = u[gene_id];
14
OUTPUT;
15
END;
16
17
/* Traitement du cas 'Affecté' */
18
IF a[gene_id] ne . THENDO;
19
STATUS = 'Affected';
20
value = a[gene_id];
21
OUTPUT;
22
END;
23
END;
24
keep gene_id STATUS value;
25
RUN;
26
27
/* Tri indispensable pour le traitement par groupe */
28
PROC SORTDATA=analyse_genes;
29
BY gene_id;
30
RUN;
Diese Transformation ermöglicht den Übergang von einer verstreuten Struktur zu einer für die statistische Gruppenanalyse optimierten Struktur.
Den T-Test effizient ausführen
Sobald die Daten umstrukturiert sind, ist kein Makro mehr erforderlich. Ein einziges PROC TTEST-Verfahren genügt, wobei die BY-Anweisung zur separaten Verarbeitung jedes Gens und die CLASS-Anweisung zur Definition der Gruppen verwendet werden.
proc ttest data=analyse_genes;
by gene_id; /* Effectue le test pour chaque gène */
class status; /* Définit les groupes (Affected / Unaffected) */
var value; /* La variable contenant la mesure */
run;
1
PROC TTESTDATA=analyse_genes;
2
BY gene_id; /* Effectue le test pour chaque gène */
3
class STATUS; /* Définit les groupes (Affected / Unaffected) */
4
var value; /* La variable contenant la mesure */
5
RUN;
Diese Methode ist deutlich schneller, als das Verfahren tausende Male aufzurufen.
Automatisierung der Erfassung signifikanter Ergebnisse
Bei Tausenden von Tests ist das Lesen der Standardausgabe unmöglich. Der Trick besteht darin, ODS OUTPUT zu verwenden, um die Statistiken (t-Werte und p-Werte) in einer Tabelle zu erfassen und diese Tabelle dann zu filtern.
/* Redirection des résultats vers une table SAS */
ods output ttests = resultats_ttests;
proc ttest data=analyse_genes;
by gene_id;
class status;
var value;
run;
/* Filtrer pour ne garder que les différences significatives */
data genes_significatifs;
set resultats_ttests;
/* On filtre souvent sur la méthode Pooled ou Satterthwaite selon l'égalité des variances */
where Probt < 0.05;
run;
1
/* Redirection des résultats vers une table SAS */
2
ods OUTPUT ttests = resultats_ttests;
3
4
PROC TTESTDATA=analyse_genes;
5
BY gene_id;
6
class STATUS;
7
var value;
8
RUN;
9
10
/* Filtrer pour ne garder que les différences significatives */
11
DATA genes_significatifs;
12
SET resultats_ttests;
13
/* On filtre souvent sur la méthode Pooled ou Satterthwaite selon l'égalité des variances */
14
where Probt < 0.05;
15
RUN;
Die Tabelle resultats_ttests wird Variablen wie tValue (t-Statistik) und Probt (der p-Wert) enthalten, sodass Sie die interessierenden Gene unter Tausenden sofort identifizieren können.
Avertissement important
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.