# Transwell migration, knockdown vs control: the same counts analysed five ways. R 4.3.3, base R.
d <- read.csv("transwell.csv")                       # one row per field: experiment, condition, insert, field, cells
f2 <- function(p) formatC(signif(p, 2), format = "g")
ins <- aggregate(cells ~ experiment + condition + insert, data = d, FUN = mean)            # mean cells per field, per insert
ex <- tapply(ins$cells, list(ins$experiment, ins$condition), mean)                         # one mean per condition per experiment
for (e in rownames(ex)) cat(sprintf("Experiment %s: control %.1f cells per field, knockdown %.1f, knockdown %.0f%% of control\n",
                                    e, ex[e, "control"], ex[e, "knockdown"], 100 * ex[e, "knockdown"] / ex[e, "control"]))
kd <- d$cells[d$condition == "knockdown"]; ct <- d$cells[d$condition == "control"]; t <- t.test(kd, ct)
cat(sprintf("A. Fields as n (%d vs %d), Welch t-test: knockdown / control %.2f, p = %s\n", length(kd), length(ct), mean(kd) / mean(ct), f2(t$p.value)))
ik <- ins$cells[ins$condition == "knockdown"]; ic <- ins$cells[ins$condition == "control"]; t <- t.test(ik, ic)
cat(sprintf("B. Inserts as n (%d vs %d), raw counts, Welch t-test: knockdown / control %.2f, p = %s\n", length(ik), length(ic), mean(ik) / mean(ic), f2(t$p.value)))
pc <- 100 * ex[, "knockdown"] / ex[, "control"]
t <- t.test(pc, rep(100, length(pc)), var.equal = TRUE)    # control column set to 100% in every experiment; Student's t-test
cat(sprintf("C. Percent of control, control fixed at 100%% (n = %d per group), Student's t-test: knockdown %.0f%%, p = %s\n", length(pc), mean(pc), f2(t$p.value)))
t <- t.test(pc, mu = 100)
cat(sprintf("D. Percent of control, one-sample t-test against 100%% (n = %d): knockdown %.0f%%, p = %s\n", length(pc), mean(pc), f2(t$p.value)))
r <- log(ex[, "knockdown"] / ex[, "control"]); t <- t.test(r)
cat(sprintf("E. Log ratio per experiment (paired, n = %d): knockdown / control %.2f (95%% CI %.2f to %.2f), p = %s\n",
            length(r), exp(mean(r)), exp(t$conf.int[1]), exp(t$conf.int[2]), f2(t$p.value)))
