Instructions:

  1. If needed, install all libraries required.
  2. Put the source file in the same file as the data file
  3. Source file should be CSV format. lines are intensities and columns for replicates.
  4. Cange the variable filename to the file name without the extension CSV.
  5. Adjust the percentage variable to whatever you want.
  6. RUN!

source code available to download here.

Table of contents

  1. Statistics
  2. Plots
  3. More statistics
library(readxl)
library(plotly)
library(tidyverse)
library(plyr)
library(dplyr)
library(cluster)
library(reshape2)
library(tibble)
library(formattable)
#  Mode function
getmode <- function(v) {
   uniqv <- unique(v)
   uniqv[which.max(tabulate(match(v, uniqv)))]
}

file

filename = "data"
data = read.csv(paste0(filename,".csv"))
data = as.data.frame(t(data))
# `colnames<-`(data, data[1,]) # Use column names
data = data[2:min(dim(data)),] # Delete columns names row

cutoff

percentage = 20
all.cells = apply(data, 2, sum)
cum.cells = cumsum(all.cells)
threshold = min(which(cum.cells > sum(data) * percentage / 100 ))
#  Cut intensity below thresholds
trim.data = data[,threshold:length(data)]
max.threshold = min(which(apply(trim.data, 2, max) == 0))
double.trim = trim.data[,1:max.threshold]

Remove lines with peak cells in low intensity

peaks = apply(data, 1, max)
peak.intensity = numeric(length = length(data$V1))
for(row in seq(1:length(data$V1))) {
  peak.intensity[row] = which(data[row,] == peaks[row])
}
tripl.trim = double.trim[apply(double.trim, 1, max) >= peaks ,]
# plot(apply(double.trim, 2, mean))
# clustered = cbind(pam.cluster$clustering, double.trim[,1:3])
temp = rownames_to_column(as.data.frame(tripl.trim))
# temp$rowname = paste0(temp$rowname, "_", fan$clustering)
# colnames(melted)
melted = melt(temp)
Using rowname as id variables
colnames(melted) = c("replicate", "intensity", "frequency")
# melted = separate(melted, rowname, c("rowname", "cluster"), "_")
# gather(temp, id = rowname, convert = T)
# melted = melt(clustered, value.name = list(colnames(clustered)[2:length(colnames(clustered))]))
# plot_ly(melted, type = "scatter", mode = "markers", y = ~value, color = ~Var1)

Show summary statistics

tabl = as.data.frame(apply(tripl.trim, 1, summary))
tabl
write.csv(tabl, file = paste0("summary for table ", filename,".csv"))

Histogram

p = ggplot(melted, aes(x = intensity, y = frequency, color = replicate)) + 
    geom_point(alpha = 0.05, shape = 16) +
    theme_classic() 
    # labs(y = "Frequency", x = "Intensity", color = "Replicate")
p
ggsave(file = paste0("hist_", filename,".png"), plot =  p)
Saving 7.29 x 4.5 in image

Violin plot

p2 = ggplot(melted, aes(x = replicate, y = frequency, color = replicate)) + 
  geom_violin(aes(fill = replicate)) + 
  theme_classic()
p2
ggsave(file = paste0("violin_", filename,".png"), plot =  p2)
Saving 7.29 x 4.5 in image

Boxplot

# means <- aggregate(frequency ~  replicate, melted, mean)
p3 = ggplot(melted, aes(x = replicate, y = frequency, fill = replicate)) + 
  geom_boxplot() + 
  stat_summary(fun.y = mean, color = "black", geom = "point", show.legend = F) +
  # geom_text(data = means, aes(label = frequency, y = frequency + 0.08)) +
  theme_classic()
p3
ggsave(file = paste0("boxplot_", filename,".png"), plot =  p3)
Saving 7.29 x 4.5 in image

Density plot

# Adjust the alpha uf necessary
p4 = ggplot(melted, aes(x = replicate, y = frequency, color = replicate)) + 
  geom_jitter(height = 0, width = 0.45, alpha = 0.03) +
  theme_classic()
p4
ggsave(file = paste0("density_", filename,".png"), plot =  p4)
Saving 7.29 x 4.5 in image

T tests p values all pairs

# t.tripl = t(tripl.trim)
# combos <- combn(ncol(t.tripl),2)
# 
# adply(combos, 2, function(x) {
#   test <- t.test(t.tripl[, x[1]], t.tripl[, x[2]])
# 
#   out <- data.frame("var1" = colnames(t.tripl)[x[1]]
#                     , "var2" = colnames(t.tripl[x[2]])
#                     , "t.value" = sprintf("%.3f", test$statistic)
#                     ,  "df"= test$parameter
#                     ,  "p.value" = sprintf("%.3f", test$p.value)
#                     )
#   return(out)
# 
# })
# 
ttests = pairwise.t.test(melted$frequency, melted$replicate, p.adjust = "none")
ttests$method
[1] "t tests with pooled SD"
as.data.frame(ttests$p.value)
write.csv(ttests$p.value, file = paste0("ttests_", filename, ".csv"))
# tttable = as.data.frame(formatC(ttests$p.value, format = "e", digits = 2))
tttable = as.data.frame(ttests$p.value)
formattable(tttable, align = c("l",rep("r", NCOL(tttable) - 1)), 
            list(`Indicator Name` = formatter("span", style = ~ style(color = "grey",font.weight = "bold")), 
                 area(col = 1:9) ~ function(x) percent(x / 100, digits = 0),
                 area(col = 1:9) ~ color_tile("green", "red")))
LS0tDQp0aXRsZTogIkZBQ1MiDQphdXRob3I6ICJSb3RlbSBIYWRhciINCmRhdGU6ICI3dGggS2lzbGV2IDU3NzkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBJbnN0cnVjdGlvbnM6DQowLiBJZiBuZWVkZWQsIGluc3RhbGwgYWxsIGxpYnJhcmllcyByZXF1aXJlZC4NCjEuIFB1dCB0aGUgc291cmNlIGZpbGUgaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGUgZGF0YSBmaWxlDQoyLiBTb3VyY2UgZmlsZSBzaG91bGQgYmUgYENTVmAgZm9ybWF0LiBsaW5lcyBhcmUgaW50ZW5zaXRpZXMgYW5kIGNvbHVtbnMgZm9yIHJlcGxpY2F0ZXMuDQozLiBDYW5nZSB0aGUgdmFyaWFibGUgW2BmaWxlbmFtZWBdKCNmaWxlKSB0byB0aGUgZmlsZSBuYW1lIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBgQ1NWYC4NCjQuIEFkanVzdCB0aGUgW2BwZXJjZW50YWdlYF0oI2N1dG9mZikgdmFyaWFibGUgdG8gd2hhdGV2ZXIgeW91IHdhbnQuDQo1LiBSVU4hDQoNCnNvdXJjZSBjb2RlIGF2YWlsYWJsZSB0byBkb3dubG9hZCBbaGVyZV0oaHR0cHM6Ly9iaXRidWNrZXQub3JnL2Jlbnp6ei9mYWNzL3NyYy9tYXN0ZXIvZmFjcy5SbWQpLg0KDQojIyMgVGFibGUgb2YgY29udGVudHMNCjEuIFtTdGF0aXN0aWNzXSgjc3RhdGlzdGljcykNCjIuIFtQbG90c10oI3Bsb3QpDQozLiBbTW9yZSBzdGF0aXN0aWNzXSgjbW9yZSkNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2x1c3RlcikNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpgYGANCg0KDQpgYGB7ciBnZXRNb2RlfQ0KIyAgTW9kZSBmdW5jdGlvbg0KZ2V0bW9kZSA8LSBmdW5jdGlvbih2KSB7DQogICB1bmlxdiA8LSB1bmlxdWUodikNCiAgIHVuaXF2W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh2LCB1bmlxdikpKV0NCn0NCmBgYA0KDQojIyMjIGZpbGUNCmBgYHtyIGZpbGV9DQpmaWxlbmFtZSA9ICJkYXRhIg0KZGF0YSA9IHJlYWQuY3N2KHBhc3RlMChmaWxlbmFtZSwiLmNzdiIpKQ0KZGF0YSA9IGFzLmRhdGEuZnJhbWUodChkYXRhKSkNCiMgYGNvbG5hbWVzPC1gKGRhdGEsIGRhdGFbMSxdKSAjIFVzZSBjb2x1bW4gbmFtZXMNCmRhdGEgPSBkYXRhWzI6bWluKGRpbShkYXRhKSksXSAjIERlbGV0ZSBjb2x1bW5zIG5hbWVzIHJvdw0KYGBgDQotLS0NCk5vdCBpbXBvcnRhbnQsIGp1c3QgY29vbA0KYGBge3IgU3dvcmR9DQpwbG90KGRpZmYoYXBwbHkoZGF0YSwyLCBtZWFuKSkpICMgU3dvcmQgZ3JhcGgNCmBgYA0KDQotLS0NCiMjIyMgY3V0b2ZmDQpgYGB7ciBjdXRvZmZ9DQpwZXJjZW50YWdlID0gMjANCmFsbC5jZWxscyA9IGFwcGx5KGRhdGEsIDIsIHN1bSkNCmN1bS5jZWxscyA9IGN1bXN1bShhbGwuY2VsbHMpDQp0aHJlc2hvbGQgPSBtaW4od2hpY2goY3VtLmNlbGxzID4gc3VtKGRhdGEpICogcGVyY2VudGFnZSAvIDEwMCApKQ0KDQojICBDdXQgaW50ZW5zaXR5IGJlbG93IHRocmVzaG9sZHMNCnRyaW0uZGF0YSA9IGRhdGFbLHRocmVzaG9sZDpsZW5ndGgoZGF0YSldDQptYXgudGhyZXNob2xkID0gbWluKHdoaWNoKGFwcGx5KHRyaW0uZGF0YSwgMiwgbWF4KSA9PSAwKSkNCmRvdWJsZS50cmltID0gdHJpbS5kYXRhWywxOm1heC50aHJlc2hvbGRdDQpgYGANCg0KUmVtb3ZlIGxpbmVzIHdpdGggcGVhayBjZWxscyBpbiBsb3cgaW50ZW5zaXR5DQpgYGB7cn0NCnBlYWtzID0gYXBwbHkoZGF0YSwgMSwgbWF4KQ0KcGVhay5pbnRlbnNpdHkgPSBudW1lcmljKGxlbmd0aCA9IGxlbmd0aChkYXRhJFYxKSkNCmZvcihyb3cgaW4gc2VxKDE6bGVuZ3RoKGRhdGEkVjEpKSkgew0KICBwZWFrLmludGVuc2l0eVtyb3ddID0gd2hpY2goZGF0YVtyb3csXSA9PSBwZWFrc1tyb3ddKQ0KfQ0KDQp0cmlwbC50cmltID0gZG91YmxlLnRyaW1bYXBwbHkoZG91YmxlLnRyaW0sIDEsIG1heCkgPj0gcGVha3MgLF0NCiMgcGxvdChhcHBseShkb3VibGUudHJpbSwgMiwgbWVhbikpDQpgYGANCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KY2x1c3RoID0gaGNsdXN0KGRpc3QodHJpbS5kYXRhKSkNCmttID0ga21lYW5zKGRvdWJsZS50cmltLCBjZW50ZXJzID0gOCkNCmZhbiA9IGNsdXN0ZXI6OmZhbm55KGRvdWJsZS50cmltLCA3KQ0KZmFuJGNsdXN0ZXJpbmcNCmRhaXMgPSBjbHVzdGVyOjpkYWlzeShkb3VibGUudHJpbSkNCiBjbHVzdGgkaGVpZ2h0DQoNCnNpbF93aWR0aCA8LSBjKE5BKQ0KZm9yKGkgaW4gMjoxNSl7DQogIHBhbV9maXQgPC0gcGFtKCAgZG91YmxlLnRyaW0NCiAgICAgICAgICAgICAgICAgLCBkaXNzID0gVFJVRQ0KICAgICAgICAgICAgICAgICAsIGsgPSBpKQ0KICANCiAgc2lsX3dpZHRoW2ldIDwtIHBhbV9maXQkc2lsaW5mbyRhdmcud2lkdGgNCiAgDQp9DQoNCiMgUGxvdCBzaWhvdWV0dGUgd2lkdGggKGhpZ2hlciBpcyBiZXR0ZXIpDQoNCnBsb3QoMToxNSwgc2lsX3dpZHRoLA0KICAgICB4bGFiID0gIk51bWJlciBvZiBjbHVzdGVycyIsDQogICAgIHlsYWIgPSAiU2lsaG91ZXR0ZSBXaWR0aCIpDQpsaW5lcygxOjE1LCBzaWxfd2lkdGgpDQoNCksgPSB3aGljaChzaWxfd2lkdGggPT0gbWF4KHNpbF93aWR0aCwgbmEucm0gPSBUKSkNCnBhbS5jbHVzdGVyID0gcGFtKGRvdWJsZS50cmltLCBkaXNzID0gVCwgayA9IEspDQpwYW0uY2x1c3RlciRjbHVzdGVyaW5nDQpgYGANCg0KYGBge3J9DQojIGNsdXN0ZXJlZCA9IGNiaW5kKHBhbS5jbHVzdGVyJGNsdXN0ZXJpbmcsIGRvdWJsZS50cmltWywxOjNdKQ0KdGVtcCA9IHJvd25hbWVzX3RvX2NvbHVtbihhcy5kYXRhLmZyYW1lKHRyaXBsLnRyaW0pKQ0KIyB0ZW1wJHJvd25hbWUgPSBwYXN0ZTAodGVtcCRyb3duYW1lLCAiXyIsIGZhbiRjbHVzdGVyaW5nKQ0KIyBjb2xuYW1lcyhtZWx0ZWQpDQoNCm1lbHRlZCA9IG1lbHQodGVtcCkNCmNvbG5hbWVzKG1lbHRlZCkgPSBjKCJyZXBsaWNhdGUiLCAiaW50ZW5zaXR5IiwgImZyZXF1ZW5jeSIpDQojIG1lbHRlZCA9IHNlcGFyYXRlKG1lbHRlZCwgcm93bmFtZSwgYygicm93bmFtZSIsICJjbHVzdGVyIiksICJfIikNCg0KIyBnYXRoZXIodGVtcCwgaWQgPSByb3duYW1lLCBjb252ZXJ0ID0gVCkNCiMgbWVsdGVkID0gbWVsdChjbHVzdGVyZWQsIHZhbHVlLm5hbWUgPSBsaXN0KGNvbG5hbWVzKGNsdXN0ZXJlZClbMjpsZW5ndGgoY29sbmFtZXMoY2x1c3RlcmVkKSldKSkNCg0KIyBwbG90X2x5KG1lbHRlZCwgdHlwZSA9ICJzY2F0dGVyIiwgbW9kZSA9ICJtYXJrZXJzIiwgeSA9IH52YWx1ZSwgY29sb3IgPSB+VmFyMSkNCmBgYA0KDQotLS0NCiMjIyBTaG93IHN1bW1hcnkgc3RhdGlzdGljcyB7I3N0YXRpc3RpY3N9DQpgYGB7ciBzdGF0aXN0aWNzfQ0KdGFibCA9IGFzLmRhdGEuZnJhbWUoYXBwbHkodHJpcGwudHJpbSwgMSwgc3VtbWFyeSkpDQp0YWJsDQp3cml0ZS5jc3YodGFibCwgZmlsZSA9IHBhc3RlMCgic3VtbWFyeSBmb3IgdGFibGUgIiwgZmlsZW5hbWUsIi5jc3YiKSkNCmBgYA0KDQojIyMgSGlzdG9ncmFtIHsjcGxvdH0NCmBgYHtyIHBsb3R9DQpwID0gZ2dwbG90KG1lbHRlZCwgYWVzKHggPSBpbnRlbnNpdHksIHkgPSBmcmVxdWVuY3ksIGNvbG9yID0gcmVwbGljYXRlKSkgKyANCiAgICBnZW9tX3BvaW50KGFscGhhID0gMC4wNSwgc2hhcGUgPSAxNikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSANCiAgICAjIGxhYnMoeSA9ICJGcmVxdWVuY3kiLCB4ID0gIkludGVuc2l0eSIsIGNvbG9yID0gIlJlcGxpY2F0ZSIpDQpwDQpnZ3NhdmUoZmlsZSA9IHBhc3RlMCgiaGlzdF8iLCBmaWxlbmFtZSwiLnBuZyIpLCBwbG90ID0gIHApDQpgYGANCg0KIyMjIFZpb2xpbiBwbG90DQpgYGB7ciB2aW9saW59DQpwMiA9IGdncGxvdChtZWx0ZWQsIGFlcyh4ID0gcmVwbGljYXRlLCB5ID0gZnJlcXVlbmN5LCBjb2xvciA9IHJlcGxpY2F0ZSkpICsgDQogIGdlb21fdmlvbGluKGFlcyhmaWxsID0gcmVwbGljYXRlKSkgKyANCiAgdGhlbWVfY2xhc3NpYygpDQpwMg0KZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoInZpb2xpbl8iLCBmaWxlbmFtZSwiLnBuZyIpLCBwbG90ID0gIHAyKQ0KYGBgDQoNCiMjIyBCb3hwbG90DQpgYGB7cn0NCiMgbWVhbnMgPC0gYWdncmVnYXRlKGZyZXF1ZW5jeSB+ICByZXBsaWNhdGUsIG1lbHRlZCwgbWVhbikNCnAzID0gZ2dwbG90KG1lbHRlZCwgYWVzKHggPSByZXBsaWNhdGUsIHkgPSBmcmVxdWVuY3ksIGZpbGwgPSByZXBsaWNhdGUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBzdGF0X3N1bW1hcnkoZnVuLnkgPSBtZWFuLCBjb2xvciA9ICJibGFjayIsIGdlb20gPSAicG9pbnQiLCBzaG93LmxlZ2VuZCA9IEYpICsNCiAgIyBnZW9tX3RleHQoZGF0YSA9IG1lYW5zLCBhZXMobGFiZWwgPSBmcmVxdWVuY3ksIHkgPSBmcmVxdWVuY3kgKyAwLjA4KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkNCnAzDQpnZ3NhdmUoZmlsZSA9IHBhc3RlMCgiYm94cGxvdF8iLCBmaWxlbmFtZSwiLnBuZyIpLCBwbG90ID0gIHAzKQ0KYGBgDQoNCiMjIyBEZW5zaXR5IHBsb3QNCmBgYHtyfQ0KIyBBZGp1c3QgdGhlIGFscGhhIHVmIG5lY2Vzc2FyeQ0KcDQgPSBnZ3Bsb3QobWVsdGVkLCBhZXMoeCA9IHJlcGxpY2F0ZSwgeSA9IGZyZXF1ZW5jeSwgY29sb3IgPSByZXBsaWNhdGUpKSArIA0KICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuNDUsIGFscGhhID0gMC4wMykgKw0KICB0aGVtZV9jbGFzc2ljKCkNCnA0DQpnZ3NhdmUoZmlsZSA9IHBhc3RlMCgiZGVuc2l0eV8iLCBmaWxlbmFtZSwiLnBuZyIpLCBwbG90ID0gIHA0KQ0KYGBgDQoNCiMjIyBUIHRlc3RzIHAgdmFsdWVzIGFsbCBwYWlycyB7I21vcmV9DQpgYGB7ciBtb3JlfQ0KIyB0LnRyaXBsID0gdCh0cmlwbC50cmltKQ0KIyBjb21ib3MgPC0gY29tYm4obmNvbCh0LnRyaXBsKSwyKQ0KIyANCiMgYWRwbHkoY29tYm9zLCAyLCBmdW5jdGlvbih4KSB7DQojICAgdGVzdCA8LSB0LnRlc3QodC50cmlwbFssIHhbMV1dLCB0LnRyaXBsWywgeFsyXV0pDQojIA0KIyAgIG91dCA8LSBkYXRhLmZyYW1lKCJ2YXIxIiA9IGNvbG5hbWVzKHQudHJpcGwpW3hbMV1dDQojICAgICAgICAgICAgICAgICAgICAgLCAidmFyMiIgPSBjb2xuYW1lcyh0LnRyaXBsW3hbMl1dKQ0KIyAgICAgICAgICAgICAgICAgICAgICwgInQudmFsdWUiID0gc3ByaW50ZigiJS4zZiIsIHRlc3Qkc3RhdGlzdGljKQ0KIyAgICAgICAgICAgICAgICAgICAgICwgICJkZiI9IHRlc3QkcGFyYW1ldGVyDQojICAgICAgICAgICAgICAgICAgICAgLCAgInAudmFsdWUiID0gc3ByaW50ZigiJS4zZiIsIHRlc3QkcC52YWx1ZSkNCiMgICAgICAgICAgICAgICAgICAgICApDQojICAgcmV0dXJuKG91dCkNCiMgDQojIH0pDQojIA0KDQp0dGVzdHMgPSBwYWlyd2lzZS50LnRlc3QobWVsdGVkJGZyZXF1ZW5jeSwgbWVsdGVkJHJlcGxpY2F0ZSwgcC5hZGp1c3QgPSAibm9uZSIpDQp0dGVzdHMkbWV0aG9kDQphcy5kYXRhLmZyYW1lKHR0ZXN0cyRwLnZhbHVlKQ0KDQp3cml0ZS5jc3YodHRlc3RzJHAudmFsdWUsIGZpbGUgPSBwYXN0ZTAoInR0ZXN0c18iLCBmaWxlbmFtZSwgIi5jc3YiKSkNCg0KIyB0dHRhYmxlID0gYXMuZGF0YS5mcmFtZShmb3JtYXRDKHR0ZXN0cyRwLnZhbHVlLCBmb3JtYXQgPSAiZSIsIGRpZ2l0cyA9IDIpKQ0KdHR0YWJsZSA9IGFzLmRhdGEuZnJhbWUodHRlc3RzJHAudmFsdWUpDQoNCmZvcm1hdHRhYmxlKHR0dGFibGUsIGFsaWduID0gYygibCIscmVwKCJyIiwgTkNPTCh0dHRhYmxlKSAtIDEpKSwgDQogICAgICAgICAgICBsaXN0KGBJbmRpY2F0b3IgTmFtZWAgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoY29sb3IgPSAiZ3JleSIsZm9udC53ZWlnaHQgPSAiYm9sZCIpKSwgDQogICAgICAgICAgICAgICAgIGFyZWEoY29sID0gMTo5KSB+IGZ1bmN0aW9uKHgpIHBlcmNlbnQoeCAvIDEwMCwgZGlnaXRzID0gMCksDQogICAgICAgICAgICAgICAgIGFyZWEoY29sID0gMTo5KSB+IGNvbG9yX3RpbGUoImdyZWVuIiwgInJlZCIpKSkNCg0KDQoNCmBgYA0KDQo=