El análisis de datos de expresión genética a menudo presenta un gran desafío: la multiplicidad de variables. Cuando se trata de comparar la expresión de miles de genes entre dos grupos (por ejemplo, sujetos "afectados" vs. "no afectados"), el enfoque ingenuo a menudo consiste en usar macros para iterar sobre cada variable.
Sin embargo, este método puede encontrar problemas de rendimiento y, de manera más insidiosa, errores en la estructura de datos que conducen a resultados nulos ($n=0$).
La trampa de la instrucción PAIRED y los datos faltantes
Imagine un conjunto de datos donde cada fila representa un sujeto. Tiene columnas para los genes de individuos sanos (unaffected_gene_x) y otras para individuos enfermos (affected_gene_x).
Si intenta utilizar la instrucción PAIRED en PROC TTEST:
La Solución: Reestructurar los datos ("Ancho a Largo")
En lugar de crear una macro compleja que ejecute PROC TTEST 2500 veces (lo cual es ineficiente), la mejor práctica es reestructurar los datos para tener solo una columna de valores y una columna de identificación (Grupo/Estado).
A continuación, se muestra cómo transformar sus datos "anchos" en datos "largos" con un paso DATA y arreglos (ARRAY):
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;
Esta transformación permite pasar de una estructura dispersa a una estructura optimizada para el análisis estadístico de grupo.
Ejecutar el T-Test de manera eficiente
Una vez reestructurados los datos, ya no se necesita una macro. Un solo procedimiento PROC TTEST es suficiente, utilizando la instrucción BY para procesar cada gen por separado y CLASS para definir los grupos.
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;
Este método es mucho más rápido que invocar el procedimiento miles de veces.
Automatizar la recuperación de resultados significativos
Con miles de pruebas, leer la salida estándar es imposible. El truco consiste en utilizar ODS OUTPUT para recuperar las estadísticas (valores t y valores p) en una tabla y luego filtrar esta tabla.
/* 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;
La tabla resultats_ttests contendrá variables como tValue (estadístico t) y Probt (el valor p), lo que le permitirá identificar inmediatamente los genes de interés entre miles.
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.