Microarray Preprocessing

Step 02 / 05

플랫폼별 권장 파이프라인으로 정규화품질검사(QC)를 수행하고, 분석에 사용할 표현행렬을 저장합니다.


A) 준비물 (패키지 설치)

처음 한 번만 설치하세요.


if (!requireNamespace("BiocManager", quietly=TRUE)) install.packages("BiocManager")
BiocManager::install(c(
  "oligo",           # Affymetrix CEL → RMA
  "affy",            # (구형 Affy용) 선택
  "limma",           # Agilent / Illumina / DEG / QC
  "illuminaio",      # Illumina IDAT/요약
  "arrayQualityMetrics",  # 종합 QC 리포트(선택)
  "annotate"
))

B) 데이터 배치 & targets 파일

예) targets.txt (one-color)

FileName\tSample\tGroup
GSM0001.txt\tS1\tControl
GSM0002.txt\tS2\tControl
GSM0003.txt\tS3\tCase
GSM0004.txt\tS4\tCase

열 이름은 자유롭게 쓰되, 코드에서 동일 이름을 참조하세요.

예) targets_2color.txt (two-color)

FileName\tCy3\tCy5
array1.txt\tControl\tCase
array2.txt\tControl\tCase

C) Affymetrix — CEL → RMA

배경보정 + quantile 정규화 + probeset 요약을 한 번에 수행합니다. 출력은 log2 스케일.


library(oligo); library(limma)

setwd("/path/to/CEL_dir")
raw  <- read.celfiles(list.celfiles(full.names=TRUE))   # CEL 읽기
eset <- rma(raw)                                        # RMA
expr <- exprs(eset)                                     # (probeset × sample) log2

# 간단 QC
boxplot(expr, las=2, main="Affy RMA boxplot")
plotDensities(expr, main="Affy RMA density")

# 저장
write.csv(expr, file="affy_rma_log2.csv")
saveRDS(expr, file="affy_rma_log2.rds")

D) Agilent — one-color

권장: normexp 배경보정 → normalizeBetweenArrays(method="quantile").


library(limma)

setwd("/path/to/agilent_onecolor")
targets <- read.delim("targets.txt", check.names=FALSE)
RG  <- read.maimages(targets$FileName, source="agilent", green.only=TRUE)
RGb <- backgroundCorrect(RG, method="normexp", offset=50)
E   <- normalizeBetweenArrays(RGb, method="quantile")   # log2
expr <- E$E

# QC
boxplot(expr, las=2, main="Agilent one-color (quantile)")
plotDensities(expr, main="Agilent one-color density")

# 저장
write.csv(expr, file="agilent_onecolor_log2.csv")
saveRDS(expr, file="agilent_onecolor_log2.rds")

E) Agilent — two-color

two-color는 M = log2(R/G) 값이 분석의 주 대상입니다(표현값이 아닌 비교값).


library(limma)

setwd("/path/to/agilent_twocolor")
targets <- read.delim("targets_2color.txt", check.names=FALSE)
RG  <- read.maimages(targets$FileName, source="agilent")
RGb <- backgroundCorrect(RG, method="normexp", offset=50)
MA  <- normalizeWithinArrays(RGb, method="loess")       # within-array
MA  <- normalizeBetweenArrays(MA, method="Aquantile")   # between-array

M <- MA$M   # 분석용
A <- MA$A   # 평균 강도

# QC
maPlot(MA, array=1, main="MA-plot (array1)")            # 한 어레이 예시
boxplot(M, las=2, main="Agilent two-color (M values)")

# 저장
write.csv(M, file="agilent_twocolor_M.csv")
saveRDS(M, file="agilent_twocolor_M.rds")

F) Illumina — neqc (control 활용)

neqc는 control probe를 이용한 normexp+quantile+log2 절차를 자동으로 수행합니다. 제공되는 detection p-value로 저신뢰 probe를 필터링하세요.


library(limma); library(illuminaio)

setwd("/path/to/illumina_summary")
y  <- read.ilmn(files="summary.txt", expr="AVG_Signal",
                other.columns="Detection")   # 제조사 요약 TXT 형식
y2 <- neqc(y)                                # 정규화 + log2
expr <- y2$E
detP <- y$other$Detection

# 필터링: 절반 이상 시료에서 검출 p < 0.01
keep <- rowMeans(detP < 0.01) > 0.5
expr <- expr[keep, ]

# QC
boxplot(expr, las=2, main="Illumina neqc (filtered)")
plotDensities(expr, main="Illumina density")

# 저장
write.csv(expr, file="illumina_neqc_log2.csv")
saveRDS(expr, file="illumina_neqc_log2.rds")

G) (선택) 종합 QC 리포트 — arrayQualityMetrics

여러 지표(거리 행렬, outlier 검출 등)를 한 번에 HTML로 생성합니다.


# expr_mat: 정규화 완료된 (features × samples) log2 행렬
library(arrayQualityMetrics)
expr_eset <- Biobase::ExpressionSet(assayData = as.matrix(expr_mat))
arrayQualityMetrics(expressionset = expr_eset, outdir = "AQM_report", force = TRUE)

H) 결과물 정리

요약
  • 플랫폼에 맞는 권장 정규화를 사용: Affy=RMA, Agilent 1C=normexp+quantile, Agilent 2C=loess 기반 M값, Illumina=neqc.
  • QC는 최소 boxplot/density 확인, 필요 시 arrayQualityMetrics 리포트를 추가.
  • Illumina는 detection p-value로 저신뢰 probe를 필터링하면 성능이 향상.