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.
Important Disclaimer
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.