Affymetrix · Agilent · Illumina 플랫폼의 구조 차이와 권장 정규화, 시작용 레시피를 한 곳에 정리했습니다.
| 항목 | 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: normexp → within-array loess → between-array |
neqc (control 활용 normexp+quantile) 또는 quantile |
| 출력 스케일 | log2 표현값 | one-color: log2 표현값 / two-color: M=log2(R/G) | log2 표현값(+ detection p) |
| 주석 | hgu***.db 등 플랫폼 전용 패키지 |
제조사 annotation 파일/패키지 | illuminaHumanv*.db 등 |
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]
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
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
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, ]
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
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
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))로 진행
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
# 최종 표현행렬 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)
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)