DEG(Differentially Expressed Genes) 란 차등 발현 유전자라고 하며 서로 다른 조건의 샘플 그룹 간에 발현량이 통계적으로 유의미한 차이를 보이는 유전자를 의미한다.
예를 들어, 암세포와 정상 세포 간에 유전자 발현 차이를 비교하여 암세포에서 높은 수준으로 발현되는 유전자들을 찾는 경우가 있다.
RNA-Seq 장비에서 생성된 원본 데이터(Raw data)의 품질을 확인(Quality Control)하고, 불필요한 서열들을 제거(Trimming)한다.
전처리된 데이터를 기준 유전체(Reference Genome)에 매핑하여 각 유전자가 얼마나 읽혔는지 확인한다.
각 샘플에서 유전자별로 읽힌 서열의 수(Read Count)를 측정하여 Count Matrix를 생성한다.
각 샘플의 총 RNA 양(Sequencing Depth) 차이 등을 보정하여 샘플 간 발현량을 공정하게 비교할 수 있도록 한다.
DESeq2,edgeR 과 같은 전문 통계 패키지를 사용하여 그룹 간 발현량 차이의 통계적 유의성(P-value)과 변화량의 크기(Log2 Fold Change) 를 계산한다.
통계적으로 유의미한 DEG목록을 최종적으로 선별하고, Volcano Plot, Heatmap 등으로 시각화하여 결과를 해석한다.
우리는 GSE153494데이터를 사용해 보도록 하겠다.
이 데이터는 사람 폐암 세포주(A549)에 특정 약물(Cisplatin)을 처리한 그룹과 대조군을 비교한 RNA-Seq 데이터이다. 항암제 반응과 관련된 유전자 변화를 볼 수 있다.
NCBI GEO데 접속하여 GSE1534947_raw_counts_GRCh38.p13_NCBI.tsv.gz파일을 다운로드 받자.
library(DESeq2)
count_matrix <- read.table("GSE183947_raw_counts_GRCh38.p13_NCBI.tsv", header = TRUE, row.names = 1, sep = "\t")
# GEO 사이트에서 확인한 실제 샘플 정보 (12개로 수정)
sample_info <- data.frame(
condition = c(
"Cisplatin", "Cisplatin", "Cisplatin", "Cisplatin", # GSM5574715 to 718
"Control", "Control", # GSM5574723, 725
"Cisplatin", "Cisplatin", "Cisplatin", # GSM5574728 to 730
"Control", "Control", "Control" # GSM5574733, 739, 740
)
)
# count_matrix의 열 이름과 순서를 정확히 일치시킴
rownames(sample_info) <- colnames(count_matrix)
meta_data <- sample_info
-
print("--- 최종 Metadata ---")
print(meta_data)
cat("\n메타데이터 행 개수:", nrow(meta_data), "\n")
cat("카운트 매트릭스 열 개수:", ncol(count_matrix), "\n\n")
stopifnot(all(colnames(count_matrix) == rownames(meta_data)))
dds <- DESeqDataSetFromMatrix(
countData = count_matrix,
colData = meta_data,
design = ~ condition
)
# 분석 실행
dds <- DESeq(dds)
# 결과 추출
res <- results(dds, contrast = c("condition", "Cisplatin", "Control"))
# padj값 오름차순 정렬하기
res_df <- as.data.frame(res)
res_df <- na.omit(res_df)
res_sorted <- res_df[order(res_df$padj),]
# 정렬 결과 확인
cat("--- padj 값으로 정렬된 결과 (상위 6개) ---\n")
print(head(res_sorted))
significant_degs <- subset(res_sorted, padj < 0.05 & abs(log2FoldChange) > 1)
# 유의미한 DEG 필터링
cat("\n--- 최종 선별된 DEG (상위 6개) ---\n")
print(head(significant_degs))
cat("\n총", nrow(significant_degs), "개의 유의미한 DEG를 찾았습니다.\n")
--- padj 값으로 정렬된 결과 (상위 6개) ---
baseMean log2FoldChange lfcSE stat pvalue padj
100287102 28.600427 -0.4801389 1.0355784 -0.4636433 0.6429033 0.9999907
653635 129.621323 0.6706098 0.5537453 1.2110438 0.2258786 0.9999907
102466751 7.901483 0.3402459 1.3465738 0.2526753 0.8005192 0.9999907
107985730 14.035188 0.8373989 1.7231867 0.4859595 0.6269959 0.9999907
100302278 1.591026 0.6523731 2.8006700 0.2329347 0.8158121 0.9999907
645520 13.850072 -0.3686650 1.6929921 -0.2177594 0.8276166 0.9999907
--- 최종 선별된 DEG (상위 6개) ---
[1] baseMean log2FoldChange lfcSE stat pvalue
[6] padj
log2FoldChange) 와 변화가 통계적으로 유의한가(padj)이다.baseMean : 모든 샘플에 걸친 유전자의 평균 발현량이다.log2FoldChange : Control 그룹 대비 Treatment 그룹에서 발현량이 얼마나 변했는 지를 로그2 스케일로 나타낸다.pvalue : 이 발현량의 차이가 우연히 발생했을 확률이다. 값이 낮을수록 의미 있는 차이 임을 나타낸다.padj : adjusted p-value이며, 수천 개의 유전자를 동시에 검정하면서 발생하는 통계적인 오류를 보정한 값이다. 이 값이 0.05보다 작은지를 기준으로 통계적 유의성을 판단한다.padj < 0.05log2FoldChange 의 절댓값 > 1