Commit 23fa289e authored by svolant's avatar svolant
Browse files

Filtering step +bugs intervalles confiance alpha diversiy

parent 9f6ede40
......@@ -195,7 +195,7 @@ GetCountsMerge <- function(input,dataInput,taxoSelect,target,design)
CT=CT_int
} else CT = CT[,ind]
#save.image("test.RData")
## Order CT according to the target
CT = OrderCounts(counts=CT,labels=labels)$CountsOrder
CT_noNorm = CT
......@@ -207,8 +207,9 @@ GetCountsMerge <- function(input,dataInput,taxoSelect,target,design)
if(is.null(VarNorm)){
## Counts normalisation
## Normalisation with or without 0
if(input$AccountForNA || RowProd==0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT))
if(!input$AccountForNA && RowProd!=0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)))
if(input$AccountForNA=="NonNull" || RowProd==0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT))
if(input$AccountForNA=="All" && RowProd!=0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)))
if(input$AccountForNA=="Weighted" && input$AccountForNA!="NonNull" ) {dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT)); sizeFactors(dds) = w.sizefactor(CT)}
normFactors = sizeFactors(dds)
} else{
......@@ -225,13 +226,16 @@ GetCountsMerge <- function(input,dataInput,taxoSelect,target,design)
CT_tmp = removeNulCounts(CT_tmp)
target_tmp = data.frame(labels = rownames(target)[indgrp])
dds_tmp <- DESeqDataSetFromMatrix(countData=CT_tmp, colData=target_tmp, design=~labels)
if(input$AccountForNA) dds_tmp = estimateSizeFactors(dds_tmp,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT_tmp))
if(!input$AccountForNA) dds_tmp = estimateSizeFactors(dds_tmp,locfunc=eval(as.name(input$locfunc)))
normFactors[indgrp] = sizeFactors(dds_tmp)
if(input$AccountForNA=="NonNull") {dds_tmp = estimateSizeFactors(dds_tmp,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT_tmp)); normFactors[indgrp] = sizeFactors(dds_tmp)}
if(input$AccountForNA=="All") {dds_tmp = estimateSizeFactors(dds_tmp,locfunc=eval(as.name(input$locfunc))); normFactors[indgrp] = sizeFactors(dds_tmp)}
if(input$AccountForNA=="Weighted" && input$AccountForNA!="NonNull" ) {dds_tmp = estimateSizeFactors(dds_tmp,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT_tmp)); normFactors[indgrp] = w.sizefactor(CT_tmp)}
}
} else{
if(input$AccountForNA || RowProd==0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT))
if(!input$AccountForNA && RowProd!=0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)))
if(input$AccountForNA=="NonNull" || RowProd==0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT))
if(input$AccountForNA=="All" && RowProd!=0) dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)))
if(input$AccountForNA=="Weighted" && input$AccountForNA!="NonNull" ) {dds = estimateSizeFactors(dds,locfunc=eval(as.name(input$locfunc)),geoMeans=GeoMeansCT(CT)); sizeFactors(dds) = w.sizefactor(CT)}
normFactors = sizeFactors(dds)
}
......@@ -240,7 +244,7 @@ GetCountsMerge <- function(input,dataInput,taxoSelect,target,design)
## Keep normalized OTU table
CT_Norm = counts(dds, normalized=TRUE)
#save(CT_Norm,dds,CT,taxo,taxoSelect,file="test.RData")
# Only interesting OTU
# merged_table = merge(CT, taxo[order(rownames(CT)),], by="row.names")
merged_table = merge(CT, taxo, by="row.names")
......@@ -254,7 +258,7 @@ GetCountsMerge <- function(input,dataInput,taxoSelect,target,design)
# indOTU_annot = which(rownames(CT)%in%rownames(taxo))
# counts_annot = CT[indOTU_annot[ordOTU],]
## Aggregate matrix
if(taxoSelect=="OTU/Gene") counts = counts_annot
if(taxoSelect=="OTU/Gene" || input$FileFormat=="fileBiom") counts = counts_annot
else{
if(input$TypeTable == "MGS"){
taxoS = taxo[,input$TypeTable]
......@@ -294,6 +298,62 @@ GeoMeansCT <- function(CT)
return(gm)
}
## Get weighted size factors
w.sizefactor <- function(CT)
{
sf = c()
CT = as.matrix(CT)
nbsamp = ncol(CT)
CT[which(CT<1)]=NA
gm = apply(CT,1,geometric.mean,na.rm=TRUE)
weights = nbsamp - apply(CT,1,FUN=function(x){tmp =length(which(is.na(x))) ;return(tmp)})
weights_tmp = weights
for(i in 1:ncol(CT))
{
ind = which(is.na(CT[,i]))
gm_tmp = gm
tmp = CT[,i]
if(length(ind)>0) {tmp = CT[-ind,i]; gm_tmp = gm[-ind]; weights_tmp = weights[-ind]}
sf[i] = w.median(tmp/gm_tmp,weights_tmp, na.rm = TRUE)
}
names(sf) = colnames(CT)
return(sf)
}
## Calculated the weighted median
w.median <- function (x, w, na.rm = TRUE)
{
if (missing(w))
w <- rep.int(1, length(x))
else {
if (length(w) != length(x))
stop("'x' and 'w' must have the same length")
if (any(is.na(w)))
stop("NA weights not allowed")
if (any(w < 0))
stop("Negative weights not allowed")
}
if (is.integer(w))
w <- as.numeric(w)
if (na.rm) {
w <- w[i <- !is.na(x)]
x <- x[i]
}
if (all(w == 0)) {
warning("All weights are zero")
return(NA)
}
o <- order(x)
x <- x[o]
w <- w[o]
p <- cumsum(w)/sum(w)
n <- sum(p < 0.5)
if (p[n + 1] > 0.5)
x[n + 1]
else (x[n + 1] + x[n + 2])/2
}
## Order the counts
OrderCounts <- function(counts,normFactors=NULL,labels)
......@@ -311,3 +371,171 @@ OrderCounts <- function(counts,normFactors=NULL,labels)
return(list(CountsOrder=CountsOrder,normFactorsOrder = normFactorsOrder))
}
## Order the counts
Filtered_feature <- function(counts,th.samp,th.abund)
{
ind = NULL
## Total abundance over samples
Tot_abundance = log(rowSums(counts)+1)
ind.ab = which(Tot_abundance<=th.abund)
## Get the numbre of non zero sample
counts.bin = as.matrix(counts)
counts.bin[which(counts>0)] = 1
nbSampByFeat = rowSums(counts.bin)
ind.samp = which(nbSampByFeat<=th.samp)
ind = unique(c(ind.samp,ind.ab))
return(list(ind=ind,Tot_abundance=Tot_abundance,ind.ab=ind.ab,counts.bin=counts.bin,ind.samp=ind.samp,nbSampByFeat=nbSampByFeat))
}
## Order the counts
plot_filter <- function(counts,th.samp,th.abund,type="Scatter")
{
res = NULL
## Initial plot for plotly
if(type == 'Abundance' || type == 'Samples'){
dataNull = data.frame(x=c(0,0),y=c(1,2),col=c("white","white"))
res = ggplotly(ggplot(dataNull,aes(x=x,y=y))+geom_point(aes(colour = col))+theme_bw()+ scale_color_manual(values = "white"))
}
res_filter = Filtered_feature(counts,th.samp,th.abund)
if(type == 'Abundance' && !is.null(th.samp) && !is.null(th.abund) )
{
state = rep("Kept",nrow(counts))
## Total abundance over samples
Tot_abundance = res_filter$Tot_abundance
ind = res_filter$ind.ab
ord = order(Tot_abundance,decreasing = FALSE)
## Modify the state
state[ind] = "Removed"
## Create the data.frame for ggplot
df = data.frame(lab = rownames(counts)[ord],y = Tot_abundance[ord],State=state[ord])
df$lab = factor(df$lab,levels = rownames(counts)[ord])
df$State = factor(df$State,levels = c("Kept","Removed"))
## plot the results
gg = ggplot(df,aes(lab,y,fill=State)) + geom_bar(stat='identity') + theme_bw() +theme(axis.text.x = element_text(angle = 90, hjust = 1,vjust = 0.5))
gg = gg + geom_hline( yintercept = th.abund,linetype = "longdash")
gg = gg + scale_fill_manual(values = c('springgreen3','firebrick'))
if(!"Kept"%in%df$State ) gg = gg + scale_fill_manual(values = 'firebrick')
if(!"Removed"%in%df$State ) gg = gg + scale_fill_manual(values = 'springgreen3')
res = ggplotly(gg)
}
if(type == 'Samples' && !is.null(th.samp) && !is.null(th.abund))
{
state = rep("Kept",nrow(counts))
## Get the number of non zero sample
nbSampByFeat = res_filter$nbSampByFeat
ind = res_filter$ind.samp
ord = order(nbSampByFeat,decreasing = FALSE)
state[ind] = "Removed"
df = data.frame(lab = rownames(counts)[ord],y = nbSampByFeat[ord],State=state[ord])
df$lab = factor(df$lab,levels = rownames(counts)[ord])
df$State = factor(df$State,levels = c("Kept","Removed"))
## plot the results
gg = ggplot(df,aes(lab,y,fill=State)) + geom_bar(stat='identity') + theme_bw() +theme(axis.text.x = element_text(angle = 90, hjust = 1,vjust = 0.5))
gg = gg + geom_hline( yintercept = th.samp,linetype = "longdash")
gg = gg + scale_fill_manual(values = c('springgreen3','firebrick'))
if(!"Kept"%in%df$State ) gg = gg + scale_fill_manual(values = 'firebrick')
if(!"Removed"%in%df$State ) gg = gg + scale_fill_manual(values = 'springgreen3')
res = ggplotly(gg)
}
if(type == 'Scatter')
{
state = rep("Kept",nrow(counts))
## Get the number of non zero sample
nbSampByFeat = res_filter$nbSampByFeat
Tot_abundance = res_filter$Tot_abundance
## Get the selected features (under the thresholds)
ind = res_filter$ind
## Modify the state
state[ind] = "Removed"
## Create the data.frame for ggplot
df = data.frame(lab =rownames(counts), y = nbSampByFeat,x = Tot_abundance,State=state)
df$lab = factor(df$lab,levels = rownames(counts))
df$State = factor(df$State,levels = c("Kept","Removed"))
x_var = df$x
y_var = df$y
State = df$State
PointSize = 2
colors_scat = list(Kept="#00CD66",Removed="#b22222")
print(State)
print(colors_scat)
print(head(df))
res = scatterD3(x = x_var,
y = y_var,
lab = rownames(df),
xlab = "Abundance in log",
ylab = "Number of samples",
col_var = State,
colors = colors_scat,
size_lab = PointSize,
key_var = rownames(df),
point_opacity = 0.7,
transitions = TRUE)
# gg = ggplot(df,aes(x,y,color=State,group = lab)) + geom_point() + theme_bw()
# gg = gg + geom_vline( xintercept = th.samp,linetype = "longdash")
# gg = gg + geom_hline( yintercept = th.abund,linetype = "longdash")
# gg = gg + scale_color_manual(values = c('springgreen3','firebrick'))
# ggplotly(gg)
# return(gg)
}
return(res)
}
######################################################
## NAME: SelectThreshAb
##
## INPUT:
## infile : data matrix (counts, rows: taxo)
## lambda : Tuning parameter (default is 500)
##
## OUTPUT:
## Cut-off value
##
######################################################
SelectThreshAb <- function(infile,lambda=500,graph=TRUE){
rs <- rowSums(infile)
test_Filtre <- sapply(c(min(rs):lambda),FUN=function(x) table(rs>x))
x <- c(min(rs):lambda)
reslm <- lm(test_Filtre[1,]~x)$coefficients
val <- which(test_Filtre[1,]>reslm[1])[1]
if (graph==TRUE){
plot(test_Filtre[1,],ylab="Nb especes avec moins de x comptages sur tous les echantillons",xlab="x")
abline(v=val,col="red")
}
return(val)
}
......@@ -269,7 +269,7 @@ Plot_Visu_Scatterplot<- function(input,resDiff,export=FALSE,lmEst = FALSE,CorEst
size_var = if (PointSize == "None" || is.null(PointSize)) 1 else data[,PointSize]
plot = ggplot(data, aes(x = x_var, y = y_var)) + geom_point(aes(color=col_var,size =size_var,shape = symbol_var),alpha=0.7) +theme_bw()
plot = plot + geom_smooth(method="lm")
if(input$AddRegScatter) plot = plot + geom_smooth(method="lm")
if(input$SizeLabelScatter!=0) plot = plot + geom_text(aes(label=rownames(data),color=col_var,size=as.numeric(input$SizeLabelScatter)/10),vjust = 0,nudge_y =0.05)
plot = plot + xlab(Xvar) + ylab(Yvar)
......@@ -333,10 +333,10 @@ Plot_Visu_Diversity <- function(input,resDiff,ForScatter=FALSE){
if(nrow(counts_tmp_combined)>0 && !is.null(counts_tmp_combined) && !is.null(targetInt))
{
sqrt.nb = sqrt(table(targetInt$AllVar))
# save(counts_tmp_combined,targetInt,file = "testDiv.RData")
alpha <- tapply(TaxoNumber(counts_tmp_combined), targetInt$AllVar, mean)
ci.alpha.down = pmax(alpha - 1.96*tapply(TaxoNumber(counts_tmp_combined), targetInt$AllVar, mean)/sqrt.nb,0)
ci.alpha.up = alpha + 1.96*tapply(TaxoNumber(counts_tmp_combined), targetInt$AllVar, mean)/sqrt.nb
ci.alpha.down = pmax(alpha - 1.96*tapply(TaxoNumber(counts_tmp_combined), targetInt$AllVar, sd)/sqrt.nb,0)
ci.alpha.up = alpha + 1.96*tapply(TaxoNumber(counts_tmp_combined), targetInt$AllVar, sd)/sqrt.nb
shan <- tapply(diversity(counts_tmp_combined, index = "shannon"), targetInt$AllVar, mean)
ci.shan.down = pmax(shan - 1.96*tapply(diversity(counts_tmp_combined, index = "shannon"), targetInt$AllVar, sd)/sqrt.nb,0)
......@@ -413,7 +413,7 @@ Plot_Visu_Diversity <- function(input,resDiff,ForScatter=FALSE){
## Get interactivity
#ff = ggplotly(gg)
}
print(dataTmp)
return(list(plot=gg,dataDiv = dataTmp))
}
......
source('LoadPackages.R')
library(plotly)
shinyServer(function(input, output,session) {
......@@ -166,7 +167,7 @@ shinyServer(function(input, output,session) {
## Merge counts data
dataMergeCounts <-reactive({
dataMergeCounts <-reactive({
input$RunDESeq
counts = NULL
......@@ -175,15 +176,24 @@ shinyServer(function(input, output,session) {
CT_noNorm = NULL
CT_Norm = NULL
#labeled= NULL
data = dataInput()$data
data = isolate(dataInput()$data)
target = isolate(dataInputTarget()$target)
taxo = isolate(input$TaxoSelect)
withProgress(
if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0 && !is.null(taxo) && taxo!="..." && !is.null(target))
{
design = GetDesign(input)
tmp = isolate(withProgress(GetCountsMerge(input,data,taxo,target,design),message="Merging the counts ..."))
design = GetDesign(isolate(input))
tmp = isolate(GetCountsMerge(input,data,taxo,target,design))
counts = tmp$counts
## Filtering the counts
if(isolate(input$AddFilter) && !is.null(isolate(input$SliderThSamp)) && !is.null(isolate(input$SliderThAb)))
{
ind.filter =Filtered_feature(counts,isolate(input$SliderThSamp),isolate(input$SliderThAb))$ind
counts = counts[-ind.filter,]
}
CheckTarget = tmp$CheckTarget
#target = tmp$target
#labeled = tmp$labeled
......@@ -193,6 +203,7 @@ shinyServer(function(input, output,session) {
CT_noNorm = tmp$CT_noNorm
CT_Norm = tmp$CT_Norm
}
,message="Merging the counts ...")
return(list(counts=counts,CheckTarget=CheckTarget,normFactors=normFactors,CT_noNorm=CT_noNorm, CT_Norm=CT_Norm))
#return(list(counts=counts,target=target,labeled=labeled,normFactors=normFactors,CT_noNorm=CT_noNorm))
})
......@@ -258,7 +269,60 @@ shinyServer(function(input, output,session) {
})
####### Filtering the counts (sliders)
output$ThAb <- renderUI({
input$AddFilter
res = NULL
counts = isolate(dataMergeCounts()$counts)
tot = rowSums(counts)
tmp = SelectThreshAb(counts,lambda=max(round(sum(counts)/nrow(counts)*0.05),min(tot)+1),graph=FALSE)
res = sliderInput("SliderThAb","Threshold on the total abundance (in log)",min=0,max=round(max(log(tot+1)),1),value = log(tmp+1))
return(res)
})
output$ThSamp <- renderUI({
input$AddFilter
res = NULL
counts = isolate(dataMergeCounts()$counts)
counts.bin = as.matrix(counts)
counts.bin[which(counts>0)] = 1
nbSampByFeat = rowSums(counts.bin)
## Default value
val = round(max(nbSampByFeat)*0.2)
res = sliderInput("SliderThSamp","Threshold on the minimal number of samples",min=0,max=max(nbSampByFeat),value = val)
return(res)
})
## Plot for the filtering step$
# plot_filter(counts,th.samp,th.abund,type="Scatter")
output$Plot_ThAb <- renderPlotly({
counts = dataMergeCounts()$counts
## output of plot_filter is ggplot class
plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Abundance")
})
output$Plot_ThSamp <- renderPlotly({
counts = dataMergeCounts()$counts
## output of plot_filter is ggplot class
plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Samples")
})
output$Plot_Scatter_Filter <- renderScatterD3({
counts = dataMergeCounts()$counts
## output of plot_filter is ggplot class
plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Scatter")
})
#####################################################
##
## DYNAMIC MENU
......@@ -545,8 +609,8 @@ shinyServer(function(input, output,session) {
## Box for merged counts
output$BoxCountsMerge <- renderUI({
counts = dataMergeCounts()$counts
input$RunDESeq
counts = isolate(dataMergeCounts()$counts)
taxo = input$TaxoSelect
if(!is.null(counts) && taxo != "...")
......@@ -1047,13 +1111,13 @@ shinyServer(function(input, output,session) {
# Infobox taxo
output$InfoTaxo <- renderInfoBox({
input$RunDESeq
data = isolate(dataInput()$data)
taxo = isolate(input$TaxoSelect)
data = dataInput()$data
taxo = input$TaxoSelect
if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0 && !is.null(taxo) && taxo!="...")
if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0 && !is.null(isolate(taxo)) && taxo!="...")
{
counts = dataMergeCounts()$counts
counts = isolate(dataMergeCounts()$counts)
nfeature = nrow(counts)
infoBox(h6(strong("Taxonomy")), subtitle = h6(paste(taxo, ", nb features: ",nfeature,sep="")), icon = icon("thumbs-o-up"),color = "green",width=NULL,fill=TRUE)
}
......@@ -1433,13 +1497,11 @@ shinyServer(function(input, output,session) {
target = dataInputTarget()$target
taxo = input$TaxoSelect
if(!is.null(target) && taxo!="...") res = actionButton("RunDESeq",strong("Run analysis"),icon = icon("caret-right"))
return(res)
})
#####################################################
##
## VISUALISATION
......@@ -1898,5 +1960,55 @@ shinyServer(function(input, output,session) {
data.frame(refs)
}
}, sanitize.text.function = function(x) x)
}, sanitize.text.function = function(x) x)
#####################################################
##
## Disable/Enable actions
##
#####################################################
## Disable the actionbutton if the number of feature is lower than 2
observe({
counts = dataMergeCounts()$counts
if(input$AddFilter && !is.null(input$SliderThSamp) && !is.null(input$SliderThAb))
{
ind.filter =Filtered_feature(counts,input$SliderThSamp,input$SliderThAb)$ind
counts = counts[-ind.filter,]
}
if (!is.null(counts)){
if (nrow(counts)>=2){
shinyjs::enable("RunDESeq")
}
if (nrow(counts)<2) {
shinyjs::disable("RunDESeq")
}
}
if (is.null(counts)) {
shinyjs::disable("RunDESeq")
}
})
observe({
taxo = input$TaxoSelect
target=dataInputTarget()$target
if(is.null(target) || taxo =="...")
{
shinyjs::disable("AddFilter")
} else {
shinyjs::enable("AddFilter")
}
})
})
......@@ -13,14 +13,14 @@ if(!require(shinyjs)){
install.packages("shinyjs")
library(shinyjs)
}
library(plotly)
function(request) {
sidebar <- dashboardSidebar(
useShinyjs(),
inlineCSS(appCSS),
tags$head(
tags$script(src = "custom.js")
),
# tags$head(
# tags$script(src = "custom.js")
# ),
div(id = "loading-content-bar",
p()),
div(
......@@ -64,7 +64,7 @@ body <- dashboardBody(
". SHAMAN robustly identifies the differential abundant genera with the Generalized Linear Model implemented in DESeq2", a("[Love 2014]", href="http://www.ncbi.nlm.nih.gov/pubmed/25516281"),".
Resulting p-values are adjusted according to the Benjamini and Hochberg procedure [Benjamini and Hochberg 1995].
The PCOA is performed with the", a("ade4 R package",href="http://pbil.univ-lyon1.fr/ade4/"), "and plots are generated with", a("ggplot2",href="http://ggplot2.org/"), "or", a("D3.js packages",href="http://d3js.org/"), ".
A presentation about SHAMAN is available", a("here.",target="_blank",href="shaman_presentation.pdf"), br(),
A presentation about SHAMAN is available", a("here",target="_blank",href="shaman_presentation.pdf")," and a poster", a("here.",target="_blank",href="shaman_poster.pdf"), br(),
"SHAMAN is compatible with standard formats for metagenomic analysis. We also provide a complete pipeline for OTU picking and annotation named",a("MASQUE", href="https://github.com/aghozlane/masque") ,"used in production at Institut Pasteur.",style = "font-family: 'times'; font-si16pt"),
p("Hereafter is the global workflow of the SHAMAN application:"),
div(img(src = "Workflow.png",width = "100%",style="max-width: 600px"),Align="center")
......@@ -90,6 +90,8 @@ body <- dashboardBody(
box(
title = "What's new in SHAMAN", width = NULL, status = "primary",
div(style = 'overflow-y: scroll; max-height: 400px',
addNews("Oct 12th 2016","Filtering step and bugs fix","You can now apply a filter on the features according to their abundance
and the number of samples. Bugs on confidence intervals for the alpha diversity have been fixed"),
addNews("Sep 21th 2016","SHAMAN on docker","The install of SHAMAN is now available with docker.
The R install is also updated and passed in release candidate state."),
addNews("Sep 14th 2016","Download and install SHAMAN","You can install SHAMAN (beta)."),
......@@ -305,47 +307,73 @@ body <- dashboardBody(
column(width=7,
box(title="Options",width = NULL, status = "primary", solidHeader = TRUE,collapsible = TRUE,collapsed = TRUE,
p(strong("Linear model options"),Align ="center"),
hr(),
fluidRow(
column(width=3,
radioButtons("TransType",h6(strong("Type of transformation")),choices = c("VST"="VST","rlog"="rlog"))
),
column(width=3,
radioButtons("IndFiltering",h6(s