Microarray Platforms

Step 01 / 05

Affymetrix · Agilent · Illumina 플랫폼의 구조 차이와 권장 정규화, 시작용 레시피를 한 곳에 정리했습니다.


A) 개요

B) 플랫폼 비교

항목 Affymetrix (GeneChip) Agilent Illumina (BeadArray)
원시 파일 CEL 스캐너 TXT (one-color) / TXT (two-color) IDAT (또는 요약 TXT)
채널 one-color one-color / two-color one-color
신호 구조 다수 probe → probeset 요약 필요 probe별 FG/BG, two-color는 R/G 분리 bead-level 요약(AvgSignal) + detection p-value
대표 R 패키지 oligo(권장), affy limma::read.maimages limma + illuminaio/beadarray
권장 정규화 RMA (background + quantile + summarization) one-color: normalizeBetweenArrays("quantile")
two-color: normexpwithin-array loessbetween-array
neqc (control 활용 normexp+quantile) 또는 quantile
출력 스케일 log2 표현값 one-color: log2 표현값 / two-color: M=log2(R/G) log2 표현값(+ detection p)
주석 hgu***.db 등 플랫폼 전용 패키지 제조사 annotation 파일/패키지 illuminaHumanv*.db

C) 스타터 레시피 (복붙용)

C-1) Affymetrix (CEL → RMA)

library(oligo); library(limma)

setwd("/path/to/cel")
raw  <- read.celfiles(list.celfiles(full.names=TRUE))
eset <- rma(raw)                 # background + quantile + summarization
expr <- exprs(eset)              # (probeset × sample) log2
pdata <- pData(eset)
dim(expr); expr[1:3,1:3]
C-2) Agilent — one-color

library(limma)
targets <- read.delim("targets.txt")  # FileName, Group, ...
RG  <- read.maimages(targets$FileName, source="agilent", green.only=TRUE)
RGb <- backgroundCorrect(RG, method="normexp", offset=50)
E   <- normalizeBetweenArrays(RGb, method="quantile")
expr <- E$E                         # (probe × sample) log2
C-3) Agilent — two-color

library(limma)
targets <- read.delim("targets_2color.txt")
RG  <- read.maimages(targets, source="agilent")
RGb <- backgroundCorrect(RG, method="normexp", offset=50)
MA  <- normalizeWithinArrays(RGb, method="loess")
MA  <- normalizeBetweenArrays(MA, method="Aquantile")
M <- MA$M   # 분석은 M(=log2(R/G)) 사용
A <- MA$A
C-4) Illumina — neqc

library(limma); library(illuminaio)
# read.ilmn()으로 요약 TXT 읽기(AVG_Signal, Detection 등)
y  <- read.ilmn(files="summary.txt", expr="AVG_Signal", other.columns="Detection")
y2 <- neqc(y)                     # control 활용 normexp + quantile + log2
expr <- y2$E
detP <- y$other$Detection         # (선택) 검출 p값
# 저신뢰 probe 필터: 절반 이상에서 p < 0.01
keep <- rowMeans(detP < 0.01) > 0.5
expr <- expr[keep, ]

D) 표현값 데이터프레임 예시 (형태 참고)

Affymetrix (RMA 후)

expr_affy <- data.frame(
  row.names = c("202431_at","209773_s_at","215345_at"),
  Sample1 = c(8.12, 6.44, 7.01),
  Sample2 = c(8.45, 6.20, 6.85),
  Sample3 = c(7.98, 6.73, 7.22)
)
expr_affy
Agilent one-color

expr_ag1 <- data.frame(
  row.names = c("A_23_P100001","A_23_P200113","A_24_P302145"),
  GSM1 = c(9.10, 7.85, 8.33),
  GSM2 = c(9.25, 7.60, 8.55),
  GSM3 = c(8.95, 7.72, 8.40)
)
expr_ag1
Agilent two-color (M/A)

M_ag2 <- data.frame(
  row.names = c("A_23_P100001","A_23_P200113","A_24_P302145"),
  Array1 = c(+0.45, -0.12, +0.30),
  Array2 = c(+0.10, -0.25, +0.18)
)
M_ag2  # 분석은 M(=log2(R/G))로 진행
Illumina (neqc 후 + detection p)

expr_ilmn <- data.frame(
  row.names = c("ILMN_1762337","ILMN_2055271","ILMN_1736007"),
  S1 = c(7.55, 9.02, 8.41),
  S2 = c(7.70, 8.90, 8.55),
  S3 = c(7.60, 9.10, 8.33)
)
detP_ilmn <- data.frame(
  row.names = rownames(expr_ilmn),
  S1 = c(0.01, 0.20, 0.03),
  S2 = c(0.02, 0.18, 0.05),
  S3 = c(0.01, 0.22, 0.04)
)
expr_ilmn; detP_ilmn

E) 플랫폼별 차이 포인트

핵심 체크
  • 요약: Affy는 probeset 요약이 정규화의 일부(RMA). Agilent/Illumina는 파일에 요약 신호가 포함.
  • 채널: Agilent two-color는 M=log2(R/G) 분석. (one-color/Affy/Illumina는 log2 표현값)
  • 정규화: Affy=RMA / Agilent=normexp+loess(2C)+quantile / Illumina=neqc 권장.
  • 검출 신뢰도: Illumina의 detection p-value로 low/absent probe 필터링.
  • 주석: 플랫폼 전용 annotation 패키지 사용 권장. 동일 유전자 다중 probe는 규칙으로 병합.

F) 공통 포맷(유전자×샘플 log2)으로 정렬


# 최종 표현행렬 X 선택:
#  - Affy: exprs(rma_eset)
#  - Agilent one-color: E$E
#  - Illumina: y2$E (필요 시 detection p 필터 적용)
X <- expr

# probe → gene 매핑 후 중복 병합(간단 버전)
library(AnnotationDbi); library(org.Hs.eg.db); library(dplyr); library(tibble)
map <- AnnotationDbi::select(org.Hs.eg.db, keys=rownames(X),
                             columns=c("SYMBOL"), keytype="PROBEID")
ann <- map %>% distinct(PROBEID, .keep_all=TRUE) %>% column_to_rownames("PROBEID")
X2  <- X[rownames(X) %in% rownames(ann), ]
Xg  <- rowsum(X2, group=ann[rownames(X2),"SYMBOL"])   # 같은 gene 묶어서 합/평균 등
dim(Xg)

G) limma 차등발현 템플릿


library(limma)
group  <- factor(c("Control","Control","Case","Case"))
design <- model.matrix(~0 + group); colnames(design) <- levels(group)
fit  <- lmFit(Xg, design)
cont <- makeContrasts(Case_vs_Control = Case - Control, levels=design)
fit2 <- eBayes(contrasts.fit(fit, cont))
res  <- topTable(fit2, coef="Case_vs_Control", number=Inf, sort.by="P")
head(res)
요약
  • 플랫폼에 맞는 정규화가 가장 중요: Affy=RMA, Agilent(2C)=loess, Illumina=neqc.
  • two-color는 M값 중심 분석. one-color/Illumina/Affy는 log2 표현값 분석.
  • Illumina의 detection p로 저신뢰 probe를 필터링하면 신호대잡음비 개선.
  • 유전자 단위 통합을 위해 probe→gene 매핑 후 중복 처리 규칙을 명확히 정의.