Replicate: FIRMA when using RLM and median polish
Author: Mark Robinson
Created on: 2009-03-28
Last updated: 2009-10-21
Christian Stratowa had been asking some questions about whether FIRMA (Purdom, Simpson, Robinson, Conboy, Lapuk, and Speed, 2008) could be used with median polish estimates (as opposed to the current standard of using affyPLM -- robust linear model -- estimates). He has written some test code to implement FIRMA based on either and compared the results. I have shared his code (tidied up by Henrik Bengtsson) and results below:
firma <- function(m, method=c("rlm", "mdp")) {
## function to compute FIRMA scores (adapted from aroma.affymetrix)
## m: dataframe containing normalized probe intensities (linear
scale)
## with 1.column containing the transcript_cluster_id
## and 2. column containing the corresponding probeset_ids
## method: fitting model, one of "rlm" or "mdp"
require("matrixStats") || throw("Package not loaded: matrixStats")
# Argument 'method':
method <- match.arg(method)
## convert expression levels to log2
y <- as.matrix(log2(m[,3:ncol(m)]))
## dimensions
K <- nrow(y) # number of probes
I <- ncol(y) # number of arrays
## fit log-additive model
if (method == "rlm") {
fit <- .Call("R_rlm_rma_default_model", y, 0, 1.345,
PACKAGE="preprocessCore")
} else if (method == "mdp") {
mp <- medpolish(y, trace.iter=FALSE)
fit <- list(Estimates = c(mp$overall + mp$col, mp$row),
StdErrors = rep(0, length(c(mp$row, mp$col))))
} # if
## extract parameters
est <- fit$Estimates
se <- fit$StdErrors
## chip effects
beta <- est[1:I]
## probe affinities
if (K == 1) {
## if only one probe must have affinity=1 since sum constraint
alpha <- 0
} else {
## affinities sum to zero (on log scale)
alpha <- est[(I+1):length(est)]
alpha[length(alpha)] <- -sum(alpha[1:(length(alpha)-1)])
} # if
## estimates on the intensity scale
theta <- 2\^beta
phi <- 2\^alpha
## calculate residuals
phi <- matrix(phi, nrow=K, ncol=I, byrow=FALSE)
theta <- matrix(theta, nrow=K, ncol=I, byrow=TRUE)
yhat <- phi*theta
eps <- (2\^y) / yhat # RMA uses y/yhat
## estimate of standard error
z <- log2(eps)
z <- unlist(z, use.names=FALSE)
u.mad <- mad(z, center=0)
## get probeset_ids
id <- unique(m[,2])
## FIRMA scores
fs <- sapply(id, function(unitName) {
rr <- which(m[,2] == unitName)
z <- eps[rr,,drop=FALSE]
z <- log2(z) / u.mad
colMedians(z)
})
fs <- t(fs)
rownames(fs) <- id
fs
} # firma()
Then the following commands will give the image below.
library("preprocessCore")
score.mdp <- firma(unr, "mdp")
score.rml <- firma(unr, "rlm")
par(pty="m", mfcol=c(3,2), mar=c(5,5,4,2))
for (ii in 1:6) {
plot(score.rml[,ii], type="l", ylim=c(-3,5),
main=colnames(score.rml)[ii], xlab="Probeset", ylab="Score")
abline(h=0, lty=3)
lines(score.mdp[,ii], lty=2)
}
Figure: FIRMA scores for 30 probesets when using RLM (solid) and median polish (dashed) estimators to fit the FIRMA model.
References
[1] E. Purdom, K. M. Simpson, M. D. Robinson, et al. "FIRMA: a method for detection of alternative splicing from exon array data". Eng. In: Bioinformatics (Oxford, England) 24.15 (Aug. 2008), pp. 1707-14. ISSN: 1367-4811. DOI: 10.1093/bioinformatics/btn284. PMID: 18573797.
[2] H. Bengtsson, P. Wirapati, and T. P. Speed. "A single-array preprocessing method for estimating full-resolution raw copy numbers from all Affymetrix genotyping arrays including GenomeWideSNP 5 & 6". Eng. In: Bioinformatics (Oxford, England) 25.17 (Sep. 2009), pp. 2149-56. ISSN: 1367-4811. DOI: 10.1093/bioinformatics/btp371. PMID: 19535535.