Matrix#

merge rows with same name#

merge.rows <- function(x, method=mean, na.rm=FALSE) {
	x <- as.matrix(x[!is.na(rownames(x)), ])
	r <- unique(rownames(x))
	m <- length(r)
	if (dim(x)[1] != m) {
		y <- matrix(nrow=m, ncol=dim(x)[2])
		rownames(y) <- r
		colnames(y) <- colnames(x)
		for (i in 1:m) {
			n <- sum(rownames(x) == r[i])
			if (n > 1) {
				s <- as.matrix(x[rownames(x) == r[i], ])
				y[i, ] <- apply(s, 2, method, na.rm)
			} else {
				y[i, ] <- x[r[i], ]
			}
		}
	} else {
		y <- x
	}
	y
}

Statistics#

robust fold change#

min.abs <- function(x) {
	x[which.min(abs(x))]
}

get.robust.fc <- function(case, control) {
	m <- dim(case)[2]
	n <- dim(control)[2]
	fc.raw <- matrix(nrow=dim(case)[1], ncol=m*n)
	for (i in 1:m) {
		for (j in 1:n) {
			fc.raw[, (i-1)*m+j] <- case[,i] - control[,j]
		}
	}
	fc <- apply(fc.raw, 1, min.abs)
}

fold change with confidence interval#

fc <- function(x, y, confidence.level=90, var.equal=F) {
	fc.interval(length(x), mean(x), var(x), length(y), mean(y), var(y), confidence.level, var.equal)
}

fc.interval <- function(x.n, x.mu, x.var, y.n, y.mu, y.var, confidence.level=90, var.equal=F) {
	mu <- x.mu - y.mu
	if (var.equal) {
		nu <- x.n + y.n - 2
		se <- sqrt(((x.n-1)*x.var + (y.n-1)*y.var) / nu) * sqrt(1/x.n + 1/y.n)
	} else {
		nu <- (x.var/x.n + y.var/y.n)^2 / (x.var^2/x.n^2/(x.n-1) + y.var^2/y.n^2/(y.n-1))
		se <- sqrt(x.var/x.n + y.var/y.n)
	}
	t <- -qt((1-confidence.level/100)/2, df=nu)
	if (mu >= 0) {
		mu.lower <- max(0, mu - t*se)
		mu.upper <- mu + t*se
	} else {
		mu.lower <- min(0, mu + t*se)
		mu.upper <- mu - t*se
	}
	data.frame(fc=mu, df=nu, lower=mu.lower, upper=mu.upper)
}

p-value#

p.value <- function(cdf, z, params=numeric(0), side=0) {
	n <- length(params)
	p <- switch(n+1,
			cdf(z),
			cdf(z, params),
			cdf(z, params[1], params[2]),
			cdf(z, params[1], params[2], params[3])
		)
	if (side < 0) p
	else if (side > 0) 1-p
	else if (p < 1/2) 2*p
	else 2*(1-p)
}

t-test#

one sample#

my.test1.t <- function(x.n, x.mu, x.var, mu, side=0) {
	nu <- x.n - 1
	t <- (x.mu - mu) / sqrt(x.var / x.n)
	p <- p.value(pt, t, params=nu, side=side)
	data.frame(mean=x.mu, df=nu, statistic=t, p.value=p)
}

two samples#

my.test2.t <- function(x.n, x.mu, x.var, y.n, y.mu, y.var, var.equal=F, side=0) {
	mu <- x.mu - y.mu
	if (var.equal) {
		nu <- x.n + y.n - 2
		s <- sqrt(((x.n-1)*x.var + (y.n-1)*y.var) / nu)
		t <- mu / (s * sqrt(1/x.n + 1/y.n))
	} else {
		nu <- (x.var/x.n + y.var/y.n)^2 / (x.var^2/x.n^2/(x.n-1) + y.var^2/y.n^2/(y.n-1))
		t <- mu / sqrt(x.var/x.n + y.var/y.n)
	}
	p <- p.value(pt, t, params=nu, side=side)
	data.frame(mean=mu, df=nu, statistic=t, p.value=p)
}

normal test#

one sample#

my.test1.norm <- function(x.n, x.mu, x.var, mu, side=0) {
	nu <- x.n - 1
	z <- (x.mu - mu) / sqrt(x.var / x.n)
	p <- p.value(pnorm, z, side=side)
	data.frame(mean=x.mu, df=nu, statistic=z, p.value=p)
}

two samples#

my.test2.norm <- function(x.n, x.mu, x.var, y.n, y.mu, y.var, side=0) {
	mu <- x.mu - y.mu
	nu <- x.n + y.n
	z <- mu / sqrt(x.var/x.n + y.var/y.n)
	p <- p.value(pnorm, z, side=side)
	data.frame(mean=mu, df=nu, statistic=z, p.value=p)
}

Graphics#

Color function to generate green-red heat maps#

updown.colors <- function(n = 50, down.col = 1/3, up.col=1, saturation = 1) { 
	c(hsv(down.col, saturation, seq(1,0,length=n)), hsv(up.col, saturation, seq(0,1,length=n))) 
}

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-) was last changed on 09-Jan-2009 08:52 by LingyunWu