From ec2cca9ef8eafafb3b4df3256e7f3c221bded608 Mon Sep 17 00:00:00 2001
From: grlloyd Introductionpmp) package,
+Peak Matrix Processing (pmp) package,
including a range of additional filters that are described in Kirwan et
al., 2013,
2014.
The MTBLS79_DatasetExperiment
object included in the
structToolbox
package is a processed version of the MTBLS79
-dataset available in peak matrix processing (pmp) package.
+dataset available in peak matrix processing (pmp) package.
This vignette describes step by step how the structToolbox
version was created from the pmp
version (i.e. ‘Dataset
7:SFPM’ from the Scientific Data publication - https://doi.org/10.1038/sdata.2014.12).
The “Sacurine” dataset needs to be converted to a
-DatasetExperiment
object. The ropls
+DatasetExperiment
object. The ropls
package provides the data as a list containing a
dataMatrix
, sampleMetadata
and
variableMetadata
.
The third plot coloured by gender (C) is identical to Figure 2 of the
-ropls
+ropls
package vignette. The structToolbox
package provides a
range of PCA-related diagnostic plots, including D-statistic, scree, and
loadings plots. These plots can be used to further explore the variance
@@ -1006,7 +1006,7 @@
The plot is similar to fig.3 of the ropls +
The plot is similar to fig.3 of the ropls
vignette. Differences are due to inverted LV axes, a common occurrence
with the NIPALS algorithm (used by both structToolbox
and
ropls
) which depends on how the algorithm is
@@ -1106,10 +1106,8 @@
## adding rname 'https://github.com/CIMCB/MetabWorkflowTutorial/raw/master/GastricCancer_NMR.xlsx'
-
-X = read.xlsx(path)
+path = bfcrpath(bfc,url)
+X = read.xlsx(path)
# sample meta data
SM=X[,1:4]
@@ -1153,7 +1151,7 @@ Data pre-processing and qual
quality, and to assess the quality of the data in general. In the
Tutorial features with QC-RSD > 20% and where more than 10% of the
features are missing are retained.
-
+
# prepare model sequence
M = rsd_filter(rsd_threshold=20,qc_label='QC',factor_name='Class') +
mv_feature_filter(threshold = 10,method='across',factor_name='Class')
@@ -1189,7 +1187,7 @@ Data pre-processing and qual
The transformed and scaled matrix in then used as input to PCA. Using
struct
we can chain all of these steps into a single model
sequence.
-
+
# prepare the model sequence
M = log_transform(base = 10) +
autoscale() +
@@ -1221,7 +1219,7 @@ Univariate statisticslink).
The QC samples need to be excluded, and the data reduced to only the GC
and HE groups.
-
+
# prepare model
TT = filter_smeta(mode='include',factor_name='Class',levels=c('GC','HE')) +
ttest(alpha=0.05,mtc='fdr',factor_names='Class')
@@ -1263,7 +1261,7 @@ Training and Test setssplit_data
object for random subsampling across
the whole dataset, and stratified_split
for splitting based
on group sizes, which is the approach used by Mendez et al.
-
+
# prepare model
M = stratified_split(p_train=0.75,factor_name='Class')
# apply to filtered data
@@ -1280,9 +1278,9 @@ Training and Test sets## data: 62 rows x 53 columns
## sample_meta: 62 rows x 5 columns
## variable_meta: 53 rows x 1 columns
-
+
cat('\n')
-
+
test = M$testing
test
## A "DatasetExperiment" object
@@ -1305,7 +1303,7 @@ Optimal number of PLS componentsPLSR
model in structToolbox will be used. For speed only 10
bootstrap iterations are used here.
-
+
# scale/transform training data
M = log_transform(base = 10) +
autoscale() +
@@ -1348,7 +1346,7 @@ PLS model evalutation
To evaluate the model for discriminant analysis in structToolbox the
PLSDA
model is appropriate.
-
+
# prepare the discriminant model
P = PLSDA(number_components = 2, factor_name='Class')
@@ -1367,7 +1365,7 @@ PLS model evalutation
plot_grid(g1,g2,g3,align='vh',axis='tblr',nrow=1, labels=c('A','B','C'))
-
+
@@ -1388,7 +1386,7 @@ Permutation testpermutation_test is an iterator object that can be combined
with other iterators and models.
-
+
# model sequence
MS = permutation_test(number_of_permutations = 20,factor_name = 'Class_num') *
kfold_xval(folds = 5,factor_name = 'Class_num') *
@@ -1410,7 +1408,7 @@ PLS projection plots
+
# prepare the discriminant model
P = PLSDA(number_components = 2, factor_name='Class')
@@ -1428,7 +1426,7 @@ PLS feature importance
-
+
# prepare chart
C = pls_vip_plot(ycol = 'HE')
g1 = chart_plot(C,P)
@@ -1476,7 +1474,7 @@ Dataset
+
# summary of DatasetExperiment object
DE
## A "DatasetExperiment" object
@@ -1491,7 +1489,7 @@ Dataset
+
# model sequence and pls model (NB data already centred)
MS = filter_smeta(mode = 'include', levels = c('GC','HE'), factor_name = 'Class') +
PLSDA(factor_name = 'Class',number_components = 2)
@@ -1503,7 +1501,7 @@ DatasetC = pls_scores_plot(factor_name = 'Class')
chart_plot(C,MS[2])
-
+
# new DatasetExperiment object from the PLS scores
DE2 = DatasetExperiment(
data = MS[2]$scores$data,
@@ -1529,7 +1527,7 @@ Basic SVM modelstructToolbox
the SVM
model can be used to
train and apply SVM models. A svm_plot_2d
chart object is
provided for visualisation of boundaries in two dimensions.
-
+
# SVM model
M = SVM(
factor_name = 'Class',
@@ -1554,7 +1552,7 @@ SVM cost function
+
# low cost
M$cost=0.01
M=model_apply(M,DE2)
@@ -1604,7 +1602,7 @@ Kernel functions
-
+
# set a fixed cost for this comparison
M$cost=1
@@ -1660,7 +1658,7 @@ Kernel functions
-
+
# rbf kernel and cost
M$kernel = 'radial'
M$cost = 1
@@ -1736,7 +1734,7 @@ LC-MS-based proteomics datasetgithub and must
be extracted from the zip file prior to data analysis.
-
+
# path to zip
zipfile = "https://raw.github.com/STATegraData/STATegraData/master/Script_STATegra_Proteomics.zip"
@@ -1756,7 +1754,7 @@ LC-MS-based proteomics dataset
+
# extract data matrix
data = all_data[1:2527,51:86]
# shorten sample names
@@ -1807,7 +1805,7 @@ LC-MS-based proteomics dataset## variable_meta: 2527 rows x 3 columns
A number of Reporter genes were included in the study. We plot two of
them here to illustrate some trends in the data.
-
+
# find id of reporters
Ldha = which(DS$variable_meta$Gene.names=='Ldha')
Hk2 = which(DS$variable_meta$Gene.names=='Hk2')
@@ -1827,7 +1825,7 @@ Data transformation
+
# prepare model sequence
M = log_transform(
base=2) +
@@ -1839,7 +1837,7 @@ Data transformation# get transformed data
DST = predicted(M)
The Reporter genes are plotted again for comparison.
-
+
# chart object
C = feature_boxplot(feature_to_plot=Ldha,factor_name='time',label_outliers=FALSE)
g1=chart_plot(C,DST)+ggtitle('Ldha')+ylab('log2(expression)')
@@ -1869,7 +1867,7 @@ Missing value filteringfilter_na_count
and
filter_by_name
objects are working together as a single
filter.
-
+
# build model sequence
M2 = filter_na_count(
threshold=2,
@@ -1904,7 +1902,7 @@ Missing value imputationset_struct_obj
in the global environment, and a
“method_apply” method that implements the imputation.
-
+
# create new imputation object
set_struct_obj(
class_name = 'STATegra_impute1',
@@ -1956,7 +1954,7 @@ Missing value imputation
-
+
# create new imputation object
set_struct_obj(
class_name = 'STATegra_impute2',
@@ -2022,7 +2020,7 @@ Missing value imputationstruct
object. A final filter is
added to remove any feature that has missing values after
imputation.
-
+
# model sequence
M3 = STATegra_impute1(factor_name='treatment',factor_sd='condition') +
STATegra_impute2(factor_name = 'condition') +
@@ -2054,7 +2052,7 @@ Exploratory analysisPCA is used to provide a graphical representation of the data. For
comparison with the outputs from STATegra a filter is included to reduce
the data to include only the treated samples (IKA)
-
+
# model sequence
P = filter_smeta(mode='include',factor_name='treatment',levels='IKA') +
mean_centre() +
@@ -2082,7 +2080,7 @@ LC-MS-based metabolomics datasetThe LC-MS-based metabolomics dataset from the STATegra multi-omics
dataset (see Introduction) can be found on github and must
be extracted from zip file prior to data analysis.
-
+
# path to zip
zipfile = "https://raw.github.com/STATegraData/STATegraData/master/Script_STATegra_Metabolomics.zip"
@@ -2103,7 +2101,7 @@ LC-MS-based metabolomics datasetThe imported data needs to be converted to
DatasetExperiment
format for use with
structToolbox
.
-
+
# extract sample meta data
SM = data[ ,1:8]
@@ -2166,7 +2164,7 @@ Data preprocessingGomez-Cabrero
et al. Some basic processing steps will be applied in order to
generate a valid PCA plot from the biological and QC samples.
-
+
# prepare model sequence
MS = filter_smeta(mode = 'include', levels='QC', factor_name = 'sample_type') +
knn_impute(neighbours=5) +
@@ -2183,7 +2181,7 @@ Exploratory analysis
First we will use PCA to look at the QC samples in order to make an
assessment of the data quality.
-
+
# pca model sequence
M = mean_centre() +
PCA(number_components = 3)
@@ -2201,7 +2199,7 @@ Exploratory analysis
-
+
# prepare model sequence
MS = filter_smeta(
mode = 'include',
@@ -2230,7 +2228,7 @@ Exploratory analysisMS = model_apply(MS, DE)
## Warning in knnimp(x, k, maxmiss = rowmax, maxp = maxp): 4 rows with more than 50 % entries missing;
## mean imputation used for these rows
-
+
# PCA scores plot
C = pca_scores_plot(factor_name = 'sample_type',label_factor = 'order',points_to_label = 'all')
# plot
@@ -2242,7 +2240,7 @@ Exploratory analysis
-
+
# prepare model sequence
MS = filter_smeta(
mode = 'exclude',
@@ -2278,7 +2276,7 @@ Exploratory analysisMS = model_apply(MS, DE)
## Warning in knnimp(x, k, maxmiss = rowmax, maxp = maxp): 2 rows with more than 50 % entries missing;
## mean imputation used for these rows
-
+
# PCA scores plots
C = pca_scores_plot(factor_name = 'sample_type')
# plot
@@ -2289,7 +2287,7 @@ Exploratory analysis
-
+
MS = filter_smeta(
mode = 'exclude',
levels = '12',
@@ -2380,7 +2378,7 @@ Exploratory analysis
-
+
# get the glog scaled data
GL = predicted(MS[11])
@@ -2411,10 +2409,10 @@ Exploratory analysis
Session Info
-
+
-## R version 4.3.2 (2023-10-31)
-## Platform: x86_64-pc-linux-gnu (64-bit)
+## R Under development (unstable) (2024-01-23 r85822)
+## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 22.04.3 LTS
##
## Matrix products: default
@@ -2422,10 +2420,12 @@ Session Info## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0
##
## locale:
-## [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
-## [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
-## [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
-## [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
+## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
+## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
+## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
+## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
+## [9] LC_ADDRESS=C LC_TELEPHONE=C
+## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## time zone: UTC
## tzcode source: system (glibc)
@@ -2435,69 +2435,69 @@ Session Info##
## other attached packages:
## [1] openxlsx_4.2.5.2 cowplot_1.1.3 gridExtra_2.3
-## [4] ggplot2_3.4.4 BiocFileCache_2.10.1 dbplyr_2.4.0
-## [7] ropls_1.34.0 pmp_1.14.0 structToolbox_1.15.1
-## [10] struct_1.14.0 BiocStyle_2.30.0
+## [4] ggplot2_3.4.4 BiocFileCache_2.11.1 dbplyr_2.4.0
+## [7] ropls_1.35.4 pmp_1.15.0 structToolbox_1.15.1
+## [10] struct_1.15.1 BiocStyle_2.31.0
##
## loaded via a namespace (and not attached):
## [1] DBI_1.2.1 bitops_1.0-7
-## [3] MultiDataSet_1.30.0 rlang_1.1.3
+## [3] MultiDataSet_1.31.0 rlang_1.1.3
## [5] magrittr_2.0.3 e1071_1.7-14
-## [7] matrixStats_1.2.0 compiler_4.3.2
+## [7] matrixStats_1.2.0 compiler_4.4.0
## [9] RSQLite_2.3.5 systemfonts_1.0.5
## [11] vctrs_0.6.5 reshape2_1.4.4
## [13] stringr_1.5.1 pkgconfig_2.0.3
## [15] crayon_1.5.2 fastmap_1.1.1
-## [17] XVector_0.42.0 labeling_0.4.3
+## [17] XVector_0.43.1 labeling_0.4.3
## [19] utf8_1.2.4 rmarkdown_2.25
## [21] itertools_0.1-3 ragg_1.2.7
## [23] bit_4.0.5 purrr_1.0.2
-## [25] xfun_0.41 MultiAssayExperiment_1.28.0
-## [27] randomForest_4.7-1.1 zlibbioc_1.48.0
-## [29] cachem_1.0.8 GenomeInfoDb_1.38.5
+## [25] xfun_0.41 MultiAssayExperiment_1.29.0
+## [27] randomForest_4.7-1.1 zlibbioc_1.49.0
+## [29] cachem_1.0.8 GenomeInfoDb_1.39.5
## [31] jsonlite_1.8.8 progress_1.2.3
## [33] blob_1.2.4 highr_0.10
-## [35] DelayedArray_0.28.0 prettyunits_1.2.0
-## [37] parallel_4.3.2 rols_2.30.0
+## [35] DelayedArray_0.29.0 prettyunits_1.2.0
+## [37] parallel_4.4.0 rols_2.31.0
## [39] R6_2.5.1 bslib_0.6.1
-## [41] stringi_1.8.3 limma_3.58.1
-## [43] GenomicRanges_1.54.1 jquerylib_0.1.4
+## [41] stringi_1.8.3 limma_3.59.1
+## [43] GenomicRanges_1.55.2 jquerylib_0.1.4
## [45] Rcpp_1.0.12 bookdown_0.37
-## [47] SummarizedExperiment_1.32.0 iterators_1.0.14
-## [49] knitr_1.45 IRanges_2.36.0
-## [51] Matrix_1.6-1.1 tidyselect_1.2.0
+## [47] SummarizedExperiment_1.33.3 iterators_1.0.14
+## [49] knitr_1.45 IRanges_2.37.1
+## [51] Matrix_1.6-5 tidyselect_1.2.0
## [53] abind_1.4-5 yaml_2.3.8
## [55] codetools_0.2-19 curl_5.2.0
-## [57] doRNG_1.8.6 lattice_0.21-9
+## [57] doRNG_1.8.6 lattice_0.22-5
## [59] tibble_3.2.1 plyr_1.8.9
-## [61] withr_3.0.0 Biobase_2.62.0
+## [61] withr_3.0.0 Biobase_2.63.0
## [63] evaluate_0.23 ontologyIndex_2.11
## [65] desc_1.4.3 isoband_0.2.7
## [67] proxy_0.4-27 zip_2.3.1
## [69] filelock_1.0.3 pillar_1.9.0
-## [71] BiocManager_1.30.22 MatrixGenerics_1.14.0
+## [71] BiocManager_1.30.22 MatrixGenerics_1.15.0
## [73] rngtools_1.5.2 foreach_1.5.2
-## [75] stats4_4.3.2 generics_0.1.3
-## [77] sp_2.1-2 RCurl_1.98-1.14
-## [79] hms_1.1.3 S4Vectors_0.40.2
+## [75] stats4_4.4.0 generics_0.1.3
+## [77] sp_2.1-3 RCurl_1.98-1.14
+## [79] hms_1.1.3 S4Vectors_0.41.3
## [81] munsell_0.5.0 scales_1.3.0
## [83] calibrate_1.7.7 class_7.3-22
-## [85] glue_1.7.0 tools_4.3.2
-## [87] fs_1.6.3 grid_4.3.2
-## [89] impute_1.76.0 missForest_1.5
+## [85] glue_1.7.0 tools_4.4.0
+## [87] fs_1.6.3 grid_4.4.0
+## [89] impute_1.77.0 missForest_1.5
## [91] colorspace_2.1-0 GenomeInfoDbData_1.2.11
## [93] cli_3.6.2 textshaping_0.3.7
## [95] fansi_1.0.6 viridisLite_0.4.2
-## [97] ggthemes_5.0.0 S4Arrays_1.2.0
+## [97] ggthemes_5.0.0 S4Arrays_1.3.2
## [99] dplyr_1.1.4 pls_2.8-3
-## [101] pcaMethods_1.94.0 gtable_0.3.4
+## [101] pcaMethods_1.95.0 gtable_0.3.4
## [103] sass_0.4.8 digest_0.6.34
-## [105] BiocGenerics_0.48.1 SparseArray_1.2.3
+## [105] BiocGenerics_0.49.1 SparseArray_1.3.3
## [107] farver_2.1.1 memoise_2.0.1
-## [109] htmltools_0.5.7 pkgdown_2.0.7
+## [109] htmltools_0.5.7 pkgdown_2.0.7.9000
## [111] lifecycle_1.0.4 httr_1.4.7
## [113] statmod_1.5.0 bit64_4.0.5
-## [115] qqman_0.1.9 MASS_7.3-60
+## [115] qqman_0.1.9 MASS_7.3-60.2
@@ -2512,7 +2512,7 @@ Session Info
-Site built with pkgdown 2.0.7.
+Site built with pkgdown 2.0.7.9000.
diff --git a/articles/data_analysis_omics_using_the_structtoolbox_files/figure-html/unnamed-chunk-16-1.png b/articles/data_analysis_omics_using_the_structtoolbox_files/figure-html/unnamed-chunk-16-1.png
index 528d7d005febe8175ee4aebcddf53107a75b89e6..96655f94661a2afba9e917759d1d73c704e71b0b 100644
GIT binary patch
literal 56753
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