#' Structural organisation (So) for FCM data based on Koch et al. 2014
#'
#' This function calculates Structural organisation from FCM data according to Koch et al. 2014.
#' @param x flowbasis object generated by flowBasis()
#' @param d Rounding factor for density values. Defaults to 4.
#' @param plot Make plot of diversity values? Defaults to FALSE.
#' @param n Number of replicates. Defaults to 1.
#' @keywords So, fcm, structural organization
#' @examples
#' ## Short example
#'
#' # Load precomputed fingerprint object
#' data(CoolingTower)
#'
#' # Calculate diversity values
#' So(CoolingTower, plot=TRUE)
#'
#' ## Full data processing example
#'
#' # Load raw data (imported using flowCore)
#' data(flowData)
#' # Asinh transform and select parameters of interest (cells were stained with Sybr Green I).
#' flowData_transformed <- flowCore::transform(flowData,`FL1-H`=asinh(`FL1-H`),
#' `SSC-H`=asinh(`SSC-H`),
#' `FL3-H`=asinh(`FL3-H`),
#' `FSC-H`=asinh(`FSC-H`))
#' param=c('FL1-H', 'FL3-H','SSC-H','FSC-H')
#' flowData_transformed = flowData_transformed[,param]
#'
#' # Create a PolygonGate for denoising the dataset
#' # Define coordinates for gate in sqrcut1 in format: c(x,x,x,x,y,y,y,y)
#' sqrcut1 <- matrix(c(8.75,8.75,14,14,3,7.5,14,3),ncol=2, nrow=4)
#' colnames(sqrcut1) <- c('FL1-H','FL3-H')
#' polyGate1 <- flowCore::polygonGate(.gate=sqrcut1, filterId = 'Total Cells')
#'
#' # Gating quality check
#' flowViz::xyplot(`FL3-H` ~ `FL1-H`, data=flowData_transformed[1], filter=polyGate1,
#' scales=list(y=list(limits=c(0,14)),
#' x=list(limits=c(6,16))),
#' axis = lattice::axis.default, nbin=125,
#' par.strip.text=list(col='white', font=2, cex=2), smooth=FALSE)
#'
#' # Isolate only the cellular information based on the polyGate1
#' flowData_transformed <- flowCore::Subset(flowData_transformed, polyGate1)
#'
#' # Normalize parameter values to [0,1] interval based on max. value across parameters
#' summary <- flowCore::fsApply(x=flowData_transformed,FUN=function(x) apply(x,2,max),use.exprs=TRUE)
#' max = max(summary[,1])
#' mytrans <- function(x) x/max
#' flowData_transformed <- flowCore::transform(flowData_transformed,`FL1-H`=mytrans(`FL1-H`),
#' `FL3-H`=mytrans(`FL3-H`),
#' `SSC-H`=mytrans(`SSC-H`),
#' `FSC-H`=mytrans(`FSC-H`))
#'
#' # Calculate fingerprint
#' fbasis <- flowFDA::flowBasis(flowData_transformed, param, nbin=128,
#' bw=0.01, normalize=function(x) x)
#'
#' # Calculate diversity
#' So(fbasis, plot=TRUE)
#' @export
So <- function(x, d = 3, n = 1, plot = FALSE) {
x <- x@basis/apply(x@basis, 1, max)
So = apply(x, 1, FUN = function(x) {
x = round(x, d)
x <- x[x != 0]
sum(abs(x - mean(x)))/(length(x))
})
if (n > 1) {
results = matrix(nrow = length(x[, 1])/3, ncol = 2)
results[, 1] = trip(So, n)[, 1]
results[, 2] = trip(So, n)[, 2]
results = data.frame(results)
colnames(results) = c("Organisation", "sdev")
rownames(results) = trip_col(attr(x, "dimnames")[[1]], n)
} else {
results <- So
results = data.frame(results)
colnames(results) = c("Organisation")
rownames(results) = attr(x, "dimnames")[[1]]
}
if (plot == TRUE) {
graphics::plot(results$Organisation, pch = 21, bg = grDevices::adjustcolor("blue", 0.7), col = grDevices::adjustcolor("blue",
0.7), cex = 1.5, las = 1, ylab = "SO", xlab = "Samples")
}
return(results)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.