DEG Analysis (Differentially Expressed Genes Analysis)

Junho_Mun·2025년 9월 16일

1. DEG Analysis

DEG(Differentially Expressed Genes)차등 발현 유전자라고 하며 서로 다른 조건의 샘플 그룹 간에 발현량이 통계적으로 유의미한 차이를 보이는 유전자를 의미한다.
예를 들어, 암세포와 정상 세포 간에 유전자 발현 차이를 비교하여 암세포에서 높은 수준으로 발현되는 유전자들을 찾는 경우가 있다.

DEG를 쓰는 이유와 장점

  • 핵심 원인 파악 : 수만 개의 전체 유전자 중에서 특정 조건(질병, 약물 반응 등)과 직접적으로 관련된 핵심 유전자를 소수로 압축하여 연구의 효율성을 높인다.
  • 생물학적 기전 이해 : DEG를 분석하면 특정 생물학적 경로(Pathway)니 기능이 두 그룹 간에 어떻게 다른지 파악하여 현상의 메커니즘을 이해하는 단서를 얻을 수 있다.
  • 객관적인 바이오마커 획득 : 통계적 기준을 바탕으로 유전자를 선별하므로, 질병 진단이나 치료 반응 예측을 위한 객관적인 바이오마커 후보를 발굴하는 데 매우 유용하다.

2. DEG Analysis Workflow

1. 데이터 전처리 (Data-Pre-processing)

RNA-Seq 장비에서 생성된 원본 데이터(Raw data)의 품질을 확인(Quality Control)하고, 불필요한 서열들을 제거(Trimming)한다.

2. 서열 정렬(Alignment)

전처리된 데이터를 기준 유전체(Reference Genome)에 매핑하여 각 유전자가 얼마나 읽혔는지 확인한다.

3. 유전자 발현 정량화 (Quantification)

각 샘플에서 유전자별로 읽힌 서열의 수(Read Count)를 측정하여 Count Matrix를 생성한다.

4. 정규화 (Normalization)

각 샘플의 총 RNA 양(Sequencing Depth) 차이 등을 보정하여 샘플 간 발현량을 공정하게 비교할 수 있도록 한다.

5. 통계 분석 (Statistical Analysis)

DESeq2,edgeR 과 같은 전문 통계 패키지를 사용하여 그룹 간 발현량 차이의 통계적 유의성(P-value)과 변화량의 크기(Log2 Fold Change) 를 계산한다.

6. 결과 해석 및 시각화

통계적으로 유의미한 DEG목록을 최종적으로 선별하고, Volcano Plot, Heatmap 등으로 시각화하여 결과를 해석한다.

3. R을 활용한 DEG Analysis

우리는 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 스케일로 나타낸다.
      • 양수이면 Treatment 그룹에서 발현량이 증가했다는 의미이다.
    • pvalue : 이 발현량의 차이가 우연히 발생했을 확률이다. 값이 낮을수록 의미 있는 차이 임을 나타낸다.
    • padj : adjusted p-value이며, 수천 개의 유전자를 동시에 검정하면서 발생하는 통계적인 오류를 보정한 값이다. 이 값이 0.05보다 작은지를 기준으로 통계적 유의성을 판단한다.
  • 그래서, 일반적으로 다음 두가지 기준을 동시에 만족하는 유전자를 DEG라고 한다.
    1. 통계적 유의성 : padj < 0.05
    2. 생물학적 유의성 : log2FoldChange 의 절댓값 > 1
    • 절댓값이 1보다 크다는 것은 2배 이상 증가했거나 작아졌다는 의미이다.
profile
Bioinformatics and Data science

0개의 댓글